代码之家  ›  专栏  ›  技术社区  ›  fretje

在C中使用ADO.NET格式化内联sql的最佳实践是什么#

  •  7
  • fretje  · 技术社区  · 17 年前

    我知道这里有很多关于内联sql和存储过程的问题。。。 我不想再开始这样的一次!这是关于内联(或动态)sql的。

    我还知道,这一点在LINQtoSQL及其后续实体框架中或多或少已经变得毫无意义。

    但是 假设您选择(或上级要求)使用普通的旧ADO.NET和内联(或动态)sql . 那么,在这方面和格式化sql方面的最佳实践是什么?

    我现在做的是: 我喜欢先在存储过程中创建SQL语句。这使我能够在SQLServerManagementStudio中使用语法着色,并且能够轻松地测试查询,而无需通过我正在开发的应用程序在代码中执行查询。

    因此,只要我正在实现/调试,我的代码就会如下所示:

        using (SqlConnection conn = new SqlConnection("myDbConnectionString"))
        {
            conn.Open();
            using (SqlCommand cmd = conn.CreateCommand())
            {
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.CommandText = "myStoredProcName";
                // add parameters here
                using (SqlDataReader rd = cmd.ExecuteReader())
                {
                    // read data and fill object graph
                }
            }
        }
    

        using (SqlConnection conn = new SqlConnection("myDbConnectionString"))
        {
            conn.Open();
            using (SqlCommand cmd = conn.CreateCommand())
            {
                cmd.CommandType = CommandType.Text;
                cmd.CommandText = GetQuery();
                // add parameters here
                using (SqlDataReader rd = cmd.ExecuteReader())
                {
                    // read data and fill object graph
                }
            }
        }
    

    我添加了一个额外的私有方法,例如。 GetQuery() 在其中,我复制/粘贴存储过程的整个块,如下所示:

        private string GetQuery()
        {
            return @"
        SET NOCOUNT ON;
        SELECT col1, col2 from tableX where id = @id
    
        -- more sql here
            ";
        }
    

    .

    在查询中包含换行符是一种良好的做法吗?
    是否有其他我没有想到的事情或技巧可以使这种方法更好?
    你们是怎么做的?
    还是我是唯一一个仍然使用(必须使用)内联sql的人?

    3 回复  |  直到 16 年前
        1
  •  8
  •   Marc Gravell    17 年前

    内联(带或不带文本) @"..." 语法)适用于短查询。。。但在更长的时间内,考虑将TSQL作为项目中的文件;可以作为嵌入式资源/resx,也可以作为平面文件。当然,到那个阶段,您可能无论如何都应该将它变成一个存储过程-P

    CREATE PROC

    内联的一个问题是,它使人们很容易将用户输入连接起来。。。这显然是不好的(您在示例中正确使用了参数)。

        2
  •  2
  •   James Conigliaro    17 年前

    我以前使用过.NET资源文件。这些工具对于保存特定代码库中使用的所有查询的库非常方便,特别是当同一个查询可能在多个位置使用时(是的,我意识到这也表明一些糟糕的设计,但有时您需要在给定的框中工作)。

        3
  •  0
  •   Ralph    8 年前

        const string SelectMyTable = @"
    SELECT column_one
         , column_two
         , column_three
      FROM my_table
    ";
    

    这一切都允许我剪切并粘贴到SQL manager进行测试。