我有一个存储过程
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。
答案 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语句中使用它。我希望这个答案能以某种方式给你一个提示..
希望这有帮助, 最好的祝福, 汤姆。