OracleManagedDataAccess.EntityFrameworkDatabase.SqlQuery绑定参数在哪里?我有以下代码:varquery=Database.SqlQuery(@"SELECTCASEWHENEXISTS(SELECT1FROMv$sessionv,UsersXxxxuWHEREv.Client_InfoLIKEu.UserName||';%'ANDv.UserName=:schemaNameANDu.SchemaName=:schemaNameANDv.module='XXXX.exe'ANDu.UserKey=:userKey)THEN1ELSE0ENDASLoggedInFROMDUAL",newOracleParameter("schemaName",schemaName),newOracleParameter("用户密钥",用户密钥));返回query.First()!=0;这会产生“ORA-01008:并非所有变量都受约束”。我怀疑变量的绑定方式有问题,最后尝试了这个:||';%'ANDv.UserName=:schemaNameANDu.SchemaName=:schemaNameANDv.module='XXXX.exe'ANDu.UserKey=:userKey)THEN1ELSE0ENDASLoggedInFROMDUAL",newOracleParameter("asdf",schemaName),newOracleParameter("fdsa",schemaName),newOracleParameter("userKey",userKey));返回query.First()!=0;这就像一个魅力!我在文档中四处翻找,发现一个说:“ODP.NET和EntityFramework支持绑定标量参数。在EntityFramework中,支持按名称绑定参数。不支持按位置绑定。”不知何故,我认为文档在骗我,它试图按位置绑定。我记得很久以前在EF支持它之前就修复了这个问题,但我不记得修复的内容是什么,更不用说如何在EF中应用相同的技术了。我的解决方法虽然笨拙,但可以使它按名称而不是位置绑定吗?如果是这样,它是什么?问题在于Database.SqlQuery方法使用了底层DbConnection的CreateCommand方法。在ODP.NET中,这会生成一个OracleCommand,它默认按位置绑定参数(BindByName=false)。此行为不可配置,也没有更改它的好地方。作为解决方法,我可以建议一个自定义的SqlQuery方法替换,它将创建一个BindByName=true的OracleCommand,执行一个ExecuteReader并使用ObjectContext.Translate方法进行映射:paramsobject[]parameters){if(parameters!=null&¶meters.Length>0&¶meters.All(p=>pisOracleParameter))returnOracleDbQuery(db,sql,parameters);返回分贝。数据库。SqlQuery(sql,参数);}privatestaticIEnumerableOracleDbQuery(DbContextdb,stringsql,paramsobject[]parameters){varconnection=db.Database.Connection;varcommand=connection.CreateCommand();((OracleCommand)命令).BindByName=true;命令.CommandText=sql;命令.Parameters.AddRange(参数);connection.Open();尝试{使用(varreader=command.ExecuteReader())使用(varresult=((IObjectContextAdapter)db).ObjectContext.Translate(reader)){foreach(variteminresult)yieldreturnitem;}}最后{连接离子.关闭();命令.Parameters.Clear();要使用它,只需在最新版本的托管中将context.Database.SqlQuery(...)替换为对context.DbQuery(...)的调用在驱动程序中,您可以添加一个web.config条目默认情况下将BindByName设置为true。以上就是C#学习教程:OracleManagedDataAccess.EntityFrameworkDatabase.SqlQuery在哪里绑定参数?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
