Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 参数化';订购人';在SQL中_C#_Sql_Ado.net - Fatal编程技术网

C# 参数化';订购人';在SQL中

C# 参数化';订购人';在SQL中,c#,sql,ado.net,C#,Sql,Ado.net,在ADO.NET中参数化order by子句的正确方法是什么 有时需要按2列排序,而默认情况下仅按1列排序,有时您只需要将ASC更改为DEC。 在这种情况下,只使用字符串连接可以吗(前提是输入不是直接来自用户,而只是查找代码中或多或少的硬编码值)SQL注入纯粹主义者会告诉您,字符串连接是不允许的,因为总是存在另一个程序员扩展程序并向外界公开SQL语句的可能性 但是,如果这些值是硬编码的(即作为常量),并且永远看不到外部世界,那么是的,将其连接起来是完全可以的 只要不允许用户通过文本输入,或者可以

在ADO.NET中参数化order by子句的正确方法是什么

有时需要按2列排序,而默认情况下仅按1列排序,有时您只需要将ASC更改为DEC。
在这种情况下,只使用字符串连接可以吗(前提是输入不是直接来自用户,而只是查找代码中或多或少的硬编码值)

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