读书人

有鬼!真的有鬼! 存储过程有鬼!ADO.

发布时间: 2012-01-15 22:57:48 作者: rapoo

有鬼!真的有鬼!!!! 存储过程有鬼!ADO.NET有鬼!!!!抓鬼者赏金50 在线等
SQL2000存储过程有四个输出参数 正常测试得到四个参数得到正确结果分别是 8 7 6 9 在程序中调之后总是得到 8 7DBNULL DBNULL
存储过程太长 不让往上贴

正常输入测试条件 8 5 2007-5-1 2007-5-8 得到正确结果8 7 6 9
程序中调用 8 5 2007-5-1 2007-5-8 得到正确结果8 7 DBNULL DBNULL
抛出异常 无法将DBNULL转换为其它值类型

SqlConnection conn = null;
SqlParameter sp;
SqlParameter sprunum;
SqlParameter sprdnum;
SqlParameter sprlnum;
SqlParameter sprrnum;
ArrayList arr = new ArrayList();
int[] returns = new int[4];


this.objSqlCommand = new SqlCommand();
this.objSqlCommand.CommandText = "proc_select_rollbook ";
this.objSqlCommand.CommandType = CommandType.StoredProcedure;
sp = new SqlParameter();
sp.ParameterName = "@DAYS ";
sp.SqlDbType = SqlDbType.Int;
sp.Value = 8;
this.objSqlCommand.Parameters.Add(sp);

sp = new SqlParameter();
sp.ParameterName = "@LID ";
sp.SqlDbType = SqlDbType.Int;
sp.Value = 5;
this.objSqlCommand.Parameters.Add(sp);

sp = new SqlParameter();
sp.ParameterName = "@BTIME ";
sp.SqlDbType = SqlDbType.VarChar;
sp.Value = "2007-5-1 ";


this.objSqlCommand.Parameters.Add(sp);

sp = new SqlParameter();
sp.ParameterName = "@ETIME ";
sp.SqlDbType = SqlDbType.VarChar;
sp.Value = "2007-5-8 ";
this.objSqlCommand.Parameters.Add(sp);

sprunum = new SqlParameter();
sprunum.ParameterName = "@RUNUM ";
sprunum.SqlDbType = SqlDbType.Int;
sprunum.Direction = ParameterDirection.Output;
sprunum.Value = 0;
this.objSqlCommand.Parameters.Add(sprunum);

sprdnum = new SqlParameter();
sprdnum.ParameterName = "@RDNUM ";
sprdnum.SqlDbType = SqlDbType.Int;
sprdnum.Value = 0;
sprdnum.Direction = ParameterDirection.Output;
this.objSqlCommand.Parameters.Add(sprdnum);

sprlnum = new SqlParameter();
sprlnum.SqlDbType = SqlDbType.Int;
sprlnum.ParameterName = "@RLNUM ";
sprlnum.Direction = ParameterDirection.Output;
this.objSqlCommand.Parameters.Add(sprlnum);

sprrnum = new SqlParameter();
sprrnum.SqlDbType = SqlDbType.Int;
sprrnum.ParameterName = "@RRNUM ";
sprrnum.Direction = ParameterDirection.Output;


this.objSqlCommand.Parameters.Add(sprrnum);

conn = new SqlConnection(this.conString);
this.objSqlCommand.Connection = conn;
try
{
if (conn.State == ConnectionState.Closed)
conn.Open();
this.objSqlCommand.ExecuteNonQuery();
}
catch
{
return null;
}
finally
{
if (conn.State == ConnectionState.Open)
{
conn.Close();
}
}
try
{

returns[0] = Convert.ToInt32(sprunum.Value);
returns[1] = Convert.ToInt32(sprdnum.Value);
returns[2] = Convert.ToInt32(sprlnum.Value);
returns[3] = Convert.ToInt32(sprrnum.Value);
arr.Add(returns);
}


catch
{
return null;
}

[解决办法]
你的这么日期类型都是用Varchar来做的,但日期的比较能和字符串的比较能一样么?

这样将来不出错到很怪了
[解决办法]
return 的 是Output
参数的是 InOutput
//……

至于时间的格式,如果是标准的时间 写成dateTime是最合适的
写成varchar也是可以的,但是在不同语言时区下 时间可能会格式不同 2007/05/30 05/30/2007
这样的时间对比 varchar显然是有问题的
当然,具体问题还是要具体分析的
[解决办法]
如果数据库有日期运算,你写成varchar,日期运算就相当麻烦。

读书人网 >C#

热点推荐