3

我意识到这个问题以前已经回答过了,我已经浏览了答案,试图找出我的方式的错误,但我处于停滞状态。我有以下应该返回唯一键的存储过程。

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

我正在使用以下代码尝试访问该过程:

using(SqlConnection connection = new SqlConnection(connectionString))
using(SqlCommand command = new SqlCommand("dbo.NewID", connection)
     { CommandType = CommandType.StoredProcedure } )
{
     command.Parameters.Add( new SqlParameter("@tablename",table));
     command.Parameters.Add( new SqlParameter("@fieldname",field));
     command.Parameters.Add( new SqlParameter("@ioffset",1));
     SqlParameter key = new SqlParameter("@theID", SqlDbType.Int);
     key.Direction = ParameterDirection.Output;
     command.Parameters.Add(key);

     connection.Open();
     result = command.ExecuteNonQuery();
     connection.Close();
}

key.Value 返回为空,结果为 -1,暗示运行该过程时出错。如果有人看到我可能做错了什么,我将非常感谢您的帮助。

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

非常感谢您的任何帮助。

4

3 回答 3

2

我将尝试更改此行:

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

SqlParameter pOffset = command.Parameters.Add( new SqlParameter("@ioffset", SqlDbType.Int)); 
pOffset.Value = 1;

您正在使用的构造函数中有一个已知错误。看看MSDN 上的社区评论
这个问题已经通过SqlParameter.AddWithValue去除标准构造函数歧义的新方法得到了一定程度的解决

于 2012-07-25T19:46:48.880 回答
1

解决

感谢我收到的所有回复。我接受了史蒂夫的建议,并从 SQL Management Studio 运行了该过程,但在那里也遇到了问题。在摆弄了我的输入之后,我发现我正在使用

String table = "dbo.tablename";

当我将其更改为

String table = "tablename";

一切都开始按预期工作。

这对我来说是一个愚蠢的错误,原因是对 SQL 的掌握不够牢固。再次感谢大家的精彩建议。

于 2012-07-30T19:26:43.137 回答
0
 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);

尝试一下。

于 2012-07-25T19:50:19.810 回答