【问题标题】:C# ADO.NET Loading SQL Script with Multiple Statements and CommentsC# ADO.NET 加载带有多个语句和注释的 SQL 脚本
【发布时间】:2016-11-02 13:53:24
【问题描述】:

我正在构建一个应用程序,在该应用程序中,我将根据针对多个不同数据库和服务器执行的一些 SQL 查询的结果生成一些报告。由于我无法在每台服务器上创建存储过程,我将我的 SQL 脚本保存在本地,将它们加载到我的 C# 应用程序中,并使用 ADO.NET 对每台服务器执行它们。所有的 SQL 脚本都是返回表的选择,但是,其中一些比其他的更复杂,并且涉及对要连接的表变量的多个选择,如下面的超级基本示例。

我的问题是,使用 ADO.NET,是否可以分配多个 SQL 查询的字符串,最终只将单个数据表返回给 SqlCommand 对象 - 例如下面的两个 SELECT 语句构成了我的完整脚本?还是我必须创建一个事务并将每个单独的查询作为自己的命令单独执行?

-- First Select
SELECT *
INTO #temp
FROM Table1;

--Second Select
SELECT *
FROM Table1
JOIN #temp
ON Table1.Id = #temp.Id;

此外,我的一些脚本中嵌入了 cmets,就像上面的基本示例一样 - 这些是需要删除还是在字符串中被有效地忽略?这似乎适用于单个查询,换句话说,“--This is a comment”被有效地忽略了。

    private void button1_Click(object sender, EventArgs e)
    {
        string ConnectionString = "Server=server1;Database=test1;Trusted_Connection=True";
        using (SqlConnection conn = new SqlConnection(ConnectionString))
        {

            SqlCommand cmd = new SqlCommand("--This is a comment \n SELECT TOP 10 * FROM dbo.Tablw1;");
            DataTable dt = new DataTable();
            SqlDataAdapter sqlAdapt = new SqlDataAdapter(cmd.CommandText.ToString(), conn);
            sqlAdapt.Fill(dt);
            MessageBox.Show(dt.Rows.Count.ToString());
        }
    }

【问题讨论】:

  • 我相信你可以,但你为什么不试试呢?为什么要问一个您可以通过简单的测试轻松回答的问题?
  • @ScottHannen,我认为您误读了这个问题。他的多语句命令只会产生一个结果集。
  • 你是对的。我做到了。

标签: c# sql-server ado.net


【解决方案1】:

是的,这绝对没问题。评论被忽略。它应该可以正常工作。唯一需要注意的是临时表的作用域——如果你习惯于使用存储过程,那么作用域是临时的(它们在存储过程结束时被删除);使用直接命令:不是——它们是特定于连接的,但在多个操作之间存在。如果这是一个问题,请查看“表变量”。

注意:技术上这取决于后端提供商;假设您使用的是标准数据库引擎,您会没事的。如果您使用的是异国情调的东西,那么这可能是一个真正的问题。例如,它可能不适用于“Bob 自制的 OneNote ADO.NET 提供程序”。

【讨论】:

    【解决方案2】:

    我不使用 ado.net,我使用实体框架,但我认为这更像是一个 SQL 问题而不是 ADO.NET 问题;如果我错了,请原谅我。如果您在两个查询中都从 Table1 中进行选择,我认为您应该改用此查询。

    选择 * 从表 1 tbl1 加入Table1 tbl2 在 tbl1.id = tbl2.id

    实际上,我真的看不出有什么理由必须使用可用的通用表表达式等选项将内容移动到临时表中。 如果您还不了解 CTE,请查找它们

    https://www.simple-talk.com/sql/t-sql-programming/sql-server-cte-basics/

    【讨论】:

      【解决方案3】:

      是的,你可以积极地做到这一点。 您可以使用不同类型的集合,或者使用字符串生成器来传递查询,即使您可以放置​​字符串变量并将查询分配给它。

      当循环在临时表或 CTE 中运行时,它完全取决于您选择的方法。并将数据添加到数据表中。

      因此,如果您希望插入或更新或删除整个数据,那么您可以进行交易,这不会有任何问题。

      【讨论】:

        猜你喜欢
        • 2010-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-06
        • 1970-01-01
        • 2012-09-08
        • 1970-01-01
        • 2018-06-27
        相关资源
        最近更新 更多