3

以下の2つの方法があります:

internal static SqlDataReader SelectData(string sql)
{
    using (var sqlConnection = new SqlConnection(Constant.ConnectionString))
    {
        sqlConnection.Open();
        var sqlCommand = new SqlCommand(sql, sqlConnection);
        var dataReader = sqlCommand.ExecuteReader();
        return dataReader;
    }
}

============

そして、このメソッドを次のように使用します。

var dataReader = SelectData(---some sql ---);

private void AddData(dataReader)
{
    while (dataReader.Read())
    {
        Employee e = new Employee();
        e.FirstNamei = dataReader["Name"].ToString();
    }

    dataReader.Close();
}

この 2 つの方法をマージできることはわかっていますが、これを記述するより良い方法を探しています。または、これにより問題が発生する可能性があります??

4

3 に答える 3

5

実際、あなたは自分自身を少し開いたままにしています。あなたは本当に次のように書きたいです:

using (SqlConnection cnn = new SqlConnection(cnnString))
using (SqlCommand cmd = new SqlCommand(sql, cnn))
{
    // use parameters in your SQL statement too, so you can do this
    // and protect yourself from SQL injection, so for example
    // SELECT * FROM table WHERE field1 = @parm1
    cmd.Parameters.AddWithValue("@parm1", val1);

    cnn.Open();
    using (SqlDataReader r = cmd.ExecuteReader())
    {

    }
}

これらのオブジェクトが確実に破棄されるようにする必要があるためです。さらに、この方向に進むと、必要ありませんdataReader.Close()usingステートメントによって自動的に破棄されるときに呼び出されます。

さて、ステートメントのコレクションを a 内にラップするtry...catchと、ビジネスになります。

于 2013-08-08T14:10:04.253 に答える
2

いくつかのこと

1) で接続を閉じているため、開いている接続が必要なため、SelectDatadataReader爆発するはずですAddData

2) AddDatadataReader を開いていないので、閉じてはいけません。

3)コードを隠しているのかもしれませんが、Employee作成されたインスタンスを使用しているとは思いませんAddData

于 2013-08-08T14:10:19.490 に答える
0

技術的には、最初の方法は正しいでしょう

    sqlCommand.ExecuteReader(CommandBehavior.CloseConnection);

次に、クライアントがリーダーを閉じ、接続も閉じます。

2 番目の例は、その中でリーダーを閉じなかった場合にも正しいでしょう。メソッドを反復するためだけにリーダーをメソッドに渡すことに犯罪者はいません。しかし、作成された場所から制御する必要があります。それをどのように開けて処分するか - これは別の問題です。

于 2013-08-08T14:30:04.953 に答える