C# SQL更新不工作,未引发任何错误
我正在Visual studio windows窗体中编写一个程序,我的SQL UPDATEstatement无法工作,并且没有引发任何错误。这是我的密码:C# SQL更新不工作,未引发任何错误,c#,sql,sql-server,C#,Sql,Sql Server,我正在Visual studio windows窗体中编写一个程序,我的SQL UPDATEstatement无法工作,并且没有引发任何错误。这是我的密码: string strConnection = ConfigurationManager.ConnectionStrings ["Brownie.Properties.Settings.BrownieDB2ConnectionString"].ConnectionString; SqlConnectio
string strConnection = ConfigurationManager.ConnectionStrings
["Brownie.Properties.Settings.BrownieDB2ConnectionString"].ConnectionString;
SqlConnection sqlconnect = new SqlConnection(strConnection);
string strSQL = "UPDATE Cargo SET Jobdone = 'Yes' WHERE (DriverID IN (SELECT DriverID FROM Driver WHERE (CardID = @a)))";
SqlCommand cmd = new SqlCommand(strSQL, sqlconnect);
cmd.Parameters.AddWithValue("@a", momentcardid);
try
{
//step 3: open connection
sqlconnect.Open();
//step 4: execute command
int result = cmd.ExecuteNonQuery();
if (result > 0)
MessageBox.Show("Job has been successfully updated");
else
MessageBox.Show("Job update is unsuccessful");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
//step 5: close connection
sqlconnect.Close();
}
我在VisualStudio提供的查询测试功能上测试了这段代码,该功能位于服务器资源管理器的“右键单击数据库>右键单击表名>新建查询”下,将值momentcardid放置在测试中,它能够成功地更新到数据库中
但是,当我尝试在winform上运行代码时,它不会更新到数据库中。也没有抛出错误。它甚至会显示“作业已成功更新”消息框
我真的不知道怎么了,希望有人能帮我弄清楚 这里可能发生两件事: @a和cardd的值根本不匹配,因为它们与您期望的不完全一致;常见原因: 区分大小写 空白 固定宽度字符/nchar与动态宽度varchar/nvarchar 不可见字符两个值之一的unicode字符或转义字符 根本没有与该值匹配的数据! 它正在工作,但你找错地方了 这在使用基于文件的数据库而不是专用服务器时很常见-您需要确保经常查看executing文件夹/bin/debug等中的数据库文件,而不是源文件夹 要确定是哪个,可以添加select@@rowcount;在update语句之后,使用var rowsUpdated=cmd.ExecuteScalar。通过读取此值,可以查看更新了多少行。如果为零,则第一个项目符号适用;如果它不是零,则第二个项目符号适用
假设它是第一个项目符号,您需要非常仔细地查看momentcardid的值,包括任何空格和隐藏字符。momentcardid.Length是一个很好的起点,但momentcardid.ToCharray将是下一步,仔细查看每个字符这里可能发生两件事: @a和cardd的值根本不匹配,因为它们与您期望的不完全一致;常见原因: 区分大小写 空白 固定宽度字符/nchar与动态宽度varchar/nvarchar 不可见字符两个值之一的unicode字符或转义字符 根本没有与该值匹配的数据! 它正在工作,但你找错地方了 这在使用基于文件的数据库而不是专用服务器时很常见-您需要确保经常查看executing文件夹/bin/debug等中的数据库文件,而不是源文件夹 要确定是哪个,可以添加select@@rowcount;在update语句之后,使用var rowsUpdated=cmd.ExecuteScalar。通过读取此值,可以查看更新了多少行。如果为零,则第一个项目符号适用;如果它不是零,则第二个项目符号适用
假设它是第一个项目符号,您需要非常仔细地查看momentcardid的值,包括任何空格和隐藏字符。momentcardid.Length是一个很好的起点,但momentcardid.ToCharArray将是下一步,并仔细查看每个字符尝试在WHERE之后删除,如下所示:WHERE DriverID IN SELECT DriverID FROM Driver WHERE CardID=@a@un-幸运的是,这不会改变任何事情;括号是正确平衡的,显示的语法是完全有效的,语义上等同于相同的,没有谓词周围的部分。我刚才试过了,它不起作用吗?您可以调试并检查吗?旁注:您应该对所有一次性对象使用using语句:SqlConnection、SqlCommand等。除此之外,您的代码对我来说似乎很好,我认为Marc的答案是正确的。请尝试在WHERE之后删除,如下所示:WHERE DriverID IN SELECT DriverID FROM Driver WHERE CardID=@a@un-幸运的是,这不会改变任何事情;括号是正确平衡的,显示的语法是完全有效的,语义上等同于相同的,没有谓词周围的部分。我刚才试过了,它不起作用吗?您可以调试并检查吗?旁注:您应该对所有一次性对象使用using语句:SqlConnection、SqlCommand等。另外,你的代码对我来说很好,我认为马克的答案是正确的。谢谢你的帮助!我想起来了:谢谢你的帮助!我已经弄明白了: