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

fre*_*tje 7 c# sql ado.net

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

我也知道这一点对Linq to SQL及其后续实体框架或多或少都没有意义.

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

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

所以只要我正在实现/调试,我的代码看起来像这样:

    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
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

一旦调试和测试阶段完成,我就像这样更改上面的代码:

    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
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

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

    -- more sql here
        ";
    }
Run Code Online (Sandbox Code Playgroud)

像这样工作的好处是,如果我以后必须调试/更新sql代码,我可以轻松地还原代码再次调用存储过程,一旦完成,我可以轻松地将sql代码重新复制/粘贴,而无需在每一行和类似的东西周围加上引号.

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

Mar*_*ell 8

内联(使用或不使用文字@"..."语法)适用于短查询...但是对于更长的内容,请考虑将tsql作为项目中的文件; 要么是嵌入式资源/ resx,要么是平面文件.当然,在那个阶段,无论如何你应该把它变成一个存储过程;-p

但是将它作为一个单独的文件强制使用相同的分隔,这将使以后变成存储过程变得轻而易举(可能只是添加CREATE PROC等).

内联的一个问题 - 它使某些人很容易连接用户输入......这显然很糟糕(你在示例中正确使用了参数).

  • resx将是我的偏好 - 所以不,你不会部署任何东西.只需创建一个资源文件和一些tsql文件,然后将tsql拖到资源设计器表面上......完成工作. (2认同)