将datatable的内容更新到SQL表中

3
我正在使用C#在WPF中创建一个应用程序,用户可以填充datagrid,信息随后将存储在名为smb1的DataTable中。以下代码可用于将数据插入SQL数据库,但是当我修改代码进行更新时,它不起作用。有谁知道如何修改我的代码以允许更新?运行Visual Studio应用程序时没有抛出任何错误。我必须补充说明的是,设备列无法在datagrid中编辑,因此返回的数据与从数据库获取的数据相同,因此使用WHERE子句将更新后的行与SQL数据库中的设备行匹配。下面是原始插入代码以及我尝试更新数据库的代码。

插入代码

SqlConnection con = new SqlConnection(MyConnectionString);
string SqlCmdText = "Insert into SHIFTLOG Values(@EQUIPMENT,@BATCHNO,@PRODUCTNO,@STATUS,@DATE,@PERIOD,@MACHINE)";
SqlCommand sc = new SqlCommand(SqlCmdText, con);
con.Open();
foreach (DataRow row in smb1.Rows)
{
    sc.Parameters.Clear();
    sc.Parameters.AddWithValue("@EQUIPMENT", row["EQUIPMENT"]);
    sc.Parameters.AddWithValue("@BATCHNO", row["BATCHNO"]);
    sc.Parameters.AddWithValue("@PRODUCTNO", row["PRODUCTNO"]);
    sc.Parameters.AddWithValue("@STATUS", row["STATUS"]);
    sc.Parameters.AddWithValue("@DATE", DateTime.Now.ToString("yyyy-MM-dd"));
    sc.Parameters.AddWithValue("@PERIOD", DateTime.Now.ToString("tt"));
    sc.Parameters.AddWithValue("@MACHINE", "SMB1");

    sc.ExecuteNonQuery();
}
con.Close();

尝试更新代码

SqlConnection con = new SqlConnection(MyConnectionString);
string SqlCmdText = "UPDATE SHIFTLOG SET EQUIPMENT='@EQUIPMENT',BATCHNO='@BATCHNO',PRODUCTNO='@PRODUCTNO',STATUS='@STATUS',DATE='2013-09-12',PERIOD='@PERIOD',MACHINE='@MACHINE' WHERE EQUIPMENT='@EQUIPMENT'";
SqlCommand sc = new SqlCommand(SqlCmdText, con);
con.Open();
foreach (DataRow row in smb1.Rows)
{
    sc.Parameters.Clear();
    sc.Parameters.AddWithValue("@EQUIPMENT", row["EQUIPMENT"]);
    sc.Parameters.AddWithValue("@BATCHNO", row["BATCHNO"]);
    sc.Parameters.AddWithValue("@PRODUCTNO", row["PRODUCTNO"]);
    sc.Parameters.AddWithValue("@STATUS", row["STATUS"]);                
    sc.Parameters.AddWithValue("@PERIOD", DateTime.Now.ToString("tt"));
    sc.Parameters.AddWithValue("@MACHINE", row["MACHINE"]);

    sc.ExecuteNonQuery();
}
con.Close();

感谢您的帮助。
谢谢。
2个回答

5

移除参数周围的单引号。

string SqlCmdText = "UPDATE SHIFTLOG SET EQUIPMENT=@EQUIPMENT,BATCHNO=@BATCHNO,PRODUCTNO=@PRODUCTNO,STATUS=@STATUS,DATE='2013-09-12',PERIOD=@PERIOD,MACHINE=@MACHINE WHERE EQUIPMENT=@EQUIPMENT";

此外,我认为EQUIPMENT=@EQUIPMENT的更新部分是多余的,因为如果更改了where子句,它将不正确。所以你可以使用:
string SqlCmdText = "UPDATE SHIFTLOG SET BATCHNO=@BATCHNO,PRODUCTNO=@PRODUCTNO,STATUS=@STATUS,DATE='2013-09-12',PERIOD=@PERIOD,MACHINE=@MACHINE WHERE EQUIPMENT=@EQUIPMENT";

@astander&Damith。当比较这两个示例时,我简直不敢相信我从未注意到那个问题!非常感谢你们的帮助! - Callum A Macleod

3

在您的SQL语句中,删除所有参数中的''

"UPDATE SHIFTLOG SET BATCHNO=@BATCHNO,....... WHERE EQUIPMENT=@EQUIPMENT

如果您使用引号,所有参数都将作为字符串值而不是SQL参数进行处理。如果这些参数是保留关键字,您还需要使用带有[]的列,例如[DATE]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接