我知道这里有很多关于内联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的人?
内联(使用或不使用文字@"..."语法)适用于短查询...但是对于更长的内容,请考虑将tsql作为项目中的文件; 要么是嵌入式资源/ resx,要么是平面文件.当然,在那个阶段,无论如何你应该把它变成一个存储过程;-p
但是将它作为一个单独的文件强制使用相同的分隔,这将使以后变成存储过程变得轻而易举(可能只是添加CREATE PROC等).
内联的一个问题 - 它使某些人很容易连接用户输入......这显然很糟糕(你在示例中正确使用了参数).
| 归档时间: |
|
| 查看次数: |
3066 次 |
| 最近记录: |