OleDB更新命令不更改数据

时间:2015-06-04 15:56:04

标签: c# asp.net oledb oledbcommand

我使用Microsoft Access文件作为数据库。我对SELECTINSERT查询没有任何问题,但是当我尝试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 个答案:

答案 0 :(得分:0)

我会转到Microsoft Access并在那里输入命令,看看会发生什么。它应该告诉你有多少行受到影响。如果它表示零行,则将查询分​​成更小的部分,例如:

选择*其中[ID] =值

然后你应该能够找到问题所在。

答案 1 :(得分:0)

我知道这不是一个确切的答案,但是使用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;
    }
}

答案 2 :(得分:0)

我可能错了,但是从我记忆中来看,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值没有歧义。但总的来说,我认为它可以通过使用"?"作为参数占位符。