1

SqlDataReaderSQLテーブルから値を取得し、それらをそれぞれの変数に割り当てるためにを使用しています。しかし、私のテーブルではintdoubleタイプ列の値はnullです。そのため、を読み取って変数null intに割り当てようとするとint、クラッシュします。

値の割り当て方法は次のとおりです。

public int ID { get; set; }
public int Map { get; set; }
public int TypeID { get; set; }

そして、これは彼らが読まれているところです:

while (objSqlDataReader.Read())
{
    data= new data();
    emissiondata.ID = (int)objSqlDataReader["EFID"];
    emissiondata.Map = (int)objSqlDataReader["EFMappingID"];
    emissiondata.TypeID =(SqlInt32)objSqlDataReader["MobileTypeID"];

したがって、これらのいずれかがnullデバッグしている場合でも、クラッシュして続行しません。SQLで値を処理するにはどうすればよいですか?またnull、空の値が割り当てられているint場合はどうすれば割り当てられますnullか?

4

5 に答える 5

2

DBNull.Value は DataTable 行で機能しますが、SqlDataReader ではわかりません:

bool isNull = objSqlDataReader.GetOrdinal("EFID") == DBNull.Value;

たとえば、 SqlDataReader のGetSqlInt32、GetSqlDateTime などを使用する場合、それらはそのままで null を認識します。

開封する代わりに:

emissiondata.ID = (int)objSqlDataReader["EFID"];

代わりにこれを行います:

SqlInt32 emissionId = objSqlDataReader.GetSqlInt32(emissionIdOrdinal);

次に、 null を直接テストできます。

if (emissionId.IsNull) ...

ただし、これらのメソッドでは、値にアクセスするために列の序数が必要です。ループの前にこれらの序数を設定できます

int emissionIdOrdinal = rdr.GetOrdinal("EFID");

しかし、本当に C# の null が必要な場合は、代わりにヘルパー関数を作成します。

public static int? ToNullable(this SqlInt32 value)
{
    return value.IsNull ? (int?) null : value.Value;
}

null 許容変数でアクセスするには、次のようにします。

int? emissionId = objSqlDataReader.GetSqlInt32(emissionIdOrdinal).ToNullable();

null を直接テストできるようになりました。

if (emissionId == null)

アドバイスとして、クラスのプロパティを null 許容型に変更して、別の変数を使用する必要がないようにしてください。

public int? ID { get; set; }
public int? Map { get; set; }
public int? TypeID { get; set; }

最終的なコード:

data= new data();
emissiondata.ID = objSqlDataReader.GetSqlInt32(emissionIdOrdinal).ToNullable();
emissiondata.Map = objSqlDataReader.GetSqlInt32(emissionMapOrdinal).ToNullable();
于 2012-05-04T08:43:24.120 に答える
1

int?今はテストできませんが、 nullable で試すことができますint。の省略形ですNullable<Int32>objSqlDataReaderにキャストできる場合はint?、フィールドを に変更int?し、値が null のときに何かを行う必要がある場合は、プロパティ セッターに追加のロジックを追加します。

于 2012-05-04T08:39:03.767 に答える
1

したがって、考えられる答えを見つけるために、あなたが話しているクラスのドキュメントを調べます: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.aspx IsDBNull メソッドがあります. C# がなくても、これでうまくいくはずです。

while (objSqlDataReader.Read())
{
   data= new data();
   if (!objSqlDataReader.IsDBNull(objSqlDataReader.GetOrdinal("EFID")))
   {
      emissiondata.ID = (int)objSqlDataReader["EFID"];
   } else {
      // Whatever you want to do when it is null
   }
   if (!objSqlDataReader.IsDBNull(objSqlDataReader.GetOrdinal("EFMappingID")))
   {
      emissiondata.Map = (int)objSqlDataReader["EFMappingID"];
   } else {
      // Whatever you want to do when it is null
   }
   if (!objSqlDataReader.IsDBNull(objSqlDataReader.GetOrdinal("MobileTypeID")))
   {
      emissiondata.TypeID = (int)objSqlDataReader["MobileTypeID"];
   } else {
      // Whatever you want to do when it is null
   }
}
于 2012-05-04T02:09:51.607 に答える
0

クエリ自体でこれを行うことができます。Oracle では、関数はNVL(). 以下を使用するMS Sql Serverを使用しているようです。

ISNULL(YOUR_FIELD,0)

他の RDBMS の使用法と構文はこちら: http://www.w3schools.com/sql/sql_isnull.asp

于 2012-05-04T00:51:19.650 に答える