将SQL存储在变量中的最佳方法

时间:2011-08-04 12:19:49

标签: c# sql adhoc-queries

目前我将查询放在这样的变量中。

query = @"  select top 1
                u.UserID
            from
                dbo.Users u
            where
                u.SystemUser = 1
                and u.Status = @Status";

这个问题是当换到新行时缩进会丢失,我必须自己添加。

有谁知道更好的方法?我知道存储过程是可能的(消除这种缩进问题),但我不确定它们是否对于纯数据检索更好。

5 个答案:

答案 0 :(得分:6)

忽略TSQL仇恨者;了解一些TSQL并没有什么本质上的错误!无论如何,我会接近这个(如果我保留你的格式,这不是我的常态 - 但是...... meh);

                // your existing code at, say, this level
                var query = @"
select top 1
      u.UserID
from
      dbo.Users u
where
      u.SystemUser = 1
      and u.Status = @Status";

                // some more code at, say, this level

通过将TSQL保持在左侧,任何缩进等在IDE中都更容易实现,但它也使您的TSQL更短,并且在查看跟踪时更容易调试,因为它并不奇怪30-在select之前以换行符开头也有助于保持整洁。

就个人而言,我也发现代码缩进和TSQL缩进之间的脱节有助于找到TSQL - 而TSQL对我来说非常重要,所以这是好东西。并且强调我们刚刚改变“世界”(因为缺少一个更好的术语)也没有害处。

答案 1 :(得分:3)

您至少应该考虑使用LINQ。它确实有学习曲线,但它会为您提供编译器检查查询语法的优势。

您没有说这是否是一个Web应用程序,但是如果您从用户输入(例如从Web URL或从浏览器发布的数据)获得对查询的任何输入,则将用户输入嵌入到字符串中在发送到查询引擎之前,与其他执行查询的方法相比,SQL注入攻击的风险更大。

使用Entity Framework是另一种出色的方法。我最近使用了Code First方法,非常优雅。最后,存储过程也是一种很好的方法。

答案 2 :(得分:1)

您可以随时执行此操作:

query = " select top 1"
      + "     u.UserID"
      + " from"
      + "     dbo.Users u"
      + " where"
      + "     u.SystemUser = 1"
      + "     and u.Status = @Status";

至少这样,你的IDE会缩进字符串,而不是SQL。如果你这样做,你必须小心为每一行添加一个前导空格。

更好的选择是使用LINQ:

result = (from
             u in dbo.Users
         select
             u.userId
         where
             u.SystemUser == 1 &&
             u.Status = @Status
).Take(1)

答案 3 :(得分:1)

首先,只有人类能够看到它时,SQL的格式才是重要的。

如果确实想要保留缩进,可以将字符串放在资源中(在资源编辑器中使用SHIFT + ENTER插入新行)。感谢Visual Studio魔术,访问资源很容易(Properties.Resources。*)。

如果您使用的是WPF,您还可以使用XAML资源。

答案 4 :(得分:0)

或者您可以使用不同的方式来获取pure data 你可以用

stored procedues
LINQ 2 SQL
Entity Framework
ADO.NET

硬编码的sql语法不是最佳实践。