我正在尝试创建一个可以在我的应用程序中使用的类,以便轻松连接到我的数据库并根据需要运行查询。我找到了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:未关闭连接。连接的当前状态是打开的。
我做错了什么? 谢谢, 莱斯利
答案 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();
}
}