我是数据库编程的初学者,无法连接到我的数据库.我使用以下代码进行连接.
public class dbOpnClse
{
SqlConnection con = new SqlConnection();
public SqlConnection openConnection()
{
con.ConnectionString ="server=SERVERNAME;database=Test;uid=###;pwd=#####";
con.Open();
return con;
}
public void closeConnection()
{
con.Close();
}
}
Run Code Online (Sandbox Code Playgroud)
问题是我收到异常"不允许更改'ConnectionString'属性.连接的当前状态是打开的." 此连接代码中是否有任何错误?请帮忙!我正在使用C#.net 2005和SQL Server 2000
我最好的猜测是你第二次调用openConnection时还没有关闭它,所以你试着设置一个已经打开的连接的connectionstring属性.这是不允许的.
相反,在.Net中,您希望您的openConnection()样式方法在每次调用时实际创建一个新连接,沿着工厂模式,以便可以正确处理连接.更像这样的东西:
private SqlConnection CreateConnection()
{
//even better if the connection string is pulled from a config file
var result = new SqlConnection("Your connection string here");
result.Open();
return result;
}
Run Code Online (Sandbox Code Playgroud)
没有相应的"关闭"方法.相反,我们将依赖IDisposable模式来确保连接始终正确关闭.然后你将在这样的方法中使用该函数和连接:
public DataTable GetRecords(int SomeValue)
{
var result = new DataTable();
string sql = "SELECT * FROM [MyTable] WHERE [SomeIntColumn]= @SomeValue";
using (var cn = CreateConnection() )
using (var cmd = new SqlCommand(sql, cn) )
{
cmd.Parameters.Add("@SomeValue", SqlDbType.Int).Value = SomeValue;
using (var rdr = cmd.ExecuteReader() )
{
result.Load(rdr);
}
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
这些using语句适用于实现IDisposable接口的任何对象,并且即使抛出异常,它们也可以保证您的连接处于关闭状态.
另请注意,我将CreateConnection()方法设为私有.这是因为这个类将成为您的数据访问层.通过将连接设为私有,您将强制执行一个良好的数据库层,其中与数据库通信的唯一方法是通过此类. 任何需要与数据库通信的代码都应该放在这里.如果此类开始变得太大,您可以将此方法标记internal为非私有,并将数据访问层移动到其自己的程序集中(Visual Studio中的单独项目).关键是现在限制您的方法接受参数的强类型输入.不要尝试构建一个允许直接传入sql的泛型方法.那种方式就是疯狂.
最后,永远不要永远不要通过sa帐户从您的应用程序连接到数据库,并将您的帐户详细信息发布到公共网站就不那么光明了.