Команда обновления 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();
    }

person Forien    schedule 04.06.2015    source источник
comment
Вы убедились, что Request[id].ToString() дает вам правильный идентификатор?   -  person Brian Dishaw    schedule 04.06.2015
comment
Содержит ли Request["id"] значение для параметра @id_wpis и правильно ли выполняется ваше обновление в базе данных?   -  person rageit    schedule 04.06.2015
comment
@BrianDishaw @rageit да, Request["id"] содержит правильное значение и ошибки нет.   -  person Forien    schedule 04.06.2015
comment
Существует ли значение Request["id"] в таблице Wipsy?   -  person rageit    schedule 04.06.2015
comment
@rageit да, это так. Я использовал метод GET для передачи id=10 в URL. в таблице Wpisy у меня есть запись с этим значением в столбце ID   -  person Forien    schedule 04.06.2015
comment
mikesdotnetting.com/article/26/   -  person rageit    schedule 04.06.2015


Ответы (3)


Я бы зашел в Microsoft Access, ввел бы там команду и посмотрел, что произойдет. Он должен сказать вам, сколько строк было затронуто. Если он говорит, что нет строк, разбейте запрос на более мелкие части, например:

выберите *, где [ID]=значение

И тогда вы сможете отследить, где проблема.

person BenV136    schedule 04.06.2015

Я знаю, что это не точный ответ, но есть некоторые особенности работы с MS Access.

Вот пример метода с правильной обработкой исключений для баз данных. Для Object создайте класс, представляющий поля строк в вашей таблице. Я использую Exception ex вместо исключения библиотеки db, так как я использую 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;
    }
}
person Andrew Grinder    schedule 04.06.2015

Я могу ошибаться, но насколько я помню, 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. Но в целом, я думаю, что это будет работать с использованием "?" в качестве заполнителя параметра.

person DRapp    schedule 04.06.2015