首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

有鬼!真的有鬼! 存储过程有鬼!ADO.NET有鬼!抓鬼者赏金50

2012-01-15 
有鬼!真的有鬼!!!! 存储过程有鬼!ADO.NET有鬼!!!!抓鬼者赏金50 在线等SQL2000存储过程有四个输出参数正常

有鬼!真的有鬼!!!! 存储过程有鬼!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,日期运算就相当麻烦。

热点排行