2

大家好,我正在使用存储过程从 sql server 读取数据,当数据库中有空数据时,一切看起来都是异常的,我无法将 DBNull 转换为其他类型。我正在使用 .net MVC3 以下是我的代码:

public static List<XYZFactorsModel> SelectGridItems(string sidx, string sord, int page, int rows, String rid, String process, String detail_table, String jobGroup, String date)

    {


       const string spName = "dbo.p___GetXYZMonitorJobDetails";
        List<XYZFactorsModel> XYZFactorDetailGridCollection;

        string connectionString = ConfigurationManager.ConnectionStrings["AdvItemsContext"].ConnectionString;
        if (string.IsNullOrEmpty(connectionString))
            return null;
        using (SqlConnection sqlConnection = new SqlConnection(connectionString))
        {
            SqlCommand sqlCommand = new SqlCommand(spName, sqlConnection);
            sqlCommand.CommandType = CommandType.StoredProcedure;
            //sqlCommand.Parameters.Add("@jobDate", SqlDbType.VarChar);
            sqlCommand.Parameters.Add("@jobGroup", SqlDbType.VarChar);
            sqlCommand.Parameters.Add("@jobName", SqlDbType.VarChar);
            sqlCommand.Parameters.Add("@detailTable", SqlDbType.VarChar);
            sqlCommand.Parameters.Add("@filterBatchControl", SqlDbType.VarChar);
            sqlCommand.Parameters.Add("@filterDate", SqlDbType.VarChar);
            sqlCommand.Parameters.Add("@filterTime", SqlDbType.VarChar);

            //sqlCommand.Parameters["@jobDate"].Value = date2;
            sqlCommand.Parameters["@jobGroup"].Value = jobGroup;
            sqlCommand.Parameters["@jobName"].Value = process;
            sqlCommand.Parameters["@detailTable"].Value = detail_table;
            sqlCommand.Parameters["@filterBatchControl"].Value = rid;
            sqlCommand.Parameters["@filterDate"].Value = date;
            sqlCommand.Parameters["@filterTime"].Value =date;

            sqlConnection.Open();
            XYZFactorDetailGridCollection = FillGridEntity(sqlCommand);
        }
        return XYZFactorDetailGridCollection;
    }

    private static List<XYZFactorsModel> FillGridEntity(SqlCommand sqlCommand)
    {
        List<MBSFactorsModel> thegrid = new List<MBSFactorsModel>();
        using (SqlDataReader sqlDataReader = sqlCommand.ExecuteReader())
        {
            while (sqlDataReader.Read())
            {
               try
                {

                    //if(sqlDataReader["last_factor"] != System.DBNull.Value)
                   //{
                   //    
                   //    thegrid.Add(new XYZFactorsModel
                   //    {
                   //        last_factor = Convert.ToDateTime(sqlDataReader["last_factor"])
                   //    });
                   //}
                   //else
                   //{
                   //    System.Diagnostics.Debug.WriteLine("null value was found in last factor field");
                  // }

                    thegrid.Add(new XYZFactorsModel
                    {
                        abc = sqlDataReader["abc"].ToString(),
                        abc2 = sqlDataReader["abc2"].ToString(),
                        abc3 = sqlDataReader["abc3"].ToString(),
                        abc4 = sqlDataReader["abc4"].ToString(),
                        abc5 = Convert.ToDecimal(sqlDataReader["abc5"]),
                 last_factor = Convert.ToDateTime(sqlDataReader["last_factor"]),

                    });


                }
                catch (Exception ex)
                {

                    System.Diagnostics.Debug.WriteLine(ex.Message);
                }

            }
        }
        return thegrid;
    }
}
4

3 回答 3

0

刚刚将所有数据类型转换为字符串,现在它工作正常。

于 2012-12-18T16:54:42.707 回答
0

在分配给不可为空的类型之前,您需要检查 SqlDataReader.IsDBNull。如果返回true,您需要决定如何初始化不可为空的变量。毕竟,像intdecimal这样的东西不能分配给它们一个空值。

获取一个值,该值指示列是否包含不存在或缺失的值。

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.isdbnull.aspx

于 2012-12-12T22:12:11.610 回答
0

您没有显示变量的声明,但我怀疑问题出在将数据拉出sqlDataReader实例的行中:

last_factor = Convert.ToDateTime(sqlDataReader["last_factor"])

如果last_factor声明为DateTime last_factor;,并且该列为空,则Convert调用将失败。IsDbNull在进行此转换之前,您需要检查是否为真。

如果空值合适,我建议在此处使用可空类型:

DateTime? last_factor = sqlDataReader.IsDbNull(columnNumber) ? (DateTime?)null : sqlDataReader.GetDateTime(columnNumber);
于 2012-12-12T22:12:34.217 回答