private void LoadDataSourceCommandsFromFile(string configFileName) 
		{
			Hashtable commands = new Hashtable();

			XmlTextReader xr = new XmlTextReader(configFileName);

			xr.WhitespaceHandling = WhitespaceHandling.None;
			xr.MoveToContent();

			DataCommand currentDataCommand = null;
			IDbCommand currentDbCommand = null;
			bool isCommandTextCurrentNode = false;
				
			while(xr.Read())
			{
				switch(xr.NodeType) 
				{
					case XmlNodeType.Element:
					switch(xr.Name) 
					{
						case "dataCommand":
							//instantiate the command
							string commandName = xr.GetAttribute("name");

							currentDbCommand = 
								(IDbCommand)Activator.CreateInstance(_provider.CommandObjectType);

							string strCommandType = xr.GetAttribute("type");
							CommandType commandType = 
								(CommandType)Enum.Parse(typeof(CommandType), strCommandType , true);
							currentDbCommand.CommandType = commandType;

							currentDataCommand = new DataCommand(commandName, currentDbCommand, _dataSource);
							commands.Add(commandName, currentDataCommand);
							break;

						case "commandText":
							isCommandTextCurrentNode = true;
							break;

						case "param":
							IDbDataParameter param = currentDbCommand.CreateParameter();
							param.ParameterName = xr.GetAttribute("name");
							string strParamType = xr.GetAttribute("type");
							_provider.ParameterDbTypeProperty.SetValue(
								param, Enum.Parse(_provider.ParameterDbType, strParamType, true), null);
							string size = xr.GetAttribute("size");
							if(size != null)
								param.Size = Int32.Parse(xr.GetAttribute("size"));
							param.Direction = 
								(ParameterDirection)Enum.Parse(typeof(ParameterDirection), xr.GetAttribute("direction"));
							currentDbCommand.Parameters.Add(param);
							break;
					}
						break;

					case XmlNodeType.Text:
						if(isCommandTextCurrentNode) 
						{
							currentDbCommand.CommandText = xr.Value;
						}
						break;

					case XmlNodeType.EndElement:
					switch(xr.Name) 
					{
						case "commandText":
							isCommandTextCurrentNode = false;
							break;
					}
						break;
				}
			}
			xr.Close();
			
			foreach(DictionaryEntry entry in commands)
			{
				_commands[entry.Key] = entry.Value;
			}
		}
        private DataCommand CreateCommand(CommandType commandType, string commandText)
        {
            //TODO: decide whether to delegate or do it here

            //IDbCommand dbCmd = (IDbCommand)Activator.CreateInstance(_provider.CommandObjectType);
            IDbCommand dbCmd = (IDbCommand)((ICloneable)_templateCommand).Clone();
            dbCmd.CommandText = commandText;
            dbCmd.CommandType = commandType;

            DataCommand cmd = new DataCommand("", dbCmd, this);

            return cmd;
        }