1

アプリケーション内で使用して、データベースに簡単に接続し、必要に応じてクエリを実行できるクラスを作成しようとしています。この投稿を見つけましたが、期待どおりに機能していません。

これが私のクラスです:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
//a class that returns a connection to the database
namespace epaCUBE_Utility_Tool
{
    public class epaCUBE_DB
    {

        public static SqlConnection GetConnection()
        {
            string str = "user id=MyUserName;" +
               "password=MyPassword;server=myServer;" +
               "database=myDatabase; " +
               "connection timeout=30";

            SqlConnection con = new SqlConnection(str);
            con.Open();
            return con;
        }            
    }
}

そして、これが私がそれを使用しようとしている方法です:

 private void button1_Click(object sender, EventArgs e)
 {    
     var connection = epaCUBE_DB.GetConnection();
     connection.Open();    
     SqlDataReader rdr = null;
     string CommandText = "SELECT Field1, Field2 FROM TableName";    
     SqlCommand cmd = new SqlCommand(CommandText, connection);    
     rdr = cmd.ExecuteReader();
     while (rdr.Read())
     {
         this.comboBox1.Items.Add(rdr["Field1"].ToString() + 
  ": " + rdr["Field2"].ToString());
     }
     connection.Close();
 }

ボタンを押すとエラーになる

InvalidOperationException: 接続が閉じられませんでした。接続の現在の状態はオープンです。

私は何を間違っていますか?ありがとう、レスリー

4

4 に答える 4

2

GetConnectionOpenがあなたを呼び出しますが、 を呼び出した後に手動で再度呼び出していますGetConnectionGetConnection内側または外側と呼びますが、両方ではありません。

于 2013-07-24T03:19:50.390 に答える
1

問題は、GetConnection()すでに接続を開いていることです。これらの問題はすべて、静的メソッドに付属していました。これは良い方法ではありませんSqlConnection。必要に応じて新しいインスタンスを作成し、使用後に破棄することをお勧めします。基礎となる接続プーリングは、物理接続を管理できます。

UIをデータアクセスで分離します。ここでは、データベースからデータを読み取り、同時にアイテムをコントロールに追加します。コードをリファクタリングする必要があります。

以下のような方法でデータを取得できます

public List<string> GetFields()
{
    List<string> fields = new List<string>();
    string CommandText = "SELECT Field1, Field2 FROM TableName";
    using (var connection = new SqlConnection(epaCUBE_DB.GetConnectionString()))
    {
        connection.Open();
        using (var cmd = new SqlCommand(CommandText, connection))
        using (var reader = cmd.ExecuteReader())
        {

            while (reader.Read())
            {
                fields.Add(reader["Field1"].ToString() + ": " + reader["Field2"].ToString());
            }
        }
    }
    return fields;
}
于 2013-07-24T04:03:02.107 に答える
0

すでに開いている接続を開こうとすると、例外が発生します。接続を開く前に、接続ステータスを確認してから接続を開きます

cmd.Connection.Open();

次のチェック/クリーンアップ コードを追加します。

if (cmd.Connection.State == ConnectionState.Open)
{
    cmd.Connection.Close();
}
于 2013-07-24T03:20:45.533 に答える