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"这样一个错误,不知道是什么意思,望高手能指教,谢谢 展开
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"这样一个错误,不知道是什么意思,望高手能指教,谢谢 展开
展开全部
我不知道我说的对不对啊
我觉得存储语法应该是对的
我感觉问题出在
string result = sqlCmd.Parameters["@outResult"].Value.ToString();
return result;
这段代码不应该放在try{}里。
把它放在 finally
{
sqlConn.Close();
}
的后面试试
我是这样认为的
函数定义了返回类型,但是对于try catch来说,他具有捕获异常的功能,假如异常,你放在try里,自然就无返回值,程序当然会提示错误!!!但是放在外面就不一样了无论是否异常都会有返回值。
我觉得存储语法应该是对的
我感觉问题出在
string result = sqlCmd.Parameters["@outResult"].Value.ToString();
return result;
这段代码不应该放在try{}里。
把它放在 finally
{
sqlConn.Close();
}
的后面试试
我是这样认为的
函数定义了返回类型,但是对于try catch来说,他具有捕获异常的功能,假如异常,你放在try里,自然就无返回值,程序当然会提示错误!!!但是放在外面就不一样了无论是否异常都会有返回值。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
想要C#调存储过程取得返回值的话,有两个要注意的.
1.存储过程要具有查询结果集.
你在存储过程中定义一个返回变量@outResult
但在end之间没有对@outResult 查询.
加一句:
select @outResult as 'outResult'
2.C#要获取返回的结果集,需要用查询的方法填充.
sqlCmd.ExecuteNonQuery();这个方法是不返回结果集的SQL调用.
其实你可以直接用普通的查询调用来执行这个存储过程,然后要ds接表取outResult就可以.
ds.Tables[0].rows[0]["outResult"].toString();
1.存储过程要具有查询结果集.
你在存储过程中定义一个返回变量@outResult
但在end之间没有对@outResult 查询.
加一句:
select @outResult as 'outResult'
2.C#要获取返回的结果集,需要用查询的方法填充.
sqlCmd.ExecuteNonQuery();这个方法是不返回结果集的SQL调用.
其实你可以直接用普通的查询调用来执行这个存储过程,然后要ds接表取outResult就可以.
ds.Tables[0].rows[0]["outResult"].toString();
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询