Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQL Server存储过程在查询分析器中执行,但无法从C正常运行#_C#_Sql Server - Fatal编程技术网

C# SQL Server存储过程在查询分析器中执行,但无法从C正常运行#

C# SQL Server存储过程在查询分析器中执行,但无法从C正常运行#,c#,sql-server,C#,Sql Server,我有一个更新数据库的存储过程 它在QueryAnalyzer中运行得很好,但当我尝试从我的C#web应用程序运行它时,表不会更新 我收到以下错误,所以我将ARITHABORT设置为“ON”,但我仍然收到错误 更新失败,因为以下设置选项的设置不正确:“ARITHABORT”。验证设置选项是否正确可供使用 在计算列和/或查询上使用索引视图和/或索引 通知和/或xml数据类型方法 C#代码: p=newsqlparameter(“@userAnswers”,SqlDbType.VarChar,1000

我有一个更新数据库的存储过程

它在QueryAnalyzer中运行得很好,但当我尝试从我的C#web应用程序运行它时,表不会更新

我收到以下错误,所以我将ARITHABORT设置为“ON”,但我仍然收到错误

更新失败,因为以下设置选项的设置不正确:“ARITHABORT”。验证设置选项是否正确可供使用 在计算列和/或查询上使用索引视图和/或索引 通知和/或xml数据类型方法

C#代码:

p=newsqlparameter(“@userAnswers”,SqlDbType.VarChar,1000);
p、 Value=“”;
p、 Value=exam.ExamQuestions.Rows[0].ItemArray[0]+“:“+exam.UserAnswerChoices[0];
对于(int x=1;x
存储过程代码:

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
将ANSI_空值设置为ON
去
在上设置带引号的\u标识符
去
启用ARITHABORT
去
更改程序[dbo]。[insertAnswers]
@userAnswers VarChar(1000)
作为
开始
不计数;
声明@input XML
设置@input='','','一些要检查的东西

在ManagementStudio中的Execution/General+Advanced选项,确保没有设置一些奇怪的东西。默认情况下处于启用状态的常见可疑对象有:

带引号的标识符

ANSI_NULL_DFLT_ON

ANSI_填充

ANSI_警告

ANSI_空值

CONCAT_NULL_产生_NULL

ARITHABORT(您已经检查过)


您是否有可能实际发布正在执行的查询,否则我们会有点盲目。

这里有点疯狂,但是C代码是否可以处理已经包含:或“在其中”的文本?或者正在传递的连接字符串是否大于1000个字符


另一方面,您应该使用StringBuilder进行连接,因为它在大多数情况下提供了更好的性能,特别是当您进行许多连接时。

存储过程中不包含SET-Aritabort 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

您可以发布您在应用程序中使用的代码和存储过程代码吗?SP是什么,您如何称呼它?编辑@BlueFoots打败了我+1在上面添加了SP和C代码,我在执行查询之前返回了一个值。我修改了我的问题。我现在遇到了更新失败的错误。如果您要在C#中构建字符串(不使用stringbuilder),然后将其重新转换为XML,那么为什么不首先将其作为XML传递呢?2012年早些时候,我写了一篇关于这一点的博文(在VB.NET中,但你应该能够理解):+1@Mister Bee。每当从SSM执行查询,但从代理或外部代码失败时,高级选项通常是罪魁祸首。将数据库选项与SSMS中的高级选项进行比较,您可能会发现问题所在。@Bee先生。-谢谢这是非常有用的。我没有将ARITHABORT设置在正确的位置,因此该程序没有更改。我打印了字符串以验证它看起来是否正常。我会接受你的建议并使用StringBuilder,就是这样。谢谢效果很好。
strSQL = "SET ARITHABORT ON" & chr(13) & chr(10) & "EXEC MySPRoc ..."
conn.Execute strSQL