我是数据库编程的初学者,无法连接到我的数据库.我使用以下代码进行连接.
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(); } }
问题是我收到异常"不允许更改'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; }
没有相应的"关闭"方法.相反,我们将依赖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; }
这些using
语句适用于实现IDisposable接口的任何对象,并且即使抛出异常,它们也可以保证您的连接处于关闭状态.
另请注意,我将CreateConnection()方法设为私有.这是因为这个类将成为您的数据访问层.通过将连接设为私有,您将强制执行一个良好的数据库层,其中与数据库通信的唯一方法是通过此类. 任何需要与数据库通信的代码都应该放在这里.如果此类开始变得太大,您可以将此方法标记internal
为非私有,并将数据访问层移动到其自己的程序集中(Visual Studio中的单独项目).关键是现在限制您的方法接受参数的强类型输入.不要尝试构建一个允许直接传入sql的泛型方法.那种方式就是疯狂.
最后,永远不要永远不要通过sa帐户从您的应用程序连接到数据库,并将您的帐户详细信息发布到公共网站就不那么光明了.