我意识到这个问题已经被回答过了,我已经查看了答案,试图找到我的方式的错误,但是处于停滞状态。我有以下存储过程应该返回一个唯一的密钥。用c输出参数运行存储的sql程序#
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)[email protected], cvalue = CONVERT(CHAR,(CONVERT(INT,cvalue)[email protected])) WHERE UPPER(ctablename) = UPPER(@tablename) AND UPPER(cfieldname) = UPPER(@fieldname)
SELECT @value
END
ELSE
BEGIN
UPDATE id SET @value = CONVERT(INT,cvalue)[email protected], cvalue = CONVERT(CHAR,(CONVERT(INT,cvalue)[email protected])) 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,暗示有正在运行的程序错误。如果有人看到我可能做错了,我将不胜感激这种帮助。
只是说明:我不能编辑实际的过程,因为有几个类已经使用它。
非常感谢您的帮助。
我建议你编写你自己的测试程序,它简单地使用参数并返回输出,这样你就可以确保你的command.Parameters逻辑是正确的。然后逐步添加逻辑以达到您的原始要求。使用{}使用+1! – n8wrl 2012-07-25 19:34:41
你确定你打电话给你的程序吗?你有没有尝试分析你的电话,看看发送了什么? – 2012-07-25 19:35:03
另一个想法 - 如果您在创建命令对象之前打开连接,该怎么办? – n8wrl 2012-07-25 19:35:45