我正在尝试查询连接速度非常慢的Oracle数据库,并且fzxswpoi表中的表的行数非常高。为了我的目的,我必须使用SqlDataProvider
,因此并非所有行都在内存中。
问题是,当我添加IQueryable
的where子句时,它会生成一个格式错误的选择。这是扔query
。
我在MSSQL中尝试了同样的事情,它只是起作用。
'ORA-00936: missing expression'
安装细节:
.NET Framework 4.7.1
<package id =“FSharp.Core”version =“4.6.2”targetFramework =“net471”/> <package id =“FSharp.Data”version =“3.0.1”targetFramework =“net471”/> <package id =“SQLProvider”version =“1.1.50”targetFramework =“net471”/> <package id =“System.ValueTuple”version =“4.4.0”targetFramework =“net471”/>
在type sql = SqlDataProvider<Common.DatabaseProviderTypes.ORACLE, "Data Source=localhost;PASSWORD=somePassword;USER ID=someUserId", ResolutionPath="C:\\Program Files (x86)\\Oracle Developer Tools for VS2017\\odp.net\\managed\\common\\">
let ctx = sql.GetDataContext()
type OrderDTO = { Id: decimal; SomeColumn: string }
[<EntryPoint>]
let main _ =
let someList =
query {
for order in ctx.Scheme.Tablea do
// remove the where and it's working
where (order.Id = 2M)
take 1
select { Id = order.Id; SomeColumn = order.SomeColumn }
}
// missing expression thrown next line
let firstItem =
someList
|> Seq.head
printfn "%A" firstItem
0 // return an integer exit code
,安装了VS 2017 18.3.0.0的ODAC。
Oracle版本:
Oracle Database 11g快捷版11.2.0.2.0版 - 64位生产 PL / SQL版本11.2.0.2.0 - 生产 核心11.2.0.2.0生产 适用于64位Windows的TNS:版本11.2.0.2.0 - 生产 NLSRTL版本11.2.0.2.0 - 生产
表定义:
CREATE TABLE“SCHEME”。“TABLEA” (“ID”NUMBER(*,0), “SOME_COLUMN”VARCHAR2(20 BYTE), “SOME_COLUMN2”VARCHAR2(20 BYTE) )
我怎样才能解决问题?生成的查询如下:
"C:\Program Files (x86)\Oracle Developer Tools for VS2017"
要调试查询,请挂钩SqlQueryEvent。这是我用过的一些代码:
select * from (SELECT order.ID as "ID",order.SOME_COLUMN as "SOME_COLUMN" FROM SCHEME.TABLEA order WHERE ((order.ID = :param1))) where ROWNUM <= 1 -- params :param1 - 2M;
如果您的查询适用于SQL Server,而不适用于Oracle,则很有可能是一个错误。当我在一段时间之前使用SQLProvider进行一些Access查询时,我在生成的查询中发现了错误。我修复了它们并提交了PR--这实际上非常容易。
该问题与以下问题有关:let logSqlEvent eventData =
eventData
|> sprintf "Executing SQL: %O"
|> Debug.WriteLine
QueryEvents.SqlQueryEvent
|> Event.add logSqlEvent
我在查询中使用了order关键字。看似问题是因为生成的查询包含一个注释,在分号出现之后,但这不是问题。