SqlDataSource "Contains"当逗号或空格是搜索字符串的一部分时

本文关键字:quot 一部 分时 字符串 空格 Contains SqlDataSource 搜索 | 更新日期: 2023-09-27 18:14:02

我正在用c#编写一个Asp.net应用程序。我有一个文本框("txtNameSearch"),用于用户将信息放入其中以过滤SqlDataSource,还有一个网格视图,根据该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'中','附近出现语法错误。

描述:在执行过程中发生未处理的异常当前的web请求。请查看堆栈跟踪了解更多信息有关错误及其在代码中的起源的信息。

异常详细信息:System.Data.SqlClient.SqlException: Syntax error在全文检索条件"Johnson, Ma"中,在","附近查找。

源错误:

的过程中产生了一个未处理的异常当前的web请求。关于来源和地点的信息可以使用下面的异常堆栈跟踪来识别异常。

堆栈跟踪:

[SqlException (0x80131904):全文中','附近的语法错误。搜索条件'Johnson, Ma'.]
System.Data.SqlClient.SqlConnection。OnError (SqlException异常,断开连接,动作1 wrapCloseInAction) +2442126
System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action
(wrapCloseInAction)+ 5736904 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning (TdsParserStateObjectstatobj, Boolean callerHasConnectionLock, Boolean asyncClose) +628
System.Data.SqlClient.TdsParser。TryRun (RunBehavior RunBehavior,SqlCommand cmdHandler, SqlDataReader dataStreamBulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObjectstateObj Boolean&dataReady) + 3731
System.Data.SqlClient.SqlDataReader.TryConsumeMetaData () + 58
System.Data.SqlClient.SqlDataReader.get_MetaData () + 89
System.Data.SqlClient.SqlCommand。FinishExecuteReader (SqlDataReader ds,RunBehavior RunBehavior, String resetOptionsString) +379
System.Data.SqlClient.SqlCommand.RunExecuteReaderTds (CommandBehaviorRunBehavior, RunBehavior,布尔值async, Int32 timeout, Task&asyncWrite, SqlDataReaderds,布尔值descripbeparameterencryptionrequest) +2026
System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehaviorRunBehavior, RunBehavior,布尔返回流,字符串方法,TaskCompletionSource ' 1完成,Int32超时,任务&的任务,布尔asyncWrite) +375
System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehaviorRunBehavior, RunBehavior,布尔返回流,字符串方法53)+
System.Data.SqlClient.SqlCommand.ExecuteReader (CommandBehavior行为,字符串方法)+240
System.Data.SqlClient.SqlCommand.ExecuteDbDataReader (CommandBehavior行为)+ 41
System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader (CommandBehavior+12 System.Data.Common.DbDataAdapter.FillInternal(DataSet . data . common . dbdataadapter . fillinternaldataset, DataTable[] DataTable, Int32 startRecord, Int32 maxRecords,字符串srcTable, IDbCommand命令,CommandBehavior行为)+139
System.Data.Common.DbDataAdapter。填充(DataSet DataSet, Int32startRecord, Int32 maxRecords, String srcTable, IDbCommand命令,CommandBehavior行为)+136
System.Data.Common.DbDataAdapter。填充数据集数据集,字符串srcTable) + 86
System.Web.UI.WebControls.SqlDataSourceView.ExecuteSelect (DataSourceSelectArguments参数)+ 1494
System.Web.UI.DataSourceView.Select (DataSourceSelectArguments参数,DataSourceViewSelectCallback(回调)+22
System.Web.UI.WebControls.DataBoundControl.PerformSelect () + 143
System.Web.UI.WebControls.BaseDataBoundControl.DataBind () + 74
System.Web.UI.WebControls.GridView.DataBind () + 9
System.Web.UI.WebControls.BaseDataBoundControl.EnsureDataBound () + 114System.Web.UI.WebControls.CompositeDataBoundControl.CreateChildControls ()+75 System.Web.UI.Control.EnsureChildControls() +92 system . web . ui . control . preenderrecursiveinternal () +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
System.Web.UI.Page.ProcessRequestMain(布尔包括destagesbeforeasyncpoint,布尔值包括destagesafterasyncpoint+ 883

SqlDataSource "Contains"当逗号或空格是搜索字符串的一部分时

我在后面的c#代码中修复了这个问题,使用文本框并检查是否有逗号或空格。如果存在,则在文本周围添加引号,这样查询就不会被逗号或空格阻塞。参见下面的代码:

        if (txtNameSearch.Text.Contains(",") || txtNameSearch.Text.Contains(" "))
            {
            if (txtNameSearch.Text.Contains('"'))
                {
                }
            else
                {
                txtNameSearch.Text = '"' + txtNameSearch.Text + '"';
                }
            }