2009-12-19 74 views
4

我想使用的SqlCommand更新的MSSQL表,我認爲這是我的T-SQL語法錯誤,但這裏是我到目前爲止有:C#更新表使用SqlCommand.Parameters

SqlCommand sqlCmd = new SqlCommand("UPDATE yak_tickets SET email = @emailParam, subject = @subjectParam, text = @textParam, statusid = @statusIDParam, ticketClass = @ticketClassParam WHERE id = @ticketIDParam", sqlConn); 

這些參數正常工作,但是,當我運行代碼時,該表永遠不會更新。任何幫助,將不勝感激=)

這裏是代碼的其餘部分:

#region Parameters 
    /* Parameters */ 
    sqlCmd.Parameters.Add("@ticketIDParam", SqlDbType.BigInt); 
    sqlCmd.Parameters["@ticketIDParam"].Value = ticketID; 

    sqlCmd.Parameters.Add("@emailParam", SqlDbType.NVarChar); 
    sqlCmd.Parameters["@emailParam"].Value = ticketToBeSubmitted.getEmail(); 

    sqlCmd.Parameters.Add("@subjectParam", SqlDbType.NVarChar); 
    sqlCmd.Parameters["@subjectParam"].Value = ticketToBeSubmitted.getSubject(); 

    sqlCmd.Parameters.Add("@textParam", SqlDbType.Text); 
    sqlCmd.Parameters["@textParam"].Value = ticketToBeSubmitted.getTicketContent(); 

    sqlCmd.Parameters.Add("@statusIDParam", SqlDbType.NVarChar); 
    sqlCmd.Parameters["@statusIDParam"].Value = ticketToBeSubmitted.getStatus(); 

    sqlCmd.Parameters.Add("@ticketClassParam", SqlDbType.NVarChar); 
    sqlCmd.Parameters["@ticketClassParam"].Value = ticketToBeSubmitted.getTicketClass(); 
    #endregion 

    #region Try/Catch/Finally 
    /* Try/Catch/Finally */ 

    try 
    { 
     sqlConn.Open(); 
     sqlCmd.ExecuteNonQuery(); 
    } 
    catch (SqlException sqlEx) 
    { 
     sqlErrorLabel.Text = sqlEx.ToString(); 
     sqlErrorLabel.ForeColor = System.Drawing.Color.Red; 
    } 
    finally 
    { 
     sqlConn.Close(); 
    } 

而且方法的簽名:

public static void updateTicketInDatabase(Ticket ticketToBeSubmitted, Label sqlErrorLabel, int ticketID) 
+0

它可能是一個愚蠢的問題,但你分配你的SQL命令到你的SQL連接? sqlCommand.Connection = sqlConn;我通常在構建sqlCommand = new SqlCommand(sqlConn);如果你沒有,我會認爲它會拋出一個錯誤。 – GrayWizardx 2009-12-19 23:23:46

+0

是的,我使用的構造函數在最後。 – skylerl 2009-12-19 23:29:59

+0

你實際上是在你的db中使用NVArchar字段嗎?或者只是varchar? – GrayWizardx 2009-12-19 23:42:06

回答

4

更新來自無效的語法(編輯:OP糾正了這個) 。該問題可能也是「text」列。 text是SQL Server中的關鍵字,因爲它是一種數據類型。試着在它周圍放上括號。

UPDATE yak_tickets 
SET email = @emailParam, 
    subject = @subjectParam, 
    [text] = @textParam, 
    statusid = @statusIDParam, 
    ticketClass = @ticketClassParam 
WHERE id = @ticketIDParam 
+0

是的,我把它作爲測試,忘了修改它。 – skylerl 2009-12-19 22:51:35

+0

哦,但它仍然無法正常工作?我們可以看到更多的代碼嗎? – womp 2009-12-19 22:52:52

+0

可能需要澄清 - 您可以在UPDATE語句中使用FROM子句,例如UPDATE t SET t.Field ='Blah'FROM MyTable t WHERE t.Id = 1 – AdaTheDev 2009-12-19 22:53:16

1

幾個問題:

  1. 這是一個交易內,多數民衆贊成越來越rolledback?
  2. 你是否證實你@ticketIDParam匹配表上的一組行?特別是如果它不只是一個整數鍵
  3. 你是否更新沒有副作用的行(即更新到相同的值)?
  4. 你能否提供這個查詢的參數.Add語句
  5. 在桌子上是否有觸發器或其他設置(我不假設,因爲你沒有提到任何東西)。
  6. 你說你知道參數工作正常,你能說你如何驗證這個? (剖析器,視覺檢查等)。
+0

1)沒有 2)是的,@ticketIDParam是健全的,我用它在其他方法 3)我正在更新是的,可能已將其值設置爲相同的行。 4.)我在上面添加了它們。 5.)沒有觸發器 6.)參數通常是複製/粘貼從我做/做/工作的方法,但有些需要一些改變,所以他們可能是一個錯誤或兩個。 – skylerl 2009-12-19 23:15:42

+0

如果你可以得到一個分析器跟蹤,你可以看到正在發送的內容。並嘗試在服務器上執行相同的命令(假設您有權訪問)。 – GrayWizardx 2009-12-19 23:24:50

+0

我希望我做的,GoDaddy是非常限制性的這種訪問= / – skylerl 2009-12-19 23:26:59

2

當初如果(!Page.IsPostBack)

0

聽起來像是你的託管服務提供商限制了你的調試選項,迫使你做的老式方法使用。如果在更新後立刻,你把這樣的:

;SELECT @@ROWCOUNT 

然後代替的ExecuteNonQuery的,做的ExecuteScalar,並查看是否SQL甚至認爲其更新任何東西。