Команда обновления OleDB не изменяет данные
Я использую файл Microsoft Access в качестве базы данных. У меня нет проблем с SELECT
а также INSERT
запросы, но когда я пытаюсь UPDATE
, запись в базе данных не меняется.
Ниже приведен код, который я использую для запуска обновления. В журнале отладки нет исключений или ошибок.
cnn = new OleDbConnection(connetionString);
OleDbCommand command = new OleDbCommand("UPDATE [Wpisy] SET [wpis]=@wpis, [id_kat]=@id_kat, [tytul]=@tytul WHERE [ID]=@id_wpis" , cnn);
command.Parameters.Add(new OleDbParameter("@wpis", tresc_wpisu.Text));
command.Parameters.Add(new OleDbParameter("@id_kat", lista_kategorii.SelectedValue));
command.Parameters.Add(new OleDbParameter("@tytul", tytul_wpisu.Text));
command.Parameters.Add(new OleDbParameter("@id_wpis", Request["id"].ToString() ));
command.Connection = cnn;
try
{
if(cnn.State.ToString() != "Open")
cnn.Open();
command.ExecuteNonQuery();
cnn.Close();
}
catch (OleDbException ex)
{
Response.Clear();
Response.Write(ex);
Response.End();
}
3 ответа
Я бы пошел в Microsoft Access и ввел там команду и посмотрел, что происходит. Он должен сказать вам, сколько строк было затронуто. Если в нем указано ноль строк, разбейте ваш запрос на более мелкие части, например:
выберите * где [ID]= значение
И тогда вы сможете отследить, где проблема.
Я могу ошибаться, но насколько я помню, OleDB не разрешает именованные параметры, а вместо этого использует "?" в качестве заполнителя, и параметры должны быть добавлены в той же последовательности, как они появляются в операторе SQL. такие как
String updateSql = "UPDATE [Wpisy] SET [wpis]=?, [id_kat]=?, [tytul]=? WHERE [ID]=?";
command.Parameters.Add(new OleDbParameter("parm_wpis", OleDbType.VarChar, obj.tresc_wpisu));
command.Parameters.Add(new OleDbParameter("parm_id_kat", OleDbType.VarChar, obj.lista_kategorii));
command.Parameters.Add(new OleDbParameter("parm_tytul", OleDbType.VarChar, obj.tytul_wpisu));
command.Parameters.Add(new OleDbParameter("parm_id_wpis", OleDbType.Integer, obj.id.ToString()));
Наименование параметров просто для пояснения, чтобы знать, что есть что. Еще одна проблема может заключаться в том, что вы назвали параметры тем же именем, что и обновляемый столбец, и это могло быть проблемой почти как константа...
установите X = X вместо того, чтобы теперь устанавливать X = parmX... нет никакой двусмысленности, если вы устанавливаете значение применяемого параметра PARAMETER. Но в целом, я думаю, что это будет работать через "?" в качестве параметра-заполнителя.
Я знаю, что это не точный ответ, но есть некоторые странности в работе с MS Access.
Вот пример метода для вас с некоторой правильной обработкой исключений для баз данных. За Object
, создайте класс, который представляет поля строки в вашей таблице. я использую Exception ex
вместо исключения из библиотеки БД, так как я использую DataReaders
для выбора.
private String connectionString = "someOleDbConnectionString";
public String UpdateObject(Object obj)
{
OleDbConnection connection = GetMyOleDbConnection(); //returns new OleDbConnection with proper connection string
String updateSql = "UPDATE [Wpisy] SET [wpis]=@wpis, [id_kat]=@id_kat, [tytul]=@tytul WHERE [ID]=@id_wpis";
OleDbCommand command = new OleDbCommand(updateSql, connection);
command.CommandType = System.Data.CommandType.Text; //this can be changed if you have stored procedures in your db.
//you may have to define the OleDbType of the parameter being defined
command.Parameters.Add(new OleDbParameter("@wpis", OleDbType.VarChar, obj.tresc_wpisu));
command.Parameters.Add(new OleDbParameter("@id_kat", OleDbType.VarChar, obj.lista_kategorii));
command.Parameters.Add(new OleDbParameter("@tytul", OleDbType.VarChar, obj.tytul_wpisu));
command.Parameters.Add(new OleDbParameter("@id_wpis", OleDbType.Integer, obj.id.ToString()));
return Execute(connection, command);
}
private OleDbConnection GetMyOleDbConnection()
{
return new OleDbConnection(connectionString);
}
private String Execute(OleDbConnection connection, OleDbCommand command)
{
try
{
connection.Open();
command.ExecuteNonQuery();
//I also know with Access databases,
//sometimes you have to close the table if it is open in MS Access
connection.Close();
return "SUCCESS";
}
catch (Exception ex)
{
connection.Close(); //important or you will have left open connections
Response.Clear();
Response.Write(ex.Message);
Response.End();
return ex.Message;
}
}