2012-07-25 48 views
3

我意识到这个问题已经被回答过了,我已经查看了答案,试图找到我的方式的错误,但是处于停滞状态。我有以下存储过程应该返回一个唯一的密钥。用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,暗示有正在运行的程序错误。如果有人看到我可能做错了,我将不胜感激这种帮助。

只是说明:我不能编辑实际的过程,因为有几个类已经使用它。

非常感谢您的帮助。

+1

我建议你编写你自己的测试程序,它简单地使用参数并返回输出,这样你就可以确保你的command.Parameters逻辑是正确的。然后逐步添加逻辑以达到您的原始要求。使用{}使用+1! – n8wrl 2012-07-25 19:34:41

+0

你确定你打电话给你的程序吗?你有没有尝试分析你的电话,看看发送了什么? – 2012-07-25 19:35:03

+0

另一个想法 - 如果您在创建命令对象之前打开连接,该怎么办? – n8wrl 2012-07-25 19:35:45

回答

1

议决

谢谢所有的回复很多,我得到的。我接受了Steve的建议,并从SQL Management Studio运行了该程序,并在那里遇到了问题。摆弄周围与我输入了一下后,我发现我是用

String table = "dbo.tablename";

当我把它改为

String table = "tablename";

一切开始工作正常。

对我而言,这是一个愚蠢的错误,原因是没有足够牢牢掌握SQL。再次感谢大家的精彩建议。

2

我会尝试改变这一行:

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

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

有一个在你使用的是构造一个已知的bug。看看community comments on MSDN
这个问题已经被新的方法SqlParameter.AddWithValue该删除的标准构造

+0

你可以使用'command.Parameters.AddWithValue(name,value)'。 – 2012-07-25 19:50:04

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); 

试试吧。

相关问题