【发布时间】:2009-06-05 10:33:39
【问题描述】:
我知道这里有很多关于内联 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
}
}
}
调试和测试阶段完成后,我将上面的代码更改如下:
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 代码,我可以轻松地恢复代码以再次调用存储过程,一旦完成,我可以通过复制/粘贴轻松地将 sql 代码放回原处, 不必在每一行都加上引号和类似的东西。
在查询中包含换行符是一种好习惯吗?
还有其他我没有想到的东西或技巧可以使这种方法更好吗?
你们是怎么做这样的事情的?
还是只有我一个还在使用(必须使用)内联 sql?
【问题讨论】:
-
LINQ-to-SQL 不是“正式死亡”;它仍然是一个持续开发的受支持产品;简而言之,EF 正在关注新功能。
-
抱歉只是引用了我在其他问题中找到的内容...删除它;-)