propiedades por multiple filtro ejemplos columns columnas column .net ado.net

.net - por - multiple search datatables



Forma correcta de escapar caracteres en una expresión de filtro DataTable (3)

Me gustaría saber si hay una función para escapar correctamente literales de cadena para expresiones de filtro. p.ej:

DataTable.Select(String.Format("[name] = ''{0}''", MyName))

Si MyName contiene ''o una cantidad de otros caracteres clave, se genera una excepción. La documentación de Microsoft indica que estos caracteres deben ser escapados correctamente, sin embargo, hay un poco de confusión sobre cómo hacer esto.

He intentado reemplazar ''con /' y también [''] como se indica en la documentación, sin embargo, la consulta aún falla.

Muchas gracias


Escape la comilla simple ''duplicándola a'' ''. Escape *% [] caracteres envolviendo en []. p.ej

private string EscapeLikeValue(string value) { StringBuilder sb = new StringBuilder(value.Length); for (int i = 0; i < value.Length; i++) { char c = value[i]; switch (c) { case '']'': case ''['': case ''%'': case ''*'': sb.Append("[").Append(c).Append("]"); break; case ''/''': sb.Append("''''"); break; default: sb.Append(c); break; } } return sb.ToString(); } public DataRow[] SearchTheDataTable(string searchText) { return myDataTable.Select("someColumn LIKE ''" + EscapeLikeValue(searchText) + "''"); }

Gracias a los ejemplos aquí


Si reemplazo ''con dos solo'' la consulta funciona.


/// <summary> /// <para>If a pattern in a LIKE clause contains any of these special characters * % [ ], those characters must be escaped in brackets [ ] like this [*], [%], [[] or []].</para> /// <para>If the pattern is not in a like clause then you can pass valueIsForLIKEcomparison = false to not escape brackets.</para> /// <para>Examples:</para> /// <para>- strFilter = "[Something] LIKE ''%" + DataTableHelper.EscapeLikeValue(filterValue) + "%''";</para> /// <para></para> /// <para>http://www.csharp-examples.net/dataview-rowfilter/</para> /// </summary> /// <param name="filterValue">LIKE filterValue. This should not be the entire filter string... just the part that is being compared.</param> /// <param name="valueIsForLIKEcomparison">Whether or not the filterValue is being used in a LIKE comparison.</param> /// <returns></returns> public static string EscapeFilterValue(string filterValue, bool valueIsForLIKEcomparison = true) { string lb = "~~LeftBracket~~"; string rb = "~~RightBracket~~"; filterValue = filterValue.Replace("[", lb).Replace("]", rb).Replace("​*", "[*​]").Replace("%", "[%]").Replace("''", "''''"); if (valueIsForLIKEcomparison) { filterValue = filterValue.Replace(lb, "[").Replace(rb, "]"); } else { filterValue = filterValue.Replace(lb, "[[]").Replace(rb, "[]]"); } return filterValue; }