2

こんにちは、ストアドプロシージャを使用してSQLサーバーからデータを読み取っていますが、DBNullを他の型にキャストできないデータベースにnullデータがあると、すべてがexpetに見えます。私は.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

null許容型ではないタイプに割り当てる前に、SqlDataReader.IsDBNullを確認する必要があります。それがtrueを返す場合は、null許容でない変数を初期化する方法を決定する必要があります。結局のところ、intdecimalのようなものにnull値を割り当てることはできません。

列に存在しない値または欠落している値が含まれているかどうかを示す値を取得します。

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;、列がnullの場合、呼び出しConvertは失敗します。IsDbNullこの変換を行う前に、trueかどうかを確認する必要があります。

null値が適切な場合は、代わりにここでnull許容型を使用することをお勧めします。

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

すべてのデータ型を文字列に変換しただけで、正常に動作するようになりました。

于 2012-12-18T16:54:42.707 に答える