这是我第一次发帖,所以如果我犯了错误或者我的问题措辞不当,请告诉我。我目前正在开发一个实用程序应用程序,它允许将来自多个不同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]);
有什么想法吗?
答案 0 :(得分:0)
根据您的情况进行测试的想法,使用单个varchar类型字段创建一个名为test的表,并在过程中通过插入SerialNumber来插入该表。通过这种方式,您可以判断它是否通过正确的序列进行过滤以及是否执行了该过程。运气...
答案 1 :(得分:0)
您是否可以在全球设置NOCOUNT ON
?请参阅msdn.microsoft.com/en-us/library/ms176031.aspx
尝试将SET NOCOUNT OFF
添加到存储过程中。