C# 参数化';订购人';在SQL中
在ADO.NET中参数化order by子句的正确方法是什么 有时需要按2列排序,而默认情况下仅按1列排序,有时您只需要将ASC更改为DEC。C# 参数化';订购人';在SQL中,c#,sql,ado.net,C#,Sql,Ado.net,在ADO.NET中参数化order by子句的正确方法是什么 有时需要按2列排序,而默认情况下仅按1列排序,有时您只需要将ASC更改为DEC。 在这种情况下,只使用字符串连接可以吗(前提是输入不是直接来自用户,而只是查找代码中或多或少的硬编码值)SQL注入纯粹主义者会告诉您,字符串连接是不允许的,因为总是存在另一个程序员扩展程序并向外界公开SQL语句的可能性 但是,如果这些值是硬编码的(即作为常量),并且永远看不到外部世界,那么是的,将其连接起来是完全可以的 只要不允许用户通过文本输入,或者可以
在这种情况下,只使用字符串连接可以吗(前提是输入不是直接来自用户,而只是查找代码中或多或少的硬编码值)SQL注入纯粹主义者会告诉您,字符串连接是不允许的,因为总是存在另一个程序员扩展程序并向外界公开SQL语句的可能性
但是,如果这些值是硬编码的(即作为常量),并且永远看不到外部世界,那么是的,将其连接起来是完全可以的 只要不允许用户通过文本输入,或者可以通过url访问变量,我看不出使用字符串连接有任何负面原因。除非像下面的人所说的那样,程序可能会被其他不太“注意注入”的用户扩展。有一些纯t-SQL解决方案不使用动态SQL
- 在SQL 2005之前,您必须按顺序使用用例
- SQL 2005之后,您可以使用行号等
这里有一些答案:。被接受的答案和我的答案演示了这两种方法。不过,可能是SQL Server特有的。如果没有那么多数据,我只需要:
DataTable dt = ....
DataView dv = new DataView(dt);
dv.Sort = "LastName DESC, FistName";
然后根据需要改变最后一行。尝试如下:
SELECT ...
ORDER BY
CASE WHEN @OrderBy = 'Option1' THEN SomeField END,
CASE WHEN @OrderBy = 'Option1' THEN SomeOtherField END DESC,
CASE WHEN @OrderBy = 'Option2' THEN Field75 END,
...
其思想是,如果WHEN不匹配,则每个CASE语句的计算结果都将为NULL。所以如果你把选项2放进去,那么前两个选项就会得到一个常量
因此,使用它,您可以很容易地获得一些选项,这些选项允许您按多个字段进行排序,或者按降序排序,或者根据需要进行排序
Rob样本:
SELECT 1 AS Num, '2015-06-22' AS Datex INTO Arya
INSERT INTO Arya
SELECT 2, '2015-08-17' UNION SELECT 3, '2015-07-14'
雅利雅表:
Num Datex
-----------------
1, 2015-06-22
2, 2015-08-17
3, 2015-07-14
现在,在选择中参数化排序(基于Datex字段)
SELECT Num, Date1 FROM ARYA, (SELECT -1 as e union Select 1 as e) a
WHERE a.e=1 --(1) For ASC sort --(OR a.e=-1) For Desc Sort
ORDER BY DATEDIFF(DAY, '2000-01-01', Arya.Datex)*a.e
Result: ASC Sort IF 1
1, 2015-06-22
3, 2015-07-14
2, 2015-08-17
Result: ASC Sort IF -1
2, 2015-08-17
3, 2015-07-14
1, 2015-06-22
这是可行的,但当您有时需要@Sortby1,有时需要@Sortby1,@Soryby2时,您会怎么做?只是一些字符串操作?不在SQL Server中。使用MS客户端(根据标记)可能意味着使用SQL Server