【问题标题】:Exception while passing string to DocumentHelper.GetDocuments().Where()将字符串传递给 DocumentHelper.GetDocuments().Where() 时出现异常
【发布时间】:2019-01-29 23:29:40
【问题描述】:

我正在尝试获取这样的节点:

DocumentHelper.GetDocuments()
.Where("NodeParentID == 25 && NodeLevel == 2")

但遇到异常:

“=”附近的语法不正确。在 System.Data.SqlClient.SqlConnection.OnError(SqlException 异常, Boolean breakConnection,Action1 wrapCloseInAction) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData() at System.Data.SqlClient.SqlDataReader.get_MetaData() at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString, Boolean isInternal, Boolean forDescribeParameterEncryption, Boolean shouldCacheForAlwaysEncrypted) at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, Boolean inRetry, SqlDataReader ds, Boolean describeParameterEncryptionRequest) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource1 完成,Int32 超时,Task& 任务, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior、RunBehavior、runBehavior、布尔返回流、字符串 方法)在 System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior 行为,字符串方法)在 System.Data.Common.DbDataAdapter.FillInternal(数据集数据集, DataTable[] 数据表,Int32 startRecord,Int32 maxRecords,字符串 srcTable、IDbCommand 命令、CommandBehavior 行为)在 System.Data.Common.DbDataAdapter.Fill(数据集数据集,Int32 startRecord,Int32 maxRecords,String srcTable,IDbCommand 命令, CommandBehavior 行为)在 System.Data.Common.DbDataAdapter.Fill(DataSet 数据集) 在 CMS.DataEngine.AbstractDataConnection.ExecuteQuery(字符串查询文本, QueryDataParameters queryParams, QueryTypeEnum queryType, Boolean requiresTransaction) --- 内部异常堆栈跟踪结束 ---
在 CMS.DataEngine.AbstractDataConnection.HandleError(字符串查询文本, 例外 ex) 在 CMS.DataEngine.AbstractDataConnection.ExecuteQuery(字符串查询文本, QueryDataParameters queryParams, QueryTypeEnum queryType, Boolean 需要交易)在 CMS.DataEngine.GeneralConnection.RunQuery(QueryParameters 查询)在 CMS.DataEngine.GeneralConnection.RunQueryWithRetry(查询参数 查询,Int32 retryCount)在 CMS.DataEngine.GeneralConnection.ExecuteQuery(QueryParameters 查询, Int32& 总记录)在 CMS.DataEngine.DataQueryBase1.GetDataFromDBInternal() at CMS.DataEngine.DataQueryBase1.GetDataFromDB() 在 CMS.DataEngine.DataQueryBase1.GetData() at CMS.DataEngine.DataQueryBase1.get_Result() 在 CMS.DataEngine.DataQueryBase1.GetResults(IDataQuery query, Int32& totalRecords) at CMS.DataEngine.DataQueryBase1.GetDataFromDB()
在 CMS.DocumentEngine.DocumentQueryProperties.GetDataInternal(IDocumentQuery 查询,Func1 baseGetDataMethod, Action1 setTotalRecords) 在 CMS.DataEngine.DataQueryBase1.GetData() at CMS.DataEngine.DataQueryBase1.get_Result() 在 CMS.DataEngine.MultiObjectQueryBase3.EnsureTypedResult() at CMS.DataEngine.MultiObjectQueryBase3.GetEnumerator() 在 System.Collections.Generic.List1..ctor(IEnumerable1 个集合)
在 System.Linq.Enumerable.ToList[TSource](IEnumerable`1 源)

我做错了什么?

【问题讨论】:

  • 检查正在执行的 SQL 查询。
  • 我不太熟悉 Kentico 或您使用的版本,但请尝试 .Where("NodeParentID", QueryOperator.Equals, "25")。看起来还有 .WhereEquals("", "") 语法。

标签: asp.net-mvc kentico


【解决方案1】:

“WHERE”子句中的 SQL 语法不正确。您正在尝试在需要使用 T-SQL 的地方使用 C# 语法

不正确:

DocumentHelper.GetDocuments().Where("NodeParentID == 25 && NodeLevel == 2");

正确:

DocumentHelper.GetDocuments().Where("NodeParentID = 25 AND NodeLevel = 2");

【讨论】:

    【解决方案2】:

    == 是 c# 语法,SQL 只使用一个 =。

    你应该像这样做你的 where 条件:

     .Where("NodeParentID", QueryOperator.Equals, 25)        
        .Where("NodeLevel ", QueryOperator.Equals, 7);
    

    【讨论】:

    • 您的代码很接近,您缺少 .And()。 .Where("NodeParentID", QueryOperator.Equals, 25) .And() .Where("NodeLevel", QueryOperator.Equals, 7);
    猜你喜欢
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    • 2013-03-16
    • 2013-05-29
    • 1970-01-01
    • 2014-07-19
    • 1970-01-01
    相关资源
    最近更新 更多