Bis*_*tro 2 .net c# sql-server
我有以下简单的类定义(Windows控制台应用程序):
样品按预期进行
using System;
namespace ConsoleApplication1 {
class Test: IDisposable {
string Text;
public Test(string str) {
Text = str;
}
public void print() {
Console.WriteLine("Text: " + Text);
}
public void Dispose() {
Text = "";
}
}
class Program {
static void Main(string[] args) {
string TeXT = "Data Source=localhost;Initial Catalog=master;";
using (Test test = new Test(TeXT)) {
test.print();
}
using (Test test = new Test(TeXT)) {
test.print();
}
Console.ReadKey();
}
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,我传递string给一个IDisposable类test.一旦代码超出范围,它就会被处理掉.正如预期的那样TeXT,在第一次处理测试后没有触及局部变量,并且可以像测试类一样访问第二个测试类实例.
现在这是真实的场景让我头疼了好几个小时.
实际结果
using System;
using System.Data;
using System.Data.SqlClient;
namespace ConsoleApplication1 {
class Test: IDisposable{
SqlConnection dbConn;
public Test(SqlConnection connection){
dbConn = connection;
}
public void print(){
Console.WriteLine("Connection" + dbConn.ConnectionString);
}
public void Dispose() {
dbConn.Dispose();
}
}
class Program {
static void Main(string[] args) {
SqlConnection sqlConn = new SqlConnection("Data Source=localhost;Initial Catalog=master;");
using(Test test = new Test(sqlConn)){
test.print();
}
using(Test test = new Test(sqlConn)){
test.print();
}
Console.ReadKey();
}
}
}
Run Code Online (Sandbox Code Playgroud)
与我之前传递SqlConnection给第一个test类的实例相同.处理完第一个实例后,SqlConnection丢失连接字符串.这使得它不适用于下一个类实例.
问题 为什么在第二种情况下我丢失了ConnectionString?这是一个错误还是故意的?是否有任何解决方案可以避免这种情况,除了与DB Server建立多个连接?我应该停止处理内部连接实例吗?
注意 SqlCommand-SqlConnection使用Disposing问题不回答我的问题
SqlConection当你处置掉的时候你处理了Test- 但是你又试图再次使用它.
最好的方法几乎总是在SqlConnection每次需要时创建一个新的- 并在完成后立即处理它.您已经在做第二部分了,但是您应该为第二部分创建一个新SqlConnection实例.
请注意,这并不意味着必须与服务器建立多个连接 - .NET连接池将处理需要多少实际网络连接.