2009-08-17 39 views
1

當我使用下面的存儲過程更新包含雙引號的pollQuestion和pollName列時,它會正確保存雙引號。但是,對於列選項1,...,選項9,存儲過程不會保存雙引號或雙引號之後的任何字符。就好像SQL Server在雙引號中過早地截斷了字符串。我有一個預感QUOTED_IDENTIFIER與這個問題有關,但它不能解釋我與pollQuestion和pollName以及option1,...,option9的不一致性。SQL Server 2005在雙引號處截斷字符串

問題:爲什麼SQL Server 2005更新列的選項1,...,選項9的字符串在雙引號中被截斷? (例:保存的「Hello \」世界「的選項1將被保存爲」你好「)

set ANSI_NULLS OFF 
set QUOTED_IDENTIFIER OFF 
GO 
ALTER PROCEDURE [dbo].[sp_Poll_UpdateQandAs2] 
    @POLL_ID INT, 
    @NAME VARCHAR(140) = NULL, 
    @QUESTION VARCHAR(300), 
    @OPT1 VARCHAR(150), 
    @OPT2 VARCHAR(150), 
    @OPT3 VARCHAR(150)= NULL, 
    @OPT4 VARCHAR(150)= NULL, 
    @OPT5 VARCHAR(150)= NULL, 
    @OPT6 VARCHAR(150)= NULL, 
    @OPT7 VARCHAR(150)= NULL, 
    @OPT8 VARCHAR(150)= NULL, 
    @OPT9 VARCHAR(150)= NULL, 
    @VOTES1 INT = 0, 
    @VOTES2 INT = 0, 
    @VOTES3 INT = 0, 
    @VOTES4 INT = 0, 
    @VOTES5 INT = 0, 
    @VOTES6 INT = 0, 
    @VOTES7 INT = 0, 
    @VOTES8 INT = 0, 
    @VOTES9 INT = 0 
AS 
    UPDATE tTREpoll2 SET 
    pollName = @NAME, 
    pollQuestion = @QUESTION, 
    option1 = @OPT1, 
    option2 = @OPT2, 
    option3 = @OPT3, 
    option4 = @OPT4, 
    option5 = @OPT5, 
    option6 = @OPT6, 
    option7 = @OPT7, 
    option8 = @OPT8, 
    option9 = @OPT9, 
    votes1 = @VOTES1, 
    votes2 = @VOTES2, 
    votes3 = @VOTES3, 
    votes4 = @VOTES4, 
    votes5 = @VOTES5, 
    votes6 = @VOTES6, 
    votes7 = @VOTES7, 
    votes8 = @VOTES8, 
    votes9 = @VOTES9 
    WHERE pollID = @POLL_ID 

UPDATE: 人們都在猜測,這是一個的調用存儲過程是罪魁禍首,我懷疑的代碼。它不過是這裏的,做它的C#。

public static void UpdatePoll(PollObj savedPoll) 
{ 
    Database db = DatabaseFactory.CreateDatabase("ControlPanelSqlServer"); 
    using (DbCommand cmd = db.GetStoredProcCommand("sp_Poll_UpdateQandAs2")) 
    { 
     db.AddInParameter(cmd, "POLL_ID", DbType.String, savedPoll.PollID); 
     db.AddInParameter(cmd, "QUESTION", DbType.String, savedPoll.Question); 
     db.AddInParameter(cmd, "NAME", DbType.String, savedPoll.Name); 

     for (int i = 0; i < MAX_NUMBER_OF_CHOICES; i++) 
     { 
      if (i < savedPoll.Answers.Count) 
      { 

       db.AddInParameter(cmd, "OPT" + (i + 1), DbType.String, savedPoll.Answers[i].Option); 
       db.AddInParameter(cmd, "VOTES" + (i + 1), DbType.Int32, savedPoll.Answers[i].NumVotes); 
      } 
      else 
      { 
       db.AddInParameter(cmd, "OPT" + (i + 1), DbType.String, null); 
       db.AddInParameter(cmd, "VOTES" + (i + 1), DbType.Int32, 0); 
      } 
     } 


     if (db.ExecuteNonQuery(cmd) <= 0) 
     { 
      throw new Exception("Could not save changes with given the Poll_ID:" + savedPoll.PollID); 
     } 
    } 
} 

更新#2

,我發現這個問題,它不是我貼的代碼。該數據庫實際上W¯¯ orks,並做我想做的事情。我遇到的問題是我的一個aspx頁面如何讀取保存的結果。它沒有將HtmlEncode保存的數據正確地輸入到一個輸入標籤中,所以雙引號最終在雙引號中定義了輸入標籤。

+0

請嘗試格式化您發佈的代碼。誰能讀到這些? – 2009-08-17 18:57:11

+0

現在它已被格式化,請考慮撤消您的否定投票。 – 2009-08-17 18:58:02

+2

你確定問題出在T-SQL上嗎?您是否嘗試在SQL Management Studio中執行存儲過程? – Zyphrax 2009-08-17 19:00:10

回答

1

SQL Server沒有理由這樣做。這很可能是調用存儲過程的代碼的問題。

編輯
排除調用應用程序代碼,從SQL Server Management Studio中嘗試這個辦法:

EXEC sp_Poll_UpdateQandAs2 
    @POLL_ID = your_number_here 
    ,@NAME = 'my test "question"' 
    ,@QUESTION= 'will a question with "double quotes" work, even ''single quotes''?' 
    ,@OPT1 = 'with out a ''doubt'', "yes" it will' 
    ,@OPT2 = 'no way, "no" chance' 
    ,@OPT3 = 'maybe' 
    ,@OPT4 = NULL 
    ,@OPT5 = NULL 
    ,@OPT6 = NULL 
    ,@OPT7 = NULL 
    ,@OPT8 = NULL 
    ,@OPT9 = NULL 
    ,@VOTES1 = 100 
    ,@VOTES2 = 0 
    ,@VOTES3 = 0 
    ,@VOTES4 = 0 
    ,@VOTES5 = 0 
    ,@VOTES6 = 0 
    ,@VOTES7 = 0 
    ,@VOTES8 = 0 
    ,@VOTES9 = 0 
+0

@KM:你說得對。我的存儲過程沒有任何問題。 – burnt1ce 2009-08-18 14:35:41