C# 中接收 存储过程 的输出参数问题

我在sqlserver中有这样一个存储过程:createprocedureproc_addtype@TypeNamevarchar(50),@TypeDescvarcha... 我在sqlserver中有这样一个存储过程:
create procedure proc_addtype
@TypeName varchar(50),
@TypeDesc varchar(255),
@outResult varchar(30) output
as
if exists(select TypeName from NewsType where TypeName=@TypeName)
begin
set @outResult = '该类型已存在,添加失败!'
end
else
begin
insert into NewsType values(@TypeName,@TypeDesc)
if(@@error<>0)
begin
rollback transaction
set @outResult='添加失败!'
end
else
begin
set @outResult='添加成功!'
end
end
go
这个在数据库中运行正常,但是
C#中调用:
public string InsertResult(string name, string desc)
{
sqlCmd=new SqlCommand();
sqlCmd.CommandText="proc_addtype";
sqlCmd.Connection = sqlConn;
sqlCmd.Parameters.Add(new SqlParameter("@TypeName", name));
sqlCmd.Parameters.Add(new SqlParameter("@TypeDesc", desc));
sqlCmd.Parameters.Add(new SqlParameter("@outResult", SqlDbType.VarChar));

sqlCmd.Parameters["@outResult"].Direction = ParameterDirection.Output;
sqlCmd.CommandType=CommandType.StoredProcedure;
try
{
if (sqlConn.State != ConnectionState.Open)
{
sqlConn.Open();
}
sqlCmd.ExecuteNonQuery();
string result = sqlCmd.Parameters["@outResult"].Value.ToString();
return result;
}
catch
{
return null;
}
finally
{
sqlConn.Close();
}
}

这里报一个"string[2] Size 属性具有无效大小值 0"这样一个错误,不知道是什么意思,望高手能指教,谢谢
展开
 我来答
玫瑰河豚
推荐于2016-03-06 · 超过14用户采纳过TA的回答
知道答主
回答量:17
采纳率:0%
帮助的人:40.9万
展开全部
就这一句错了:sqlCmd.Parameters.Add(new SqlParameter("@outResult", SqlDbType.VarChar));
应该改成:
sqlCmd.Parameters.Add(new SqlParameter("@outResult", SqlDbType.VarChar,30));
这里要定义VarChar的长度,我这里定为30,你再试下,就不会报错了,你其它的代码都是对的
五千个字节
2010-03-10 · TA获得超过205个赞
知道小有建树答主
回答量:407
采纳率:0%
帮助的人:234万
展开全部
我不知道我说的对不对啊
我觉得存储语法应该是对的
我感觉问题出在
string result = sqlCmd.Parameters["@outResult"].Value.ToString();
return result;
这段代码不应该放在try{}里。
把它放在 finally
{
sqlConn.Close();
}
的后面试试
我是这样认为的
函数定义了返回类型,但是对于try catch来说,他具有捕获异常的功能,假如异常,你放在try里,自然就无返回值,程序当然会提示错误!!!但是放在外面就不一样了无论是否异常都会有返回值。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
kas68310
2010-03-10 · TA获得超过3638个赞
知道大有可为答主
回答量:1468
采纳率:33%
帮助的人:1185万
展开全部
想要C#调存储过程取得返回值的话,有两个要注意的.
1.存储过程要具有查询结果集.
你在存储过程中定义一个返回变量@outResult
但在end之间没有对@outResult 查询.
加一句:
select @outResult as 'outResult'

2.C#要获取返回的结果集,需要用查询的方法填充.
sqlCmd.ExecuteNonQuery();这个方法是不返回结果集的SQL调用.
其实你可以直接用普通的查询调用来执行这个存储过程,然后要ds接表取outResult就可以.
ds.Tables[0].rows[0]["outResult"].toString();
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式