1
private void button5_Click(object sender, EventArgs e)
{
    SqlConnection conn = new SqlConnection("Data Source=MAZI-PC\\PROJECTACC;Initial Catalog=programDB;Integrated Security=True");
    SqlCommand cmd = new SqlCommand("select label_sh from label_text where label_form='2' and label_form_labelID='1'", conn);
    conn.Open();
    label1.Text = cmd.ExecuteReader().ToString();
    conn.Close();

    SqlConnection conn1 = new SqlConnection("Data Source=MAZI-PC\\PROJECTACC;Initial Catalog=programDB;Integrated Security=True");
    SqlCommand cmd1 = new SqlCommand("select label_sh from label_text where label_form='2' and label_form_labelID='2'", conn1);
    conn1.Open();
    label2.Text = cmd1.ExecuteReader().ToString();
    conn1.Close();

    SqlConnection conn2 = new SqlConnection("Data Source=MAZI-PC\\PROJECTACC;Initial Catalog=programDB;Integrated Security=True");
    SqlCommand cmd2 = new SqlCommand("select label_sh from label_text where label_form='2' and label_form_labelID='3'", conn2);
    conn2.Open();
    label3.Text = cmd2.ExecuteReader().ToString();
    conn2.Close();
}

データベースからラベル テキストを取得します。しかし、すべてのフェッチ操作で、クエリを作成するために接続を開きます。これは C# での私の最初のプロジェクトです。多くの接続を開かずにいくつかのクエリを作成するにはどうすればよいですか? 誰でも私を助けることができますか?

4

5 に答える 5

3
  1. using-statement例外が発生した場合でも接続が確実に閉じられるようにするために使用します。クラスが を実装するときは、常にこれを使用する必要がありますIDisposable
  2. またはConnection-Poolingを呼び出したときに、常に接続を開いたり閉じたりしているわけではありません。実際には、接続を再利用可能にするだけです。そうしないと、「使用中」とマークされます。そのため、できるだけ早く接続を閉じることをお勧めします。con.Open()con.Close()Close

a を使用して、a を 1 つのクエリでDataAdapter埋めることができます。DataTable次に、3 つのレコードすべてを取得し、必要なものを取得できます。

using (var conn = new SqlConnection("Data Source=MAZI-PC\\PROJECTACC;Initial Catalog=programDB;Integrated Security=True"))
{
    var sql = "select label_sh from label_text where label_form_labelID IN('1','2','3') and label_form='2'";
    using (var da = new SqlDataAdapter(sql, conn))
    {
        da.Fill(table); // you don't need to open a connection when using a DataAdapter
    }
}

label1.Text = table.AsEnumerable()
                   .Single(r => r.Field<int>("label_form_labelID") == 1)
                   .Field<String>("label_sh");
label2.Text = table.AsEnumerable()
                   .Single(r => r.Field<int>("label_form_labelID") == 2)
                   .Field<String>("label_sh");
label3.Text = table.AsEnumerable()
                  .Single(r => r.Field<int>("label_form_labelID") == 3)
                  .Field<String>("label_sh");

using System.Linq;forを追加する必要があることに注意してくださいLinq-To-DataTable

于 2012-10-06T20:36:11.207 に答える
2

毎回接続を閉じる必要はありません。例で SqlCommand 変数を再利用することもできます。

private void button5_Click(object sender, EventArgs e)
        {
            SqlConnection conn = new SqlConnection("Data Source=MAZI-PC\\PROJECTACC;Initial Catalog=programDB;Integrated Security=True");

            SqlCommand cmd = new SqlCommand("select label_sh from label_text where label_form='2' and label_form_labelID='1'", conn);
            conn.Open();
            label1.Text = cmd.ExecuteReader().ToString();

            cmd.CommandText ="select label_sh from label_text where label_form='2' and label_form_labelID='2'";
            label2.Text = cmd.ExecuteReader().ToString();

            cmd.CommandText = "select label_sh from label_text where label_form='2' and label_form_labelID='3'"
            label3.Text = cmd.ExecuteReader().ToString();

            conn.Close();
        }
于 2012-10-06T20:26:25.563 に答える
1

さて、私はあなたがdeDBへの接続を1つだけ作成することをお勧めします

 SqlConnection conn = new SqlConnection("Data Source=MAZI-PC\\PROJECTACC;Initial Catalog=programDB;Integrated Security=True");

次に、SQL IN演算子を使用して、このようなクエリを1つだけ作成できます。

select label_sh 
from label_text 
where label_form='2' and label_form_labelID IN ('1','2','3')

SQLIN演算子

于 2012-10-06T20:31:11.110 に答える
1

あなたはSqlConnectionすべてのSqlCommandオブジェクトのためにあなたを再利用することができます、そしてあなたが終わった後にあなたは:を閉じることができますSqlConnection

SqlConnection conn = new SqlConnection("Data Source=MAZI-PC\\PROJECTACC;Initial Catalog=programDB;Integrated Security=True");
conn.Open();

SqlCommand cmd = new SqlCommand("select label_sh from label_text where label_form='2' and label_form_labelID='1'", conn);    
label1.Text = cmd.ExecuteReader().ToString();

SqlCommand cmd1 = new SqlCommand("select label_sh from label_text where label_form='2' and label_form_labelID='2'", conn);    
label2.Text = cmd1.ExecuteReader().ToString();  


SqlCommand cmd2 = new SqlCommand("select label_sh from label_text where label_form='2' and label_form_labelID='3'", conn);   
label3.Text = cmd2.ExecuteReader().ToString();

conn.Close();

ただし、ラベルを取得するためのSQLクエリを1つ作成すると、パフォーマンスがさらに向上します。

于 2012-10-06T20:27:09.827 に答える
0

単一の接続、単一のコマンド、および単一のデータリーダーのみを必要とする別の方法を示しています。

ティムシュメルターのアプローチがあなたの場合に最も効果的ですが、これはのNextResult方法のデモですDataReader

含まれている3つのサブクエリのSQLクエリがSqlCommandセミコロンで区切られていることに注目してください。を呼び出すたびNextResultに、次のクエリに移動します。

using (var connection = new SqlConnection("Data Source=MAZI-PC\\PROJECTACC;Initial Catalog=programDB;Integrated Security=True"))
using (var command = new SqlCommand(
@"select label_sh from label_text where label_form='2' and label_form_labelID='1';
select label_sh from label_text where label_form='2' and label_form_labelID='2';
select label_sh from label_text where label_form='2' and label_form_labelID='3'", connection))
using (var reader = command.ExecuteReader())
{
    var label1 = reader["label_sh"];

    reader.NextResult();

    var label2 = reader["label_sh"];

    reader.NextResult();

    var label3 = reader["label_sh"];
}
于 2012-10-06T20:46:29.730 に答える