Не работает Update для таблицы MDB
От: Ramzesito Россия  
Дата: 10.02.10 07:43
Оценка:
Простейшая ситуация: таблица в MDB (customerid, customername), класс с методами обновления, вставки, удаления записей. Запросы осуществляются в коде методов с использованием OleDb.
Почему-то не работает Update с параметрами:

public void UpdateCustomer(int cId, string cName)
        {
            OleDbConnection sqlConn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\my.mdb");

            String sqlText = "update customers set customername = @customername where (customerid = @customerid)";
            OleDbCommand sqlCmd = new OleDbCommand(sqlText, sqlConn);
            sqlCmd.CommandType = System.Data.CommandType.Text;
            sqlCmd.Parameters.Add(new OleDbParameter("@customerid", OleDbType.Integer));
            sqlCmd.Parameters["@customerid"].Value = cId;
            sqlCmd.Parameters.Add(new OleDbParameter("@customername", OleDbType.VarChar, 50));
            sqlCmd.Parameters["@customername"].Value = cName;

            try
            {
                sqlConn.Open();
                object o = sqlCmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw new Exception("ошибка метода CustomerDB.UpdateCustomer(...): " + ex.Message);
            }
            finally
            {
                sqlConn.Close();
            }
        }


Исключения не возникает, просто ничего не происходит.
Если прописать так:
String sqlText = "update customers set customername = 'new_name' where (customerid = @customerid)";

то сработает, видимо проблема скрыта в параметре, но почему? неверно указан тип? менял и тип и название параметра — не помогло

вставка, удаление работают (с параметрами)
Re: Не работает Update для таблицы MDB
От: sto Украина http://overstore.codeplex.com
Дата: 10.02.10 09:21
Оценка:
Здравствуйте, Ramzesito, Вы писали:

R>Простейшая ситуация: таблица в MDB (customerid, customername), класс с методами обновления, вставки, удаления записей. Запросы осуществляются в коде методов с использованием OleDb.

R>Почему-то не работает Update с параметрами:

R>
R>public void UpdateCustomer(int cId, string cName)
R>        {
R>            OleDbConnection sqlConn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\my.mdb");

R>            String sqlText = "update customers set customername = @customername where (customerid = @customerid)";
R>            OleDbCommand sqlCmd = new OleDbCommand(sqlText, sqlConn);
R>            sqlCmd.CommandType = System.Data.CommandType.Text;
R>            sqlCmd.Parameters.Add(new OleDbParameter("@customername", OleDbType.VarChar, 50));
R>            sqlCmd.Parameters["@customername"].Value = cName;
R>            sqlCmd.Parameters.Add(new OleDbParameter("@customerid", OleDbType.Integer));
R>            sqlCmd.Parameters["@customerid"].Value = cId;


R>            try
R>            {
R>                sqlConn.Open();
R>                object o = sqlCmd.ExecuteNonQuery();
R>            }
R>            catch (Exception ex)
R>            {
R>                throw new Exception("ошибка метода CustomerDB.UpdateCustomer(...): " + ex.Message);
R>            }
R>            finally
R>            {
R>                sqlConn.Close();
R>            }
R>        }
R>

Вроде OleDb провайдер использует вопросительные знаки ? для указания позиции параметров, и не поддерживает именованные параметры.
Однако, если у вас работает какие-то запросы с параметрами, то попробуйте в вашем запросе добавлять параметры и значения в последовательности, в которой они встречаются в запросе (поправил в цитате выше).
There is no such thing as the perfect design.
Re: Не работает Update для таблицы MDB
От: AlexGin Беларусь  
Дата: 10.02.10 12:37
Оценка:
Здравствуйте, Ramzesito, Вы писали:

R>Простейшая ситуация: таблица в MDB (customerid, customername), класс с методами обновления, вставки, удаления записей. Запросы осуществляются в коде методов с использованием OleDb.

R>Почему-то не работает Update с параметрами:

R>
R>public void UpdateCustomer(int cId, string cName)
R>        {
R>            OleDbConnection sqlConn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\my.mdb");

R>            String sqlText = "update customers set customername = @customername where (customerid = @customerid)";
R>            OleDbCommand sqlCmd = new OleDbCommand(sqlText, sqlConn);
R>            sqlCmd.CommandType = System.Data.CommandType.Text;
R>            sqlCmd.Parameters.Add(new OleDbParameter("@customerid", OleDbType.Integer));
R>            sqlCmd.Parameters["@customerid"].Value = cId;
R>            sqlCmd.Parameters.Add(new OleDbParameter("@customername", OleDbType.VarChar, 50));
R>            sqlCmd.Parameters["@customername"].Value = cName;

R>            try
R>            {
R>                sqlConn.Open();
R>                object o = sqlCmd.ExecuteNonQuery();
R>            }
R>            catch (Exception ex)
R>            {
R>                throw new Exception("ошибка метода CustomerDB.UpdateCustomer(...): " + ex.Message);
R>            }
R>            finally
R>            {
R>                sqlConn.Close();
R>            }
R>        }
R>


R>Исключения не возникает, просто ничего не происходит.

R>Если прописать так:
R>
R>String sqlText = "update customers set customername = 'new_name' where (customerid = @customerid)";
R>

R>то сработает, видимо проблема скрыта в параметре, но почему? неверно указан тип? менял и тип и название параметра — не помогло

R>вставка, удаление работают (с параметрами)


Хотя согласно MSDN не стоит применять именованные параметры в OleDbCommand:


The OLE DB .NET Provider does not support named parameters for passing parameters to an SQL statement or a stored procedure called by an OleDbCommand when CommandType is set to Text. In this case, the question mark (?) placeholder must be used. For example:

SELECT * FROM Customers WHERE CustomerID = ?

Therefore, the order in which OleDbParameter objects are added to the OleDbParameterCollection must directly correspond to the position of the question mark placeholder for the parameter in the command text.


На практике я часто применяю именованные параметры в экземплярах OleDbCommand.
При добавлении параметров sqlCmd.Parameters.Add следует соблюдать тот же самый порядок следования, что был в тексте SQL запроса.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.