【问题标题】:Accessing Data and Connection String? [duplicate]访问数据和连接字符串? [复制]
【发布时间】:2016-03-24 13:13:13
【问题描述】:

我正在创建一个 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);

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

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

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

您能否建议代码应该如何?

【问题讨论】:

  • 您确实应该在查询中使用参数,而不是在 sql 查询中使用 +。 SqlDataAdapter 也可以使用参数,但它可能比你只使用 SqlCommand 复杂一点
  • 谢谢斯科特。我会调查的。我迷失了 C# 中所有与 SQL 相关的方法。
  • 只需编辑问题。希望重复的帖子是不同的问题

标签: c# sql connection-string configurationmanager


【解决方案1】:

当您将字符串传递给DataAdapter 时,它会在完成Fill 之后为您关闭连接。如果您将SqlConnection 传递给适配器,它会使其处于找到它的任何状态(如果关闭它会打开它,使用它,然后关闭它。如果打开它会使用它而不关闭它)。

【讨论】:

  • 我不确定我是否正确理解了您的答案。在帮助文件中,我使用的是SqlDataAdapter(string , SqlConnection),所以这意味着我传递了一个 SqlConnection 并需要关闭它。但是我也可以使用SqlDataAdapter(string) 这样就不需要关闭连接了?
  • 你是对的。你只传递一个字符串,所以你不需要关闭任何东西。
  • 在这种情况下,我应该在哪里设置连接字符串,因为我有 2 个?
  • 你在创建SqlDataAdapter时设置它,如果你有两个连接字符串使用两个SqlDataAdapters。
  • MSDN LinkFill 方法会隐式打开 DataAdapter 正在使用的连接,如果它发现连接尚未打开。如果 Fill 打开了连接,它也会在 Fill 完成时关闭连接。
【解决方案2】:

我会尽量避免“长时间运行”的连接,并将您的读取隔离到独立的方法中,就像这样;

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

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

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

这往往是微软安排事情的方式;在实体框架中你做同样的事情;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 2016-05-11
    • 2022-08-06
    • 1970-01-01
    相关资源
    最近更新 更多