Команда обновления 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;
    }
}
Другие вопросы по тегам