连接数据库

时间:2013-07-24 03:16:09

标签: c# database

我正在尝试创建一个可以在我的应用程序中使用的类,以便轻松连接到我的数据库并根据需要运行查询。我找到了this帖子,但它并没有像我期望的那样工作。

这是我的班级:

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 个答案:

答案 0 :(得分:2)

GetConnection为您拨打Open,但是在您拨打GetConnection后再次手动呼叫它。在GetConnection或其他地方调用它,但不要在两个地方调用。

答案 1 :(得分: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;
}

答案 2 :(得分:0)

您正在尝试打开已打开的连接,这会导致异常。 在打开连接之前检查连接状态,然后打开连接

cmd.Connection.Open();

添加以下检查/清理代码:

if (cmd.Connection.State == ConnectionState.Open)
{
    cmd.Connection.Close();
}

答案 3 :(得分: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();
         }
     }