存储过程不更新数据库C#

时间:2018-04-17 03:48:07

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

这是我第一次发帖,所以如果我犯了错误或者我的问题措辞不当,请告诉我。我目前正在开发一个实用程序应用程序,它允许将来自多个不同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]);

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您是否可以在全球设置NOCOUNT ON?请参阅msdn.microsoft.com/en-us/library/ms176031.aspx

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