當我使用下面的存儲過程更新包含雙引號的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保存的數據正確地輸入到一個輸入標籤中,所以雙引號最終在雙引號中定義了輸入標籤。
請嘗試格式化您發佈的代碼。誰能讀到這些? – 2009-08-17 18:57:11
現在它已被格式化,請考慮撤消您的否定投票。 – 2009-08-17 18:58:02
你確定問題出在T-SQL上嗎?您是否嘗試在SQL Management Studio中執行存儲過程? – Zyphrax 2009-08-17 19:00:10