【问题标题】:Recycling SQLConnection in C# Code Multiple Times在 C# 代码中多次回收 SQLConnection
【发布时间】:2020-05-15 16:02:58
【问题描述】:

当需要在一个简短的脚本中读取多个数据库时,我需要学习一些我从未完全掌握的东西。基本上,改变的只是 SQL 命令,但我似乎对如何重用连接和连接器感到困惑。为了简单起见,我将给出三个我需要执行并分配给 int 变量的 SQL 命令。

string Command1 = "";
string Command2 = "";
string Command3 = "";
int doorcount = 0;
int tirecount = 0;
int windowcount = 0;

Command1 = "SELECT DoorCount From Cars WHERE Car = 'Civic'";
Command2 = "SELECT TireCount FROM Vehicles WHERE VehicleType = 'Motorcycle'";
COmmand3 = "SELECT WindowCount FROM House WHERE HouseType = 'Ranch'";

string Connection_String = Properties.Settings.Default.Innovate_Loan_ServicingConnectionString.ToString();
            SqlConnection Conn = new SqlConnection(Connection_String);
            SqlCommand Comm1 = new SqlCommand(Command1, Conn);
            Conn.Open();
            SqlDataReader DR1 = Comm1.ExecuteReader();
            DataTable dt = new DataTable();
            dt.Load(DR1);
            Conn.Close();
       doorcount = dt.Rows[0]["DoorCount"];

此时我需要进行第二次和第三次查询,但如何回收连接?什么是语法,所以我不必继续重新创建东西?

【问题讨论】:

  • 在处理多个连接时有效地回收命令......非常复杂;但是,在大多数情况下,这不是必需的;坦率地说,我只会使用 Dapper 或类似的东西,让它担心所有的混乱。另外:请注意,您可能想查看“参数” - 同样,Dapper 会帮助您。很高兴通过 Dapper 发布一个示例,但坦率地说:我已经多年没有在应用程序代码中编写手动命令/参数创建了,正是因为这个原因——它对你来说并不是有用的代码搞砸

标签: c# sql connection


【解决方案1】:

如果您愿意使用像 Dapper 这样的工具(为想要编写自己的 SQL 但又不想弄乱 ADO 细节的人而设计 .NET API):

using (var conn = new SqlConnection(Connection_String))
{
    conn.Open();
    doorCount = conn.QuerySingle<int>("SELECT DoorCount From Cars WHERE Car = 'Civic'");
    tirecount = conn.QuerySingle<int>("SELECT TireCount FROM Vehicles WHERE VehicleType = 'Motorcycle'");
    windowcount = conn.QuerySingle<int>("SELECT WindowCount FROM House WHERE HouseType = 'Ranch'");
}

还有一些选项可以在单个操作中发出所有 3 个操作并通过多网格读取器使用结果,或者将它们作为单行的单独列读取等。或者添加参数(如果文字像'Civic' 实际上是数据输入)。以使用参数为例:

string car = "Civic"; // actually from input somewhere
// ...
doorCount = conn.QuerySingle<int>("SELECT DoorCount From Cars WHERE Car = @car",
    new { car } // named parameters expressed as an anonynmous type instance
);

【讨论】:

  • 由于 OP 直接传递过滤条件,Dapper 会处理潜在的 SQL 注入问题吗?您可能已经在上面的评论中指出......但我只是想仔细检查
  • @Barns 正如我所暗示的:如果你使用参数;我将编辑正文以显示如何
  • 感谢您的代码,但是,在这种情况下,我不允许使用任何开箱即用的东西。我知道,与时俱进。看起来很酷。可惜我不能用它。
  • @user3179585 then: 除了你自己写的那些,没有任何捷径
  • @Arman dapper 处理所有命令/参数/读取器位-因此您不必这样做。在发出 3 个连续查询时不必担心池化:只需:在同一个托管连接实例上发出它们。 MARS 几乎总是应该像瘟疫一样被避免——多网格命令会更简单
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-26
相关资源
最近更新 更多