76

ストアド プロシージャを実行してから、if ステートメントを使用して null 値をチェックしようとしていますが、不足しています。私は VB の男ですので、男子生徒の構文エラーが発生した場合はご容赦ください。

objConn = new SqlConnection(strConnection);
objConn.Open();
objCmd = new SqlCommand(strSQL, objConn);
rsData = objCmd.ExecuteReader();
rsData.Read();

if (!(rsData["usr.ursrdaystime"].Equals(System.DBNull.Value)))
        {
            strLevel = rsData["usr.ursrdaystime"].ToString();

        }

これにより、SQL 接続が値だけを返しているかどうかを確認し、そうであれば文字列を入力することができますか?

以下をチェックして、値が返されているかどうかを確認できることに慣れていますが、C#で正しく実行しているかどうかはわかりません

If Not IsDBNull(rsData("usr.ursrdaystime"))

どんな助けでも大歓迎です!

4

11 に答える 11

138

これはうまくいくはずです。

if (rsData["usr.ursrdaystime"] != System.DBNull.Value))
{
    strLevel = rsData["usr.ursrdaystime"].ToString();
}

次のような using ステートメントも追加する必要があります。

using (var objConn = new SqlConnection(strConnection))
     {
        objConn.Open();
        using (var objCmd = new SqlCommand(strSQL, objConn))
        {
           using (var rsData = objCmd.ExecuteReader())
           {
              while (rsData.Read())
              {
                 if (rsData["usr.ursrdaystime"] != System.DBNull.Value)
                 {
                    strLevel = rsData["usr.ursrdaystime"].ToString();
                 }
              }
           }
        }
     }

これにより、ブロック { .. } の外にあるリソースが自動的に破棄 (クローズ) されます。

于 2012-05-03T12:57:48.680 に答える
14

慣用的な方法は、次のように言うことです。

if(rsData["usr.ursrdaystime"] != DBNull.Value) {
    strLevel = rsData["usr.ursrdaystime"].ToString();
}

これ:

rsData = objCmd.ExecuteReader();
rsData.Read();

ちょうど 1 つの値を読み取っているように見えます。IDbCommand.ExecuteScalar代わりに使用してください。

于 2012-05-03T12:58:01.550 に答える
7

あなたのVBに最も近いものは次のようになります(これを参照してください):

Convert.IsDBNull()

しかし、これを行うにはいくつかの方法があり、ほとんどはここからリンクされています

于 2012-05-03T13:03:17.023 に答える
5

はい、単なる構文の問題です。代わりにこれを試してください:

if (reader["usr.ursrdaystime"] != DBNull.Value)

.Equals()は、 2 つの Object インスタンスが同じかどうかを確認しています。

于 2012-05-03T12:58:41.847 に答える
2

検討:

if(rsData.Read()) {
  int index = rsData.GetOrdinal("columnName"); // I expect, just "ursrdaystime"
  if(rsData.IsDBNull(index)) {
     // is a null
  } else {
     // access the value via any of the rsData.Get*(index) methods
  }
} else {
  // no row returned
}

また:もっと必要usingです;p

于 2012-05-03T12:58:48.900 に答える
0
if(!rsData.IsDBNull(rsData.GetOrdinal("usr.ursrdaystime")))
{
  strLevel = rsData.GetString("usr.ursrdaystime"); 
}

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

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

于 2012-05-03T13:01:30.303 に答える
0

そのような代替オプションがまだあります。

strLevel = rsData.GetValue(0) is DBNull? "" : rsData.GetString(0);

どの列がカウントされるかを正確に知る必要があります。

于 2021-09-20T17:39:05.380 に答える
-2

最初に ExecuteScalar を使用する

 objConn = new SqlConnection(strConnection);
 objConn.Open();
 objCmd = new SqlCommand(strSQL, objConn);
 object result = cmd.ExecuteScalar();
 if(result == null)
     strLevel = "";
 else 
     strLevel = result.ToString();
于 2012-05-03T13:01:15.227 に答える