如何使用oledb参数更新表?

时间:2010-04-20 13:51:04

标签: c# oledb

我有一个包含三个字段的表,即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 Class中,我正在执行查询字符串。

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");

}

3 个答案:

答案 0 :(得分:17)

这让我恼火,小小的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();
       }
 }

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

答案 1 :(得分:5)

您与其他连接很接近,但是正如您所注意到的那样,使用参数化查询进行操作比使用SQL-Injection更安全......

    // 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();

答案 2 :(得分:0)

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

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

如果你不在SQL中声明参数,OleDb使用纯粹的位置参数插入,如果参数的名称与SQL匹配,或者如果参数在SQL中使用两次并不重要 - 它只会按顺序从头到尾盲目地替换SQL中任何找到的参数,并传递那些参数。

但是,如果您正确地声明参数,您将获得允许在SQL语句中多次重复的命名参数和参数的好处。