gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:12:13 25 4
gpt4 key购买 nike

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

我也知道这一点在 Linq to SQL 及其后继 Entity Framework 中或多或少变得没有实际意义。

但是... 假设您选择(或您的上级要求)使用普通的旧 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
}
}
}

调试和测试阶段完成后,我将上面的代码更改为:

    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
}
}
}

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

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

-- more sql here
";
}

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

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

最佳答案

内联(带或不带文字 @"..." 语法)适合短查询...但对于更长的查询,请考虑将 tsql 作为项目中的文件;作为嵌入式资源/resx,或作为平面文件。当然,到那个阶段,您可能无论如何都应该将其设为存储过程;-p

但是将它作为一个单独的文件会强制进行相同的分离,这将使以后轻而易举地变成一个存储过程(可能只需添加 CREATE PROC 等)。

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

关于c# - 在 C# 中使用 ADO.NET 格式化内联 sql 的最佳实践是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/955234/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com