【问题标题】:how to update a table using oledb parameters?如何使用 oledb 参数更新表?
【发布时间】:2010-04-20 13:51:04
【问题描述】:

我有一个包含三个字段的表,即 LM_code、M_Name、Desc。 LC_code 是一个自动生成的字符串 ID,我正在更新 M_Name 和 Desc。我使用了正常的更新命令,该值在运行时传递,但字段没有得到更新。我希望使用 oledb 参数可以更新字段。

这是我的代码。

public void Modify()
{
    String query = "Update Master_Accounts set (M_Name='" + M_Name + "',Desc='" + Desc + "') where LM_code='" + LM_code + "'";
    DataManager.RunExecuteNonQuery(ConnectionString.Constr, query);
}

在 DataManager 类中,我正在执行查询字符串。

public static void RunExecuteNonQuery(string Constr, string query)
{

    OleDbConnection myConnection = new OleDbConnection(Constr);
    try
    {
        myConnection.Open();
        OleDbCommand myCommand = new OleDbCommand(query, myConnection);
        myCommand.ExecuteNonQuery();
    }
    catch (Exception ex)
    {
        string Message = ex.Message;
        throw ex;
    }

    finally
    {
        if (myConnection.State == ConnectionState.Open)
            myConnection.Close();
    }

}

private void toolstModify_Click_1(object sender, EventArgs e)
{
    txtamcode.Enabled = true;
    jewellery.LM_code = txtamcode.Text;
    jewellery.M_Name = txtaccname.Text;
    jewellery.Desc = txtdesc.Text;
    jewellery.Modify();
    MessageBox.Show("Data Updated Succesfully");

}

【问题讨论】:

    标签: c# oledb


    【解决方案1】:

    这让我很恼火,古怪的小 OleDB,所以我将在这里发布我的解决方案以供后代使用。这是一个旧帖子,但似乎是个好地方。

    OleDB 不识别命名参数,但它显然可以识别您正在尝试传达命名参数,因此您可以利用它来发挥自己的优势,并使您的 SQL 语义化并且更容易理解。只要它们以相同的顺序传递,它就会接受一个变量作为命名参数。

    我用它来更新网络文件夹中的简单 Access 数据库。

     using (OleDbConnection conn = new OleDbConnection(connString))
     {
           conn.Open();
           OleDbCommand cmd = conn.CreateCommand();
    
           for (int i = 0; i < Customers.Count; i++)
           {
                cmd.Parameters.Add(new OleDbParameter("@var1", Customer[i].Name))
                cmd.Parameters.Add(new OleDbParameter("@var2", Customer[i].PhoneNum))
                cmd.Parameters.Add(new OleDbParameter("@var3", Customer[i].ID))
                cmd.Parameters.Add(new OleDbParameter("@var4", Customer[i].Name))
                cmd.Parameters.Add(new OleDbParameter("@var5", Customer[i].PhoneNum))
    
                cmd.CommandText = "UPDATE Customers SET Name=@var1, Phone=@var2" + 
                                  "WHERE ID=@var3 AND (Name<>@var4 OR Phone<>@var5)";
                cmd.ExecuteNonQuery();
                cmd.Parameters.Clear();
           }
     }
    

    它可能看起来像是多余的代码,是的,你在技术上重复自己,但这让你以后玩连接点时变得更容易.....

    【讨论】:

    • 很确定你刚刚为我节省了一个小时...试图弄清楚为什么我的更新语句不起作用...
    【解决方案2】:

    您已与其余连接等接近,但正如您所指出的,使用参数化查询执行此操作比 SQL 注入更安全...

        // Some engines used named parameters, others may not... The "?"
        // are "place-holders" for the ordinal position of parameters being added...
        String MyQuery = "Update MyTable set SomeField = ?, AnotherField = ? "
            + " where YourKeyField = ?";
    
        OleDbCommand MyUpdate = new OleDbCommand( MyQuery, YourConnection );
    
       // Now, add the parameters in the same order as the "place-holders" are in above command
       OleDbParameter NewParm = new OleDbParameter( "ParmForSomeField", NewValueForSomeField );
       NewParm.DbType = DbType.Int32;   
       // (or other data type, such as DbType.String, DbType.DateTime, etc)
       MyUpdate.Parameters.Add( NewParm );
    
       // Now, on to the next set of parameters...
       NewParm = new OleDbParameter( "ParmForAnotherField", NewValueForAnotherField );
       NewParm.DbType = DbType.String;   
       MyUpdate.Parameters.Add( NewParm );
    
       // finally the last one...
       NewParm = new OleDbParameter( "ParmForYourKeyField", CurrentKeyValue );
       NewParm.DbType = DbType.Int32;   
       MyUpdate.Parameters.Add( NewParm );
    
    
    
      // Now, you can do you 
      MyUpdate.ExecuteNonQuery();
    

    【讨论】:

      【解决方案3】:

      只是为了补充 RJB 的答案,OleDb 实际上确实接受命名参数是一个鲜为人知的事实。您还必须在 SQL 中声明参数。

      见:low-bandwidth.blogspot.com.au/2013/12/positional-msaccess-oledb-parameters.html

      如果你不在 SQL 中声明参数,OleDb 使用纯粹的位置参数插入,并且参数名称是否与 SQL 匹配,或者参数是否在 SQL 中使用两次都没关系 - 它只会遍历并盲目地将 SQL 中找到的任何参数按从头到尾的顺序替换为传递的参数。

      但是,如果您正确声明了参数,您将受益于命名参数和允许在 SQL 语句中重复多次的参数。

      【讨论】:

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