SqlDataSource и «Содержит», когда запятая или пробел являются частью строки поиска

#c# #asp.net #contains #sqldatasource #comma

#c# #asp.net #экранирование #содержит #sqldatasource

Вопрос:

Я пишу приложение в Asp.net с c # в качестве кода позади. У меня есть текстовое поле («txtNameSearch») для размещения пользователем информации для фильтрации SqlDataSource и gridview, который заполняется на основе этих данных SQL. Когда пользователи помещают запятую или пробел в поле, SqlDataSource выдает ошибку исключения. Я хочу иметь возможность разрешить такой поиск, потому что в базе данных разрешена пунктуация в этом поле.

     <asp:SqlDataSource ID="Sql_NameList" runat="server" ConnectionString='<%$ ConnectionStrings:Recorder %>'
        SelectCommand="SELECT [Name], [Address1], [Address2], [CSZ], [PersonID] FROM [People] WHERE (CONTAINS([Name], @Name))">

        <SelectParameters>
            <asp:ControlParameter ControlID="txtNameSearch" PropertyName="Text" Name="Name" Type="String">
            </asp:ControlParameter>
        </SelectParameters>

    </asp:SqlDataSource>
  

Ниже приведен текст исключения:

Ошибка сервера в приложении ‘/’.

Синтаксическая ошибка рядом с ‘,’ в условии полнотекстового поиска ‘Johnson, Ma’.

Описание: Необработанное исключение произошло во время выполнения текущего веб-запроса. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

Сведения об исключении: System.Data.SqlClient.SQLException: Синтаксическая ошибка рядом с ‘,’ в условии полнотекстового поиска ‘Johnson, Ma’.

Ошибка источника:

Необработанное исключение было сгенерировано во время выполнения текущего веб-запроса. Информация о происхождении и местоположении исключения может быть идентифицирована с помощью трассировки стека исключений, приведенной ниже.

Трассировка стека:

[Исключение SQLException (0x80131904): синтаксическая ошибка рядом с ‘,’ в условии полнотекстового поиска ‘Johnson, Ma’.]
System.Data.SqlClient.SqlConnection.Ошибка onError (исключение SQLException, логическое прерывание соединения, действие 1 wrapCloseInAction) 2442126
System.Data.SqlClient.SqlInternalConnection.OnError(SqlException
exception, Boolean breakConnection, Action
1 wrapCloseInAction) 5736904 System.Data.SqlClient.TdsParser.Проверяйте исключение и предупреждение(TdsParserStateObject stateObj, логический callerHasConnectionLock, логический asyncClose) 628
System.Data.SqlClient.TdsParser.Попробуйте выполнить(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Booleanamp; dataReady) 3731
System.Data.SqlClient.SqlDataReader.Попробуйте Consumemetadata() 58
System.Data.SqlClient.SqlDataReader.get_MetaData() 89
System.Data.SqlClient.SqlCommand.FinishExecuteReader (SqlDataReader ds, RunBehavior runBehavior, строка resetOptionsString) 379
System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, логический поток возврата, логическая асинхронность, тайм-аут Int32, задача и задание, Логическое значение asyncWrite, SqlDataReader ds, логическое значение describeParameterEncryptionRequest) 2026
Система.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, логический поток возврата, строковый метод, завершение TaskCompletionSource`1, тайм-аут Int32, Taskamp; task, логический asyncWrite) 375
System.Data.SqlClient.SqlCommand.RunExecuteReader ( CommandBehavior cmdBehavior, RunBehavior runBehavior, логический поток возврата, строковый метод) 53
System.Data.SqlClient.SqlCommand.ExecuteReader (поведение командной строки, строковый метод) 240
System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(командное поведение) 41
System.Data.Обычный.DbCommand.System.Data.IDbCommand.ExecuteReader (командное поведение) 12 System.Data.Обычный.DbDataAdapter.Заполнение внутри (DataSet dataset, DataTable[] datatables datatable, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) 139
System.Data.Обычный.DbDataAdapter.Заполнить(DataSet DataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) 136
System.Data.Обычный.DbDataAdapter.Заполнить (набор данных DataSet, строка srcTable) 86
System.Web.UI.WebControls.SqlDataSourceView.ExecuteSelect(аргументы DataSourceSelectArguments) 1494
System.Web.UI.DataSourceView.Выберите(DataSourceSelectArguments аргументы, DataSourceViewSelectCallback обратный вызов) 22
System.Web.UI.WebControls.DataBoundControl.Выполняет выбор() 143
System.Web.UI.WebControls.BaseDataBoundControl.DataBind() 74
System.Web.UI.WebControls.GridView.DataBind() 9
System.Web.UI.WebControls.BaseDataBoundControl.EnsureDataBound() 114 System.Web.UI.WebControls.CompositeDataBoundControl.CreateChildControls() 75 System.Web.UI.Control.EnsureChildControls() 92 System.Web.UI.Control.PreRenderRecursiveInternal() 42
System.Web.UI.Control.PreRenderRecursiveInternal() 160
System.Web.UI.Control.PreRenderRecursiveInternal() 160
System.Web.UI.Control.PreRenderRecursiveInternal() 160
System.Web.UI.Control.PreRenderRecursiveInternal() 160
System.Web.UI.Control.PreRenderRecursiveInternal() 160
System.Web.UI.Control.PreRenderRecursiveInternal() 160
System.Web.UI.Control.PreRenderRecursiveInternal() 160
System.Web.UI.Control.Система PreRenderRecursiveInternal() 160
.Web.UI.Page.ProcessRequestMain(логическое значение includeStagesBeforeAsyncPoint, логическое значение includeStagesAfterAsyncPoint) 883

Ответ №1:

Я исправил эту проблему в коде c #, взяв текстовое поле и проверив наличие запятой или пробела. Если это существует, вокруг текста добавляются кавычки, и тогда запрос не закрывается запятой или пробелом. Смотрите код ниже:

         if (txtNameSearch.Text.Contains(",") || txtNameSearch.Text.Contains(" "))
            {
            if (txtNameSearch.Text.Contains('"'))
                {

                }
            else
                {
                txtNameSearch.Text = '"'   txtNameSearch.Text   '"';
                }
            }