一、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;
}
出现以下错误
看看是哪个对象是空的呢?
???不明白你在说什么
@OOLi:
cmd.Parameters.Clear();他的清空作用 所以要注释掉 这个注释掉会有什么影响呢???
你可以看看这个例子:
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的问题,你断点调试一下看是否有值
你上面那个问题我有用,我是想我现在的方法为什么不行??SQLHelp.ExecuteReader我测过有数据返回
@小小池: 你在后面再调用一次 ExecuteNonQuery 试一下吧,最好能用断点调试一下,看看是哪儿的问题
这个问题很简单。。问题在于你用了toString(),toString()如果当该对象为null肯定报错。。这个你可以使用Convert.Tostring()解决。。不过你这里获取的值为null也不对,还有一点。你不对参数。赋值就执行sql操作。。更加不对
output输出的参数不要赋值
你在调用ExecuteReader时已经
cmd.Parameters.Clear();
了,当然是null
cmd.Parameters.Clear() 不用会发生问题不?
@小小池: 不用会内存耗尽而亡。呵呵。
你这个记录数可以不用存储过程返回,只要如下即可:
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就是记录的数量