Re: Update не работает
От: Wile  
Дата: 15.02.04 23:44
Оценка: 42 (1)
Прошу прощения, может я не так чего делаю, но похоже, что такая конструкция


using (DbManager db = new DbManager())
{
    db
        .SetInsertCommand("INSERT statement")
        .SetUpdateCommand("UPDATE statement")
        .SetDeleteCommand("DELETE statement")
        .Update(dataSet);
}


не работает ...

Я так думаю по следующей причине:

Методы
SetInsertCommand(), SetUpdateCommand(), SetDeleteCommand()

Вызывают следующую цепочку методов:


        private IDbCommand PrepareCommand(
            CommandAction      commandAction,
            CommandType        commandType,
            string             commandText,
            IDbDataParameter[] commandParameters)
        {
            try
            {
                IDbCommand command = GetCommand(commandType, commandText);

            .............



        private IDbCommand GetCommand(CommandType commandType, string sql)
        {
            IDbCommand command = Command;
            
            .............


        public IDbCommand Command
        {
            [System.Diagnostics.DebuggerStepThrough]
            get { return SelectCommand; }

            .............


        public IDbCommand SelectCommand
        {
            [System.Diagnostics.DebuggerStepThrough]
            get { return _selectCommand = InitCommand(_selectCommand); }


            .............


        private IDbCommand InitCommand(IDbCommand command)
        {
            try
            {
                IDbCommand cmd = command;

                if (cmd == null) 
                {
                    // Create a command object.
                    //
                    cmd = Connection.CreateCommand();



Так вот, условие if (cmd == null) срабатывает ОДИН раз (вместо трех для каждой команды).
В результате _selectCommand, _insertCommand, _updateCommand и _deleteCommand смотрят на один и тот же объект.
Проблема решилась обнулением _selectCommand:


    private IDbCommand GetCommand(CommandType commandType, string sql)
        {
            _selectCommand = null;
            IDbCommand command = Command;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.