首先,有关环境的一些背景信息......
有两台机器:Windows“客户端”和Linux“服务器”。
* IBM网站上列出的recommended solution是将客户端升级到9.7 FP5。我试过这个,甚至升级到版本10但仍然有同样的错误。如果本文作者指的是在需要升级的服务器上运行的实际数据库版本,则会出现问题,因为这对我的客户来说目前不是一个可接受的解决方案。
我并没有停止使用LINQ-to-Entities,并且欢迎使用兼容的替代方案,前提是我不需要重写当前依赖它的大量现有代码。
现在,关于这个问题......
以下是我正在尝试执行的代码。注意查询中使用的caseid参数。
public List<JqueryAutocompleteEntity> Cases(string caseid)
{
var query = (from c in context.ASSET_T
where c.CA_ID_AGCY.StartsWith(caseid.Trim().ToUpper())
select new JqueryAutocompleteEntity
{
id = c.CA_ID_AGCY.Trim(),
label = c.CA_ID_AGCY.Trim(),
value = c.CA_ID_AGCY.Trim()
}).Distinct().Take(10);
return query.ToList();
}
当在运行时执行上面的代码时,抛出以下异常:
执行命令定义时发生错误。有关详细信息,请参阅内部异常 IBM.Data.DB2.DB2Exception:ERROR [42815] [IBM] [DB2 / LINUXX8664] SQL0171N例程“SYSIBM.STRIP”位置“string-expr”中参数的参数的数据类型,长度或值不正确。参数名称:“”。 at IBM.Data.DB2.DB2Command.ExecuteReaderObject(CommandBehavior behavior,String method,DB2CursorType reqCursorType,Boolean abortOnOptValueChg,Boolean skipDeleted,Boolean isResultSet,Int32 maxRows,Boolean skipInitialValidation) at IBM.Data.DB2.DB2Command.ExecuteReaderObject(CommandBehavior behavior,String method) 在IBM.Data.DB2.DB2Command.ExecuteReader(CommandBehavior行为) at IBM.Data.DB2.DB2Command.ExecuteDbDataReader(CommandBehavior behavior) 在System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand,CommandBehavior behavior)
这是LINQ-to-Entities生成的SQL语句,它传递给.NET DB2驱动程序,以便在DB2数据库的Linux服务器上执行。
选择 CAST(1 AS int)AS C1, STRIP(Extent1.CA_ID_AGCY,BOTH)作为C2, STRIP(Extent1.CA_ID_AGCY,BOTH)作为C3, STRIP(Extent1.CA_ID_AGCY,BOTH)AS C4 来自ASSET_T AS Extent1 WHERE(LOCATE(UPPER(STRIP(@p_ linq _1,BOTH)),Extent1.CA_ID_AGCY))= CAST(1 AS int)
如您所见,似乎在生成最终SQL语句时使用了参数/变量的名称,而不是用实际值替换它。此外,将值硬编码到我的LINQ查询中实际上可以正常工作。
c.CA_ID_AGCY.StartsWith(“test”.Trim()。ToUpper())&lt; =这有效!!!
我已经尝试在LINQ查询的第一部分中使用.AsEnumerable()扩展,这样我就可以将所有数据加载到内存中,然后使用我的参数执行过滤器,但这种方法显然不起作用,因为结果集太大了(即数百万条记录)。它最终杀死服务器的CPU并最大化RAM。通过直接对数据库执行查询并使用foreach循环填充JQueryAutocompleteEntity对象的集合,我显然可以通过简单的“经过验证的”DataReader / DataTable方法完成我需要的工作,但我更喜欢使用更优雅的解决方案就像LINQ-to-Entities一样,也避免浪费额外的执行时间来填充foreach循环中的列表。
我发现所有这些令人不安的是,对参数化查询的支持似乎是如此明显的特征。我的意思是在用任何语言编码时,你经常使用常量而不是变量?
我认为Scott Guthrie的blog post关于他的自定义动态查询库似乎为我的问题提供了一种解决方法,但还不是很完整。
非常感谢您解决此问题的任何帮助(无需升级.NET Framework或DB2)。
谢谢!