0

クラス内に SqlDataReader を含むメソッドがあります(データベーステーブルに接続し、多数の行を取得します)。後で、SqlDataReader が持つ各レコードを asp labels に割り当てたいと思います。しかし、メソッドの戻り値の型がどうあるべきかわからないので、そこから値を抽出し、コード ビハインド ファイルでそれを行う方法を教えてください。これがコードです。

 public (???) displayCustoemrhShipOrder()
    {
        string htmlStr = string.Empty;                   
        string sConnectionString = ConfigurationManager.ConnectionStrings["LGDB"].ToString();
        SqlConnection SqlCOn = new SqlConnection(sConnectionString);
        SqlCommand SqlCmd = new SqlCommand();
        SqlCmd.Connection = SqlCOn;
        SqlCmd.CommandText = "displayCustomerShipOrder";
        SqlCmd.CommandType = CommandType.StoredProcedure;
        SqlCOn.Open();
        SqlCmd.Parameters.AddWithValue("ShipOrderID",shipOrderID);
        SqlDataReader reader = SqlCmd.ExecuteReader();
        while (reader.Read())
        {
            htmlStr = reader.GetInt32(0).ToString();
        }
        reader.Close();
        SqlCOn.Close();            
        return(???)
    }
4

2 に答える 2

2

SqlDataReader一般に、データベース アクセス コードの外側の層に戻るべきではありません。この一般原則の背後にある理由は、データベースへのオープンな接続を維持するSqlDataReader非常に「高価な」オブジェクトであることです! それで、あなたが周りにいるなら、それほど悪くはありませんが、いつでも10人が横になっている場合はどうなりますか? それらの100はどうですか?1000? 災害のレシピです。SqlDataReader

では、SqlDataReader からデータベースへの接続をどのように閉じるのでしょうか? .NET のIDisposableインターフェイスDispose()には、クリーンアップを処理する非常に便利なメソッドが呼び出されます。したがって、コードは次のようになります

function getData()
{
    // instantiate SqlDataReader from SqlCommand, call it "rdr"
    rdr.Dispose();
}

しかし、実際にはそのコードには問題があります。コードが に到達する前に例外をスローするとどうなりますDispose()か? それは本当に次のように見えるはずです

function getData()
{
    try{
        // instantiate SqlDataReader from SqlCommand, call it "rdr"
    }
    catch(Exception){}
    Finally{
        rdr.Dispose();
    }
}

それは非常に冗長です!それをすべて入力したくない場合はどうしますか?心配する必要はありません。これも .NET によって処理されます。これを行う:

public (???) displayCustoemrhShipOrder()
{
    string htmlStr = string.Empty;                   
    string sConnectionString = ConfigurationManager.ConnectionStrings["LGDB"].ToString();
    using(SqlConnection SqlCOn = new SqlConnection(sConnectionString))
    {
    using(SqlCommand SqlCmd = new SqlCommand())
    {
    SqlCmd.Connection = SqlCOn;
    SqlCmd.CommandText = "displayCustomerShipOrder";
    SqlCmd.CommandType = CommandType.StoredProcedure;
    SqlCOn.Open();
    SqlCmd.Parameters.AddWithValue("ShipOrderID",shipOrderID);
    using(SqlDataReader reader = SqlCmd.ExecuteReader())
    while (reader.Read())
    {
        htmlStr = reader.GetInt32(0).ToString();
    }
    // reader.Close();  // this line becomes optional, Dispose() will call Close()
    }
    // SqlCOn.Close();  // this line becomes optional, Dispose() will call Close()
    }
    }

    return(???)
}

Dispose()これはすべて、Close()SqlDataReaderを使用する必要があることがわかっていて、それを実行するとデータを取得できないことがわかっている場合は、データを操作する必要があるコードにそれを返してはならないということです (ただし、必ずしもそれが占有していたデータベース接続ではありません)。クラスを使用することをDataTableお勧めします。これについては、次を参照してください。

.NET DataTable クラス

また、 a に変換するメソッドDataTableが呼び出されますDataTable.Load(SqlDatareader...

于 2013-07-26T18:46:48.263 に答える
1

個々の値を追加してList<string>それを返し、メソッドの外部で使用できます。

于 2013-07-26T18:17:29.457 に答える