本實施例描述的語法DataView.RowFilter 表達。它顯示了如何使用轉義值的方法正確構建表達式字符串(不帶“ SQL注入”)。
列名
如果列名稱包含任何這些特殊字符~
(
)
#
\
/
=
>
<
+
-
*
%
&
|
^
'
"
[
]
,則必須將列名稱括在方括號內[
]
。如果列名包含右括號]
或反斜杠\
,請使用反斜杠(\]
或\\
)將其轉義。
[C#]
dataView.RowFilter = “ id = 10” ; //列名“ id”中沒有特殊字符 dataView.RowFilter = “ $ id = 10” ; //列名“ $ id”中沒有特殊字符 dataView.RowFilter = “ [#id] = 10” ; //列名“ #id”中的特殊字符“#” dataView.RowFilter = “ [[id \]] = 10” ; //列名“ [id]”中的特殊字符
文字
字符串值用單引號引起來 '
'
。如果字符串包含單引號 '
,則引號必須加倍。
[C#]
dataView.RowFilter = “名稱='約翰'” //字符串值 dataView.RowFilter = “名稱='約翰'A'''” // //用單引號引起來的字符串“ John'A '” dataView.RowFilter = String .Format (“ Name ='{0}'”,“ John'A '” .Replace(“'”,“”“)));
數字值不包含在任何字符中。這些值應與不變或英語文化的結果int.ToString()
或 float.ToString()
方法相同。
[C#]
dataView.RowFilter = “年份= 2008” //整數值 dataView.RowFilter = “價格= 1199.9” //浮點值 dataView.RowFilter = String .Format (CultureInfo .InvariantCulture.NumberFormat, “ Price = {0}”,1199.9f);
日期值包含在尖括號內 #
#
。日期格式與DateTime.ToString()
不變或英語文化的方法的結果相同 。
[C#]
dataView.RowFilter = “ Date =#12/31/2008#” //日期值(時間為00:00:00) dataView.RowFilter = “ Date =#2008-12-31#” //也支持此格式 dataView.RowFilter = “日期=#12/31/2008 16:44:58#” //日期和時間值 dataView.RowFilter = String .Format (CultureInfo .InvariantCulture.DateTimeFormat,“ Date =#{0}#”,新的 DateTime(2008,12,31,16,44,58 ));
或者,您可以將所有值括在單引號中'
'
。這意味着您可以將字符串值用於數字或日期時間值。在這種情況下,將使用當前區域性將字符串轉換為特定值。
[C#]
dataView.RowFilter = “ Date = '12 / 31/2008 16:44:58'” //如果當前區域性是英語 dataView.RowFilter = “ Date = '31 .12.2008 16:44:58'” //如果當前區域性是德國人 dataView.RowFilter = “ Price ='1199.90'” // //如果當前區域性是英語 dataView.RowFilter = “ Price ='1199,90'” //如果當前區域性是德語
比較運算符
等於,不等於,更少,更大的運算符用於僅包含適合比較表達式的值。您可以使用這些運算符=
<>
<
<=
>
>=
。
注:字符串比較是 文化的敏感,它使用的CultureInfo從DataTable.Locale 相關表的屬性(dataView.Table.Locale
)。如果未顯式設置該屬性,則其默認值為DataSet.Locale(並且其默認值為當前系統區域性Thread.CurrentThread.CurrentCulture)。
[C#]
dataView.RowFilter = “ Num = 10” //數字等於10 dataView.RowFilter = “ Date <#1/1/2008#” //日期小於1/1/2008 dataView.RowFilter = “名稱<> 'John'“ //字符串不等於' John'dataView.RowFilter = ” Name> ='Jo'“ //字符串比較
運算符IN用於僅包括列表中的值。您可以將運算符用於所有數據類型,例如數字或字符串。
[C#]
dataView.RowFilter = “ Id IN(1、2、3)” //整數值 dataView.RowFilter = “價格IN( 1.0,9.9,11.5 )” //浮點值 dataView.RowFilter = “名稱IN('John', 'Jim','Tom')“ //字符串值 dataView.RowFilter = ”日期輸入(#12/31/2008#,#1/1/2009#)“ //日期時間值 dataView.RowFilter = “ Id NOT IN(1、2、3)” //不在列表中的值
運算符LIKE用於僅包含與通配符匹配模式的值。通配符為*
或 %
,它可以在模式的開頭,'*value'
結尾'value*'
或兩者都在'*value*'
。通配符在百通的中間'va*lue'
是不允許的。
[C#]
dataView.RowFilter = “ Name LIKE'j *'” //以'j' 開頭的值 dataView.RowFilter = “ Name LIKE'%jo%'” //包含'jo'的值 dataView.RowFilter = “名稱 不像'j *'” //不以'j'開頭的值
如果在LIKE子句模式包含任何這些特殊字符 *
%
[
]
,這些字符必須用括號逃脫[
]
這樣 [*]
,[%]
,[[]
或[]]
。
[C#]
dataView.RowFilter = “ Name LIKE'[*] *'” //以'*' 開頭的值 dataView.RowFilter = “ Name LIKE'[[] *'” // //以'['開頭的值
下面的方法對LIKE子句中使用的文本值進行轉義。
[C#]
公共靜態字符串 EscapeLikeValue(字符串 valueWithoutWildcards) { StringBuilder sb = new StringBuilder(); 為(int i = 0; i <valueWithoutWildcards.Length; i ++) { char c = valueWithoutWildcards [i]; 如果(c == '*' || c == '%' || c == '[' || c == ']') sb.Append(“ [”).Append(c).Append(“]”); 否則(c == '\'') sb.Append(“''”); 其他 sb.Append(c); } 返回 sb.ToString(); }
[C#]
//選擇所有以值字符串(在本例中為“ *”)開頭的
字符串 value = “ *” ; // dataView.RowFilter將是:“ Name LIKE'[*] *'” dataView.RowFilter = String .Format (“ Name LIKE'{0} *'”,EscapeLikeValue(value));
布爾運算符
布爾運算符AND
,OR
並且NOT
被用來連接表達式。運算符NOT優先於AND運算符,並且優先於OR運算符。
[C#]
//運營商,擁有優先級高於OR運算符,括號需要 dataView.RowFilter = “城市= '東京' AND(年齡<20或年齡> 60)” ; //以下示例執行相同的 dataView.RowFilter = “ City <>' Tokyo'AND City <>'Paris'” ; dataView.RowFilter = “沒有城市='東京'而沒有城市='巴黎'” ; dataView.RowFilter = “否(城市=“東京”或城市=“巴黎”)”; dataView.RowFilter = “城市不在('東京','巴黎')” ;
算術和字符串運算符
算術運算符是加+
,減-
,乘*
,除 /
和模%
。
[C#]
dataView.RowFilter = “母親年齡-<20歲”; //母親年輕的人 dataView.RowFilter = “年齡%10 = 0” ; //十年生日的人
還有一個字符串運算符 串聯 +
。
親子關系參照
甲 父表可以在表達式中使用父列名與被引用Parent.
的前綴。在A柱 子表可以使用兒童列名與引用 Child.
前綴。
對子列的引用必須在聚合函數中,因為子關系可能返回多行。例如,表達式SUM(Child.Price)
返回子表中與父表中的行相關的所有價格的總和。
如果一個表具有多個子關系,則前綴必須包含關系名稱。例如,表達式Child(OrdersToItemsRelation).Price
使用名為OrdersToItemsRelation的關系引用子表中的Price列。
匯總功能
支承有下列聚合函數SUM
, COUNT
,MIN
,MAX
,AVG
(平均), STDEV
(統計標准偏差)和 VAR
(統計方差)。
本示例顯示在單個表上執行的聚合函數。
[C#]
//選擇具有高於平均工資數據的人 View.RowFilter = “ Salary> AVG(Salary)” ;
以下示例顯示了在具有父子關系的兩個表上執行的聚合函數。假設有帶有父子關系的表Orders和Items。
[C#]
//選擇具有5個以上項目的訂單 dataView.RowFilter = “ COUNT(Child.IdOrder)> 5” ; //選擇總價(商品總價)大於或等於$ 500的 訂單dataView.RowFilter = “ SUM(Child.Price)> = 500” ;
功能
還支持以下功能。詳細說明可以在這里找到DataColumn.Expression。
CONVERT
–將特定的表達式轉換為指定的.NET Framework類型LEN
–獲取字符串的長度ISNULL
–檢查表達式,然后返回檢查的表達式或替換值IIF
–根據邏輯表達式的結果獲取兩個值之一TRIM
–刪除所有前導和尾隨空白字符,例如\ r,\ n,\ t,,'SUBSTRING
–從字符串中的指定點開始獲取指定長度的子字符串