【发布时间】: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<string[serial Number], DictionaryObjs>),每个数据行的字段值是以字符串形式存储在名为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