首页 新闻 会员 周边 捐助

获取存储过程返回参数出现问题

0
悬赏园豆:20 [已解决问题] 解决于 2012-04-08 10:58

一、SQL:存储过程

CREATE PROCEDURE StroGetTest 
@fid int ,@RecordCount NVarChar(30) Output
AS
select @RecordCount=count(1) from gname WHERE fid=@fid;
SELECT id,gname,gdir,gfla FROM Gname WHERE fid=@fid;
GO

二、SQL helpe

 public static SqlDataReader ExecuteReader(string cmdText, CommandType cmdType, params SqlParameter[] cmdParms) 
{
SqlCommand cmd = new SqlCommand();
SqlConnection conn = new SqlConnection(Constr);

try
{
ProCommand(cmd, conn, cmdText, cmdType,cmdParms);
SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
cmd.Parameters.Clear();
return rdr;
}
catch
{
conn.Close();
throw;
}
}
private static void ProCommand(SqlCommand cmd, SqlConnection conn, string cmdText, CommandType cmdType, SqlParameter[] cmdParms)
{

if (conn.State != ConnectionState.Open)
conn.Open();

cmd.Connection = conn;
cmd.CommandText = cmdText;
cmd.CommandType = cmdType;

if (cmdParms != null)
{
cmd.Parameters.AddRange(cmdParms);
}
}

三、调用输出存储过程的返回参数

public IList<Gname> GetReadFlei(int fid) 
{
SqlParameter[] par = { new SqlParameter("@fid",fid),
new SqlParameter("@RecordCount",SqlDbType.NVarChar,30)
};
par[1].Direction = ParameterDirection.Output;

SqlDataReader DR = SQLHelp.ExecuteReader("StroGetTest", CommandType.StoredProcedure, par);
IList<Gname> List = new List<Gname>();

while (DR.Read())
{
Gname sw = new Gname();
sw.id = DR.GetInt32(0);
sw.gname = DR.GetString(1);
sw.gdir = DR.GetString(2);
sw.gfla = DR.GetString(3);
List.Add(sw);
}

DR.Close();

string tt = par[1].Value.ToString();//出问题在这里

return List;
}

出现以下错误




 

小小池的主页 小小池 | 初学一级 | 园豆:30
提问于:2012-04-07 18:32
< >
分享
最佳答案
1

看看是哪个对象是空的呢?

收获园豆:20
OOLi | 初学一级 |园豆:163 | 2012-04-07 18:41

???不明白你在说什么

小小池 | 园豆:30 (初学一级) | 2012-04-07 18:43
OOLi | 园豆:163 (初学一级) | 2012-04-07 18:56

@OOLi: 

cmd.Parameters.Clear();他的清空作用 所以要注释掉   这个注释掉会有什么影响呢???

小小池 | 园豆:30 (初学一级) | 2012-04-07 18:59
其他回答(3)
0

你可以看看这个例子:

alter procedure QueryUserInfo
@Name varchar(20) output
as
begin
set @Name='麦子';
end
go
declare @Name varchar(20)
execute QueryUserInfo @Name output

C#:

using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["Test"].ConnectionString))
{
using (SqlCommand com = new SqlCommand())
{
com.CommandText = "QueryUserInfo";
com.CommandType = CommandType.StoredProcedure;
com.Connection = con;
con.Open();
SqlParameter sp = new SqlParameter();
sp.ParameterName = "@Name";
sp.Size = 20;
sp.DbType = DbType.String;
sp.Direction = ParameterDirection.Output;
com.Parameters.Add(sp);
int i=com.ExecuteNonQuery();
string j = sp.Value.ToString();
}

}

我觉得可能是你的代码中SQLHelp.ExecuteReader的问题,你断点调试一下看是否有值

artwl | 园豆:16736 (专家六级) | 2012-04-07 18:45

你上面那个问题我有用,我是想我现在的方法为什么不行??SQLHelp.ExecuteReader我测过有数据返回

支持(0) 反对(0) 小小池 | 园豆:30 (初学一级) | 2012-04-07 18:49

@小小池: 你在后面再调用一次 ExecuteNonQuery 试一下吧,最好能用断点调试一下,看看是哪儿的问题

支持(0) 反对(0) artwl | 园豆:16736 (专家六级) | 2012-04-07 18:51
0

这个问题很简单。。问题在于你用了toString(),toString()如果当该对象为null肯定报错。。这个你可以使用Convert.Tostring()解决。。不过你这里获取的值为null也不对,还有一点。你不对参数。赋值就执行sql操作。。更加不对

Eric_ho | 园豆:178 (初学一级) | 2012-04-08 00:11

output输出的参数不要赋值

支持(0) 反对(0) 小小池 | 园豆:30 (初学一级) | 2012-04-08 09:24
0

你在调用ExecuteReader时已经

cmd.Parameters.Clear();
了,当然是null
邀月 | 园豆:25475 (高人七级) | 2012-04-08 08:49
cmd.Parameters.Clear()  不用会发生问题不?
支持(0) 反对(0) 小小池 | 园豆:30 (初学一级) | 2012-04-08 09:29

@小小池: 不用会内存耗尽而亡。呵呵。

你这个记录数可以不用存储过程返回,只要如下即可:

int MaxCount=0;
while (DR.Read())
{
Gname sw = new Gname();
sw.id = DR.GetInt32(0);
sw.gname = DR.GetString(1);
sw.gdir = DR.GetString(2);
sw.gfla = DR.GetString(3);
List.Add(sw);
MaxCount++;
}
//MaxCount就是记录的数量
支持(0) 反对(0) 邀月 | 园豆:25475 (高人七级) | 2012-04-08 10:46
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册