【问题标题】:Stored Procedure is not updating database C#存储过程未更新数据库 C#
【发布时间】:2018-04-17 03:48:06
【问题描述】:

这是我第一次发帖,如果我犯了错误或者我的问题措辞不当,请告诉我。我目前正在开发一个实用程序应用程序,该应用程序允许将来自多个不同 csv 文件的数据上传到数据库中以用于报告目的。该应用程序获取文件,组合它们并删除重复项。生成数据库后,可以上传任何新文件以更新数据库或插入新记录。

我环顾四周,找不到解决问题的方法。目前我无法用新数据更新数据库。

由于某种原因,每当我尝试使用以下存储过程更新数据时,数据库中都不会保存任何更改。

CREATE PROCEDURE [dbo].[UpdateDeviceReport] 
    @SerialNumber AS VARCHAR(32),
    @DeviceType AS VARCHAR(8),
    @InstalledOn AS VARCHAR(32),
    @PortStatus AS CHAR(6)
AS 
BEGIN
    UPDATE computer
    SET deviceType = @DeviceType, deviceInstalledOn = @InstalledOn
    WHERE serialID = @SerialNumber

    UPDATE computer_localblocker
    SET portStatus = @PortStatus
    WHERE computer_serialid = @SerialNumber;
END
GO

这是执行该过程的 C# 代码。

 public void updateOrgDevices()
 {
     using (var conn = new SqlConnection(PopulateDatabase.connectionString))
     {
            int debug = 0;

            conn.Open();

            foreach (KeyValuePair<string, DictionaryObjs> element in GlobalVariables.UpdateData)
            {
                OrgDevRepObj obj = element.Value as OrgDevRepObj;

                SqlCommand sqlCommand = new SqlCommand("UpdateDeviceReport", conn);
                sqlCommand.CommandType = CommandType.StoredProcedure;
                sqlCommand.Parameters.Add("@SerialNumber", SqlDbType.VarChar, 32).Value = obj.SerialNumber.Trim().ToUpper();
                sqlCommand.Parameters.Add("@DeviceType", SqlDbType.VarChar, 8).Value = obj.DeviceType;
                sqlCommand.Parameters.Add("@InstalledOn", SqlDbType.VarChar, 32).Value = obj.InstalledOn;
                sqlCommand.Parameters.Add("@PortStatus", SqlDbType.Char, 6).Value = obj.PortStatus;

                debug = sqlCommand.ExecuteNonQuery();
            }
    }
}

参数来自字典/哈希图GlobalVariables.UpdateData,它将数据行存储为对象,其中键是该数据行的序列号(例如Dictionary&lt;string[serial Number], DictionaryObjs&gt;),每个数据行的字段值是以字符串形式存储在名为DictionaryObjs 的类中。这是所有记录类型的父类。在这种情况下,记录类型为OrgDevRepObj

我能够让代码工作一次,但我无法复制它。它不会抛出任何错误,但我知道它不起作用,因为sqlCommand.ExecuteNonQuery(); 为每个字典键值对返回 -1。我也尝试过使用

sqlCommand.Parameters.AddWithValue('@Param', [value]);

有什么想法吗?

【问题讨论】:

  • 您要加载多少数据?对于大量数据(成千上万行),一次合并一行数据会变得非常缓慢。一种更快的方法是将 CSV 数据加载到表中并处理数据库中的数据。但是我可以理解,如果您的优势在于 C# 而不是 T-SQL,您可能更喜欢这样做。如果你真的想调试,我建议的下一步是使用 SQL Profiler 来观察正在执行的 SQL。
  • 您使用了错误的连接字符串?或者您正在查看错误的数据库? -1 通常意味着您的存储过程中有“SET NOCOUNT ON”。你桌上有什么触发器吗?或者没有serialID = @SerialNumber的记录
  • 你能不能全局设置 NOCOUNT ON ?请参阅msdn.microsoft.com/en-us/library/ms176031.aspx 尝试将SET NOCOUNT OFF 添加到您的存储过程。您是否查看了数据库以查看是否确实发生了更改,而不是依赖返回的计数?
  • 如果您从 SSMS 调用存储过程,它是否有效? docs.microsoft.com/en-us/sql/ssms/…
  • @Nick.McDermaid 大约一万。实际上,我已经能够使用 C# 中的 Dictionary 非常快速地将数据加载到表中,它本质上是一个哈希映射,我可以使用它来强制执行唯一记录。不幸的是,CSV文件的数据字段中几乎没有一致性和重复,因此将它们按原样加载到表中将是一个关系噩梦,因此必须在将其放入数据库中的每个表之前对其进行操作。不过我的强项是 C#。

标签: c# stored-procedures sql-server-2012


【解决方案1】:

你能不能全局设置NOCOUNT ON?请参阅 msdn.microsoft.com/en-us/library/ms176031.aspx

尝试将SET NOCOUNT OFF 添加到您的存储过程中。

【讨论】:

    【解决方案2】:

    根据您的情况进行测试的想法是,使用单个 varchar 类型字段创建一个名为 test 的表,并在过程中通过插入 SerialNumber 对该表进行插入。通过这种方式,您可以判断它是否通过正确的序列进行过滤以及该过程是否已执行。运气……

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-09
      • 1970-01-01
      • 1970-01-01
      • 2012-03-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多