3

C# を使用して ASP.NET で次のコードを実行すると、「行/列のデータが存在しません」のような例外が発生します。

OdbcConnection DbConnection = new   OdbcConnection(ConfigurationManager.AppSettings["ConnectionStr"]);        
DbConnection.Close();        
string cmdText = "SELECT Team_ID FROM team_details WHERE Team_Code=?";        
OdbcCommand cmd = new OdbcCommand(cmdText, DbConnection);
cmd.Parameters.Add("?Code", OdbcType.VarChar).Value = tbCode.Text;
DbConnection.Open();
OdbcDataReader DR = cmd.ExecuteReader();
DR.Read();        
if (DR.GetValue(0) != DBNull.Value)        
{
    args.IsValid = false;
}
else
{
    args.IsValid = true;
}
DbConnection.Close();

Visual Studio 2008 と MySQL を使用しています。MySql ODBC コネクタ 5.1 と MDAC2.8 を使用しています。

これを解決する方法を教えてください。

4

2 に答える 2

10

Read メソッドは、行が返されたかどうかを示すブール値を返すため、リーダーの結果にアクセスする前に、常にこの値をテストする必要があります。

  OdbcDataReader DR = cmd.ExecuteReader();



if (DR.Read() && DR.GetValue(0) != DBNull.Value)    
 {   
    args.IsValid = false; 
 } 
 else 
 {   
     args.IsValid = true; 
 } 
 DbConnection.Close();

usingEDIT ---- using ステートメント内で例外が発生した場合でも、接続が確実に閉じられる (破棄される) ため、接続も考慮する必要があります。

ステートメントを削除することもできますがif、それは好みの問題です。

最後に、.NET の標準的なイディオムは、接続文字列を web.config の ConnectionStrings セクションに保持することです。これは以下に示されていません。

   using(OdbcConnection DbConnection = new  OdbcConnection(ConfigurationManager.AppSettings["ConnectionStr"]))
   {
          string cmdText = "SELECT Team_ID FROM team_details WHERE Team_Code=?";        
          OdbcCommand cmd = new OdbcCommand(cmdText, DbConnection);
          cmd.Parameters.Add("?Code", OdbcType.VarChar).Value = tbCode.Text;
          DbConnection.Open();
          OdbcDataReader DR = cmd.ExecuteReader();
          args.IsValid = DR.Read() && DR.GetValue(0) != DBNull.Value;
   }
于 2011-06-25T08:33:32.100 に答える
3

このエラーで多くのトラブルを経験した後、私はそれについて隠された何かを発見しました:

接続オブジェクトをパブリック変数として宣言しました。次に、いくつかの関数を使用して使用します。ある時点で、接続文字列は前の手順で既に設定されているため、リセットしないことにしました。

したがって、パブリック接続オブジェクトによって設定されたテーブルを介してループ中に前の関数を呼び出した後続の関数は、前の関数がその値を返した後に接続を失い、CLOSED ITS CONNECTION OBJECT (2 つの関数によって共有されるパブリック オブジェクト) )!

それが理にかなっているといいのですが...何が起こっているのかを理解するのに何時間もかかりました.

于 2016-07-02T17:56:55.510 に答える