0

データベースを更新するストアドプロシージャがあります。

クエリアナライザーではうまく動作しますが、C#Webアプリから実行しようとすると、テーブルが更新されません。

次のエラーが発生したので、ARITHABORTを「ON」に設定しましたが、それでもエラーが発生します。

次のSETオプションの設定が正しくないため、UPDATEが失敗しました:'ARITHABORT'。SETオプションが、インデックス付きビューや計算列のインデックス、クエリ通知、xmlデータ型メソッドでの使用に適していることを確認します。

C#コード:

p = new SqlParameter("@userAnswers", SqlDbType.VarChar, 1000);
p.Value = "";
p.Value = exam.ExamQuestions.Rows[0].ItemArray[0] + ":" + exam.UserAnswerChoices[0];

for (int x = 1; x < exam.NumQuestions; x++)
{
    p.Value+= ", " + exam.ExamQuestions.Rows[x].ItemArray[0] + ":" + exam.UserAnswerChoices[x];
}

conn.query("insertAnswers", p);
return p.Value.ToString();

ストアドプロシージャコード:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ARITHABORT ON
GO
ALTER PROCEDURE [dbo].[insertAnswers] 
@userAnswers VarChar(1000)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @input XML
Set @input = '<Questions><Question id="' + Replace(Replace(@userAnswers, ':', '">'), ', ', '</Question><Question id="') + '</Question>' + '</Questions>'

;WITH ParsedXML AS
(
SELECT
    ID = C.value('(@id)[1]', 'int'),
    ColumnName = C.value('(.)[1]', 'varchar(10)')
FROM @input.nodes('/Questions/Question') AS T(C)
)
UPDATE CourseQuestions 
SET a = CASE WHEN p.ColumnName = 'a' THEN t.a + 1 ELSE t.a END,
    b = CASE WHEN p.ColumnName = 'b' THEN t.b + 1 ELSE t.b END,
    c = CASE WHEN p.ColumnName = 'c' THEN t.c + 1 ELSE t.c END,
    d = CASE WHEN p.ColumnName = 'd' THEN t.d + 1 ELSE t.d END,
    e = CASE WHEN p.ColumnName = 'e' THEN t.e + 1 ELSE t.e END,
    f = CASE WHEN p.ColumnName = 'f' THEN t.f + 1 ELSE t.f END
FROM CourseQuestions t
INNER JOIN ParsedXml p ON t.QuestionID = p.ID
END

@userAnswers基本的にはコンマ区切りの文字列です(SQL Serverに配列を送信できないため)。次のようになります: '1:d、2:a、3:b'

4

3 に答える 3

0

確認すべき点がいくつかあります。

Management Studio の実行/一般 + 詳細オプションでは、奇妙なものが設定されていないことを確認してください。デフォルトでオンになっている通常の容疑者は次のとおりです。

QUOTED_IDENTIFIER

ANSI_NULL_DFLT_ON

ANSI_PADDING

ANSI_WARNINGS

ANSI_NULLS

CONCAT_NULL_YIELDS_NULL

ARITHABORT (チェック済み)

実行中のクエリを実際に投稿できる可能性はありますか。

于 2012-07-18T14:29:42.237 に答える
-1

SET ARITHABORT ON はストアド プロシージャ内にありません

ALTER PROCEDURE [dbo].[insertAnswers]  
@userAnswers VarChar(1000) 
AS 
BEGIN 
SET NOCOUNT ON
SET ARITHABORT ON
.....

テストしていません。それがうまくいかない場合は試してください

strSQL = "SET ARITHABORT ON" & chr(13) & chr(10) & "EXEC MySPRoc ..."
conn.Execute strSQL
于 2012-07-18T14:45:32.353 に答える
-1

ここでワイルドスタブですが、C# コードは既に : または ' を含むテキストを処理している可能性がありますか? または、渡す連結文字列が 1000 文字を超えていますか?

別の注意点として、特に多くの連結を行う場合、ほとんどのインスタンスでパフォーマンスが向上するため、連結に StringBuilder を使用する必要があります。

于 2012-07-18T14:40:42.640 に答える