T-SQL存储过程在代码中返回null,但在控制台中工作

时间:2009-11-25 11:10:31

标签: sql-server tsql stored-procedures odbc

我有一个存储过程

CREATE procedure [dbo].[get_unique_identifier]
AS
DECLARE @ret_val INT
UPDATE seq SET @ret_val = id = id + 1
RETURN @ret_val

查询具有单个int列和单行的表(seq),递增该值然后返回它。不要问为什么我这样做,但简而言之,我的想法是模拟一个PostgreSQL序列而不是,一个标识列不能完成这项工作。无论如何,这在SQL Management Studio中正常工作,其中

的顺序执行
DECLARE @returned INT
EXEC @returned = get_unique_identifier
SELECT @returned

产生预期的输出。不幸的是,我似乎无法在我正在使用的应用程序中获得返回值

OdbcCommand command = new OdbcCommand("get_unique_identifier");
command.CommandType = CommandType.StoredProcedure;
OdbcParameter return_param = new OdbcParameter("@RETURN_VALUE", OdbcType.BigInt);
return_param.Direction = ParameterDirection.ReturnValue;
command.Parameters.Add(return_param);
Util.SQLExecuteParameterizedNonQuery(command);
Console.WriteLine(command.Parameters["@RETURN_VALUE"].Value.ToString());

输出为空字符串,但值本身为DBNull.Value。我正在做的一些测试遗留了OdbcType.BigInt。最初是Int

编辑:这显然是ODBC的一个错误。解决方法发布在下面。如果没有,请不要使用ODBC。

3 个答案:

答案 0 :(得分:1)

我很遗憾不得不说,但这可能是因为使用了Odbc

我尝试使用SqlClient数据库对象并按预期返回值。

SqlCommand command = new SqlCommand("ZZZ_get_unique_identifier");
command.CommandType = CommandType.StoredProcedure;

SqlParameter return_param = new SqlParameter("@RETURN_VALUE",SqlDbType.BigInt);
return_param.Direction = ParameterDirection.ReturnValue;
command.Parameters.Add(return_param);

SqlConnection con = new SqlConnection(dbM.DefaultConnectionString);
con.Open();

command.Connection = con;
command.ExecuteNonQuery();

int i = Convert.ToInt32(command.Parameters["@RETURN_VALUE"].Value.ToString());
con.Close();

答案 1 :(得分:0)

存储过程的返回值是Int(32位),而不是BigInt(64位),但我不确定这是否会导致代码出现问题。

答案 2 :(得分:0)

你有没有尝试使用输出变量...我正在慢慢记忆并认为行command.Parameters [“@ RETURN_VALUE”]。Value.ToString()可能就是这样......它工作的原因在SQL Management Studio中,因为您声明了一个变量并在TSQL EXEC语句中使用它。我希望这个答案能以某种方式给你一个提示..

希望这有帮助, 最好的祝福, 汤姆。