2016-07-21 118 views
0

我創建了一個表,如下表所示:從數據庫獲取錯誤消息,當我嘗試更新

string fullTableName = string.Format("[dbo].[{0}]", tableName); 
string fullKeyName = string.Format("[PK_{0}]", tableName); 

string query = string.Format("{0} {1} {2} {3} {4} {5} {6} {7} {8} {9} {10} {11} {12} {13} {14} {15} {16} {17} {18} {19}" 
    , "USE [DB_15202_2614d162]" 
    , "SET ANSI_NULLS ON" 
    , "SET QUOTED_IDENTIFIER ON" 
    , "CREATE TABLE ", fullTableName, " ([ClientCode] [nchar](5) NOT NULL, [CompanyName] [nvarchar](40) NOT NULL," 
    , "[Address1] [nvarchar](60) NOT NULL, [Address2] [nvarchar](60) NULL, [City] [nvarchar](20) NULL," 
    , "[Province] [nvarchar](10) NOT NULL, [PostalCode] [nvarchar](10) NULL, [YTDSales] [decimal](18, 2) NOT NULL," 
    , "[CreditHold] [tinyint] NOT NULL, [Notes] [nvarchar](max) NULL," 
    , "CONSTRAINT ", fullKeyName, " PRIMARY KEY CLUSTERED" 
    , "([ClientCode] ASC) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY])" 
    , "ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]" 
    , "INSERT INTO ", fullTableName, " ([ClientCode], [CompanyName], [Address1], 
     [Address2], [City], [Province], [PostalCode], [YTDSales], [CreditHold], [Notes]) 
     VALUES (N'AROUT', N'Around the Horn', N'120 Hanover Sq.', NULL, N'London', N'ON', 
       N'L4N 7G5', CAST(1500.00 AS Decimal(18, 2)), 1, null)" 
    , "INSERT INTO ", fullTableName, " ([ClientCode], [CompanyName], [Address1], 
     [Address2], [City], [Province], [PostalCode], [YTDSales], [CreditHold], [Notes]) 
     VALUES (N'BOTTM', N'Bottom-Dollar Markets', N'23 Tsawassen Blvd.', NULL, 
       N'Tsawassen', N'BC', N'V2R 7A6', CAST(4689.24 AS Decimal(18, 2)), 0, N'Longest standing customer')" 
            ); 

      using (SqlCommand cmd = new SqlCommand()) 
      { 
       cmd.CommandType = CommandType.Text; 
       cmd.CommandText = query; 
       cmd.Connection = conn; 

       conn.Open(); 

       cmd.ExecuteNonQuery(); 
      } 
     } 

,當我試圖從這裏更新表:

public static int UpdateClient(Client client) 
    { 
     using (SqlConnection conn = new SqlConnection(connString)) 
     { 
      string query = string.Format("{0} {1} {2} {3} {4} {5}{6} {7} {8} {9}" 
          , "UPDATE Client906697" 
          , "SET ClientCode = @clientCode" 
          , "CompanyName = @companyName" 
          , ",Address1 = @address1" 
          , ",Address2 = @address2" 
          , ",City = @city" 
          , ",Province = @province" 
          , ",PostalCode = @postalCode" 
          , ",YTDSales [email protected]" 
          , ",CreditHold = @creditHold" 
          , ",Notes = @notes"); 

      byte creditHold = client.HoldsCredit ? (byte)1 : (byte)0; 

      using (SqlCommand cmd= new SqlCommand()) 
      { 
       cmd.CommandType = CommandType.Text; 
       cmd.CommandText = query; 
       cmd.Connection = conn; 

       cmd.Parameters.AddWithValue("@clientCode", client.ClientCode); 
       //cmd.Parameters.AddWithValue("@companyName", client.CompanyName); 
       cmd.Parameters.AddWithValue("@address1", client.Address1); 
       if (client.Address2 != null) 
       { 
        cmd.Parameters.AddWithValue("@address2", client.Address2); 
       } 
       else 
       { 
        cmd.Parameters.AddWithValue("@address2", DBNull.Value); 
       } 
       if (client.City != null) 
       { 
        cmd.Parameters.AddWithValue("@city", client.City); 
       } 
       else 
       { 
        cmd.Parameters.AddWithValue("@city", DBNull.Value); 
       } 
       cmd.Parameters.AddWithValue("@province", client.Province); 
       cmd.Parameters.AddWithValue("@postalCode", client.PostalCode); 
       cmd.Parameters.AddWithValue("@ytdSales", client.YTDSales); 
       cmd.Parameters.AddWithValue("@creditHold", creditHold); 
       if (client.Notes != null) 
       { 
        cmd.Parameters.AddWithValue("@notes", client.Notes); 
       } 
       else 
       { 
        cmd.Parameters.AddWithValue("@notes", DBNull.Value); 
       } 

       conn.Open(); 
       int rowsAffected = cmd.ExecuteNonQuery(); 
       return rowsAffected; 


      } 
     } 
    } 

我得到重複的關鍵約束錯誤,我找不到原因。 有人可以幫我嗎?

回答

0

ClientCode是您的主鍵,這意味着任何給定的值只能在該列中出現一次。

執行此操作時更新

"UPDATE Client906697" 
         , "SET ClientCode = @clientCode" 
         , "CompanyName = @companyName" 
         , ",Address1 = @address1" 
         , ",Address2 = @address2" 
         , ",City = @city" 
         , ",Province = @province" 
         , ",PostalCode = @postalCode" 
         , ",YTDSales [email protected]" 
         , ",CreditHold = @creditHold" 
         , ",Notes = @notes"); 

沒有WHERE條款。子句WHERE確定哪些行被更新。如果沒有,那麼它會嘗試更新表中的每一行。因此,無論的值是多少,您都試圖更新表中的每一行以獲得ClientCode的值。如果表中存在多條記錄,那麼它肯定會引發重複鍵異常,因爲多行不能具有相同的ClientCode。 (我相信這不是你的意思,ClientCode是你的主要關鍵,所以你可能不想改變那個。)

我想你的意思是做這件事(對不起,不會去嘗試把這個在您的string.Format,但你得到的圖片。)

UPDATE Client906697" 
    SET CompanyName = @companyName, 
    Address1 = @address1, 

    -- ETC 

WHERE ClientCode = @ClientCode 

現在你不改變ClientCode的價值,你只更新一列,具有一個匹配ClientCode

+0

謝謝。我只是解決了這個問題。 – Jay

0

[ClientCode]是你桌子上的主鍵。主鍵不能更新。您必須刪除約束,更新所需的行並重新創建密鑰。

相關問題