访问数据和连接字符串?

Accessing Data and Connection String?

我正在创建 WinForms 应用程序。我将连接字符串放在 App.config 文件中。然后创建连接字符串变量

string gLwConnStr = ConfigurationManager.ConnectionStrings["LWConnectionString"].ConnectionString;

string sql = "Select * from Users Where LoginName='" + System.Security.Principal.WindowsIdentity.GetCurrent().Name + "'";
string tbl = "User";
DataTable dt = new DataTable(tblName);
SqlDataAdapter da = new SqlDataAdapter(sql, gLwConnStr);            
da.Fill(dt);

这段代码看起来正确吗?我不像其他 post 那样调用任何 .open 命令,所以我不知道是否必须关闭以及如何关闭它。另外我只读数据,不写数据,所以我不使用上下文。其他 post 建议 "using" 但我如何在此代码中使用它?我尝试在块周围使用 returns 红线(如语法错误)

我看到其他 post 使用 sqlconnection 打开连接然后关闭连接,但我没有在这里使用它。我该如何关闭它?

我不明白为什么其他人说这个 post 是重复的。如果您认为是重复的并且已经提供了答案,请指出。抱歉,我是 C# 语言的新手,有时我看不出细微的差别。

你能建议代码应该怎样写吗?

当您将字符串传递给 DataAdapter 时,它会在执行 Fill 后为您关闭连接。如果您将 SqlConnection 传递给适配器,它会保留它所处的任何状态(如果关闭,它会打开它,使用它,然后关闭它。如果打开它,它会使用它并且不会关闭它)。

我会尽量避免 'long-running' 连接,并将您的读取隔离到独立的方法中,就像这样;

public DataTable RunMyQuery(...)
{
    using(var connection = new SqlConnection(...))
    {
         connection.Open();
         ....
    }
}

如果连接尚未关闭,using 语句的右大括号将为您关闭连接。

这种代码形式将帮助您编写不与程序其他部分交互的代码;也就是说,如果您打开一个连接并在多个地方使用它,您最终可能会遇到问题(例如,当您打开另一个数据集时,您正在读取一个数据集,并且它会阻塞多个并发读取)。

这往往是微软安排事情的方式;在 Entity Framework 你做同样的事情;

 using(var context = new MyDbContext())
 {
     ...
     context.SaveChanges();
 }