Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.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# 使用c中的输出参数运行存储sql过程#_C#_Sql_Parameters - Fatal编程技术网

C# 使用c中的输出参数运行存储sql过程#

C# 使用c中的输出参数运行存储sql过程#,c#,sql,parameters,C#,Sql,Parameters,我意识到这个问题以前已经被回答过了,我已经仔细阅读了答案,试图找出我的错误,但我却陷入了停顿。我有下面的存储过程,它应该返回一个唯一的密钥 GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER OFF GO ALTER PROCEDURE [dbo].[newid] @tablename AS CHAR(10), @fieldname AS CHAR(15) = '', @ioffset AS INT, @theID as int = 0 output

我意识到这个问题以前已经被回答过了,我已经仔细阅读了答案,试图找出我的错误,但我却陷入了停顿。我有下面的存储过程,它应该返回一个唯一的密钥

GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO
ALTER   PROCEDURE [dbo].[newid] @tablename AS CHAR(10), @fieldname AS CHAR(15) = '', @ioffset AS INT, @theID as int = 0 output 
AS
BEGIN
  SET NOCOUNT ON

 DECLARE @value AS INT
 IF @ioffset < 1 SET @ioffset = 1
 IF LEN(@fieldname) > 0
  BEGIN
    UPDATE id SET @value = CONVERT(INT,cvalue)+@ioffset-1, cvalue = CONVERT(CHAR,(CONVERT(INT,cvalue)+@ioffset)) WHERE UPPER(ctablename) = UPPER(@tablename) AND UPPER(cfieldname) = UPPER(@fieldname)
   SELECT @value
  END
 ELSE
  BEGIN
   UPDATE id SET @value = CONVERT(INT,cvalue)+@ioffset-1, cvalue = CONVERT(CHAR,(CONVERT(INT,cvalue)+@ioffset)) WHERE UPPER(ctablename) = UPPER(@tablename)
   SELECT @value 
  End
 SET NOCOUNT OFF
set @theID = @value
END
Value返回为空,结果为-1,暗示运行过程时出错。如果有人看到我可能做错了什么,我将非常感谢你的帮助

请注意:我无法编辑实际的过程,因为有几个类已经在使用它


非常感谢您的帮助。

我将尝试更改此行:

command.Parameters.Add(new SqlParameter("@ioffset",1)); 

您正在使用的构造函数中存在已知错误。看这张照片
新方法
SqlParameter.AddWithValue
消除了标准构造函数的歧义,在某种程度上解决了这个问题

 command.Parameters.Add( new SqlParameter("@tablename",table));
 command.Parameters.Add( new SqlParameter("@fieldname",field));
 command.Parameters.Add( new SqlParameter("@ioffset",1));
如果像这样添加到参数列表,则应指定参数的类型

或者你可以这样做,这可能会奏效:

 command.Parameters.AddWithValue("@tablename",table);
 command.Parameters.AddWithValue("@fieldname",field);
 command.Parameters.AddWithValue("@ioffset",1);
试试看。


决心

谢谢你给我的回复。我接受了Steve的建议,从SQL Management Studio运行了这个过程,也遇到了问题。在对我的输入进行了一点修改之后,我发现我正在使用

String table=“dbo.tablename”

当我把这个改成

String table=“tablename”

一切都按预期开始工作


这对我来说是一个愚蠢的错误,因为我对SQL的掌握不够坚定。再次感谢大家提出的精彩建议。

我建议您编写自己的测试过程,该过程仅使用参数并返回输出,这样您就可以确保您的命令。参数逻辑是正确的。然后逐步添加逻辑以达到原始需求+1用于使用{}!你确定你的程序是正确的吗?您是否尝试过分析您的呼叫并查看发送的内容?另一个想法-如果在创建命令对象之前打开了连接会怎么样?您是否尝试过从Management Studio调用此SP?您从中得到了什么输出?另外,-1返回值很清楚-您在
上设置了
无计数-当您指定可以使用
命令.Parameters.AddWithValue(名称,值)
时,SQL Server(假设您正在使用)将不会返回许多受影响的行。
 command.Parameters.Add( new SqlParameter("@tablename",table));
 command.Parameters.Add( new SqlParameter("@fieldname",field));
 command.Parameters.Add( new SqlParameter("@ioffset",1));
 command.Parameters.AddWithValue("@tablename",table);
 command.Parameters.AddWithValue("@fieldname",field);
 command.Parameters.AddWithValue("@ioffset",1);