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

GetConnection呼叫Open您,但您在呼叫后再次手动呼叫它GetConnection。叫它在里面GetConnection或外面,但不是两个地方。

于 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 回答
0

我非常防御性地编程;我预计会发生故障并尝试优雅地处理它。

像这样..

// Define this once in a class and re-use for every connection..
string myConnString = "user id=MyUserName;" +
       "password=MyPassword;server=myServer;" +
       "database=myDatabase; " +
       "connection timeout=30";

    using (SqlConnection mySqlConnection = new SqlConnection(myConnString))
    {
        using (SqlCommand mySQLCommand = new SqlCommand("SELECT Field1, Field2 FROM TableName", mySqlConnection) { CommandType = CommandType.Text})
        {
            try
            {
                mySqlConnection.Open();
                using (SqlDataReader rdr = mySQLCommand.ExecuteReader())
                {
                    this.comboBox1.Items.Add(rdr["Field1"].ToString() + ": " + rdr["Field2"].ToString());
                }
            }
            catch (Excecption e)
            {
              // Deal with it as you wish
            }
            mySqlConnection.Close();
         }
     }
于 2013-07-24T04:08:28.990 回答