【问题标题】:OleDB update command not changing dataOleDB 更新命令不更改数据
【发布时间】:2015-06-04 15:56:04
【问题描述】:

我使用 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();
    }

【问题讨论】:

  • 您是否验证过 Request["id"].ToString() 为您提供了正确的 ID?
  • Request["id"] 是否包含参数@id_wpis 的值,您的更新是否在数据库中正确执行?
  • @BrianDishaw @rageit 是的,Request["id"] 包含正确的值并且没有错误。
  • Request["id"] 的值是否存在于Wipsy 表中?
  • @rageit 是的。我使用 GET 方法在 URL 中传递id=10。在Wpisy 表中,我在ID 列中记录了该值

标签: c# asp.net oledb oledbcommand


【解决方案1】:

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

选择 * 其中 [ID]=值

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我可能是错的,但据我记得,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... 您设置的参数值没有歧义。但总的来说,我确实认为它可以通过使用“?”来工作。作为参数占位符。

      【讨论】:

        猜你喜欢
        • 2016-04-21
        • 2015-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多