【问题标题】:Data is not saved in SQL Server table [duplicate]数据未保存在 SQL Server 表中[重复]
【发布时间】:2017-09-14 18:55:42
【问题描述】:

enter image description here

我正在尝试更新 SQL Server 表中的数据。执行查询后,我收到一条消息说数据已保存。

但是当我检查该表时,我发现数据没有保存。我的查询有什么问题吗?

我正在使用 SQL Server 2008 和 C# 进行编码。

SqlCommand cmd1 = new SqlCommand("UPDATE Inward_Rpt SET Date='" + date + "',Cashier_Name='" + cashier_name + "',Supplier_Code='" + sup_code + "',Supplier_Name='" + name + "',Payment_Mode ='" + p_method + "',Total_Bill='" + tot_bill + "',Total_Paid='" + tot_paid + "',Previous_Due = '" + total_due + "',Current_Due ='" + c_due + "',Remark ='" + remark + "'WHERE Supplier_Name='" + name + "'", con);
cmd1.ExecuteNonQuery();
MessageBox.Show("Data Saved.."); 

【问题讨论】:

  • SQL Injection alert - 你应该将你的 SQL 语句连接在一起 - 使用 参数化查询 来避免 SQL 注入 - 查看Little Bobby Tables
  • 您能告诉我们您用于连接 SQL Server 的 连接字符串吗?
  • 尝试用trycatch 包围这段代码并放置一个断点编辑:您也可以尝试将所有cmd1 字符串复制到您的数据库并检查查询是否没有错误
  • 很可能,在将您的 SQL 命令连接在一起时,出现问题 - 只是 不要这样做 - 永远 - 使用 正确参数化的 UPDATE 查询 代替!
  • 通过调试器运行你的程序。在cmd1.ExecuteNonQuery(); 行上放置一个断点,然后查看即将发送到数据库的查询。如果看起来不错,则直接将其复制粘贴到 SSMS 中,然后运行它。这种方法可以更快地找到您的问题,而不是期望我们为您猜测。

标签: c# sql sql-server


【解决方案1】:

我想我发现了你的错误。您的 WHERE 子句使用与您更新供应商名称相同的 name。假设这是一个新名称,您将永远找不到要更新的记录。下面的代码更干净,不容易出现注入问题,它应该按照你想要的方式工作。

请注意,您必须提供一个新变量以适应 name / sup_name 的情况。

SqlCommand cmd1 = new SqlCommand();
cmd1.Connection = con;
cmd1.CommandText = @"
    UPDATE Inward_Rpt 
    SET Date = @date 
        , Cashier_Name = @cashier_name
        , Supplier_Code = @sup_code
        , Supplier_Name = @sup_name
        , Payment_Mode = @p_method
        , Total_Bill = @tot_bill
        , Total_Paid = @tot_paid
        , Previous_Due @total_due
        , Current_Due = @c_due
        , Remark = @remark
    WHERE Supplier_Name = @name";

cmd1.Parameters.AddWithValue("@date", date);
cmd1.Parameters.AddWithValue("@cashier_name", cashier_name);
cmd1.Parameters.AddWithValue("@sup_code", sup_code);
cmd1.Parameters.AddWithValue("@sup_name", sup_name);
cmd1.Parameters.AddWithValue("@p_method", p_method);
cmd1.Parameters.AddWithValue("@tot_bill", tot_bill_name);
cmd1.Parameters.AddWithValue("@tot_paid", tot_paid);
cmd1.Parameters.AddWithValue("@total_due", total_due);
cmd1.Parameters.AddWithValue("@c_due", c_due);
cmd1.Parameters.AddWithValue("@remark", remark);
cmd1.Parameters.AddWithValue("@name", name);

cmd1.ExecuteNonQuery();

MessageBox.Show("Data Saved.."); 

【讨论】:

  • @ShivvanandPatil 这是否有助于解决您的问题?
【解决方案2】:

您的数据库表中的所有字段都是字符串数据类型吗?检查数据类型,因为您为所有数据提供单引号。如果表格数据类型是数字,请删除单引号。

SqlCommand cmd1 = new SqlCommand("UPDATE Inward_Rpt SET Date='" + date + "',Cashier_Name='" + cashier_name + "',Supplier_Code=" + sup_code + ",Supplier_Name='" + name + "',Payment_Mode ='" + p_method + "',Total_Bill='" + tot_bill + "',Total_Paid='" + tot_paid + "',Previous_Due = '" + total_due + "',Current_Due ='" + c_due + "',Remark ='" + remark + "'WHERE Supplier_Name='" + name + "'", con);

【讨论】:

  • 没有一些字段数据类型是 int,有些也是钱和日期
  • @ShivvanandPatil 哪些是您查询中的 int 数据类型?
  • supplier_code 是 int 数据类型
  • @ShivvanandPatil 在答案上方我把查询运行了
  • 没有..仍然没有更新
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-14
  • 1970-01-01
  • 1970-01-01
  • 2013-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多