代码之家  ›  专栏  ›  技术社区  ›  A.DCoder8

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

  •  1
  • A.DCoder8  · 技术社区  · 7 年前

    这是我第一次发帖,所以如果我犯了错误或者我的问题措辞不当,请告诉我。我目前正在开发一个实用程序应用程序,它允许将来自多个不同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 , that stores data rows as objects where the key is the serial number from that row of data (e.g. Dictionary<string[serial Number], DictionaryObjs>) 每个数据行的字段值存储为字符串,存储在一个名为 DictionaryObjs 。这是所有记录类型的父类。在这种情况下,记录类型为 OrgDevRepObj

    我曾经能让代码工作一次,但我还没有复制它。它不会出错,但我知道它不起作用,因为 sqlCommand.ExecuteNonQuery(); 为每个字典键值对返回-1。我也试过使用

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

    有什么想法吗?

    2 回复  |  直到 7 年前
        1
  •  0
  •   Ian Mercer    7 年前

    你能不能把 NOCOUNT ON 全球范围内?请参阅msdn。微软com/en us/library/ms176031。aspx

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

        2
  •  0
  •   Robert De León Martínez    7 年前

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