ogr执行sql语句,sql中有中文时包语法错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ogr执行sql语句,sql中有中文时包语法错误相关的知识,希望对你有一定的参考价值。

使用ogr连接数据源之后,利用datasource的excuteSql方法执行查询功能,当sql中有中文出现就会报语法错误,求大神解答?

参考技术A 把中文用中括号括起来,如:select [编号],[产品名称],[时间……] from dbo.[产品表] where [编号]>=14本回答被提问者采纳 参考技术B lz把代码贴上来看看,应该是字符串格式的问题。追问

我是使用ogr调用wfs服务,在连接后,使用datasource.excuteSql(string sql)方法时,如果执行的sql语句中类似以下:string strsql=“select * from table1 where 编码=‘abc’”;则会报错;但是这条语句在直接连接一个shp文件里获取的datasouce里则可以执行通过;

追答

sql语句是没有问题的,但是excutesql用法参见http://www.gdal.org/classGDALDataset.html#a5b65948b1e15fa63e96c0640eb6c5d7c

SQL语句的执行过程

1.语法校验

      如果在SQL计划缓存中没有对应的执行计划,服务器首先会对用户请求的SQL语句进行语法效验,如果有语法错误,服务器会结束查询操作,并用返回相应的错误信息给调用它的应用程序。

注意:此时返回的错误信息中,只会包含基本的语法错误信息,例如select 写成selec等,错误信息中如果包含一列表中本没有的列,此时服务器是不会检查出来的,因为只是语法验证,语义是否正确放在下一步进行。


2.检查语义

      语法符合后,就开始验证它的语义是否正确。例如,表名、列名、存储过程等等数据库对象是否真正存在,如果发现有不存在的,就会报错给应用程序,同时结束查询。


3.获得对象的解析锁

     接下来就是获得对象的解析锁,我们在查询一个表时,首先服务器会对这个对象加锁,这是为了保证数据的统一性,如果不加锁,此时有数据插入,但因为没有加锁的原因,查询已经将这条记录读入,而有的插入会因为事务的失败会回滚,就会形成脏读的现象。


4.用户访问权限认证

     接下来就是对数据库用户权限的验证。SQL语句语法,语义都正确,此时并不一定能够得到查询结果,如果数据库用户没有相应的访问权限,服务器会报出权限不足的错误给应用程序,在稍大的项目中,往往一个项目里面会包含好几个数据库连接串,这些数据库用户具有不同的权限,有的是只读权限,有的是只写权限,有的是可读可写,根据不同的操作选取不同的用户来执行。稍微不注意,无论你的SQL语句写的多么完善,完美无缺都没用。


5.SQL优化,选择最高效的查询算法

       解析的最后一步,就是确定最终的执行计划。当语法、语义、权限都验证后,服务器并不会马上给你返回结果,而是会针对你的SQL进行优化,选择不同的查询算法以最高效的形式返回给应用程序

例如在做表联合查询时,服务器会根据开销成本来最终决定采用hash join,merge join ,还是loop join,采用哪一个索引会更高效等等。不过它的自动化优化是有限的,要想写出高效的查询SQL还是要优化自己的SQL查询语句。

当确定好执行计划后,就会把这个执行计划保存到SQL计划缓存中,下次在有相同的执行请求时,就直接从计划缓存中取,避免重新编译执行计划。


本文出自 “写个博客骗钱” 博客,请务必保留此出处http://dadonggg.blog.51cto.com/12672150/1958206

以上是关于ogr执行sql语句,sql中有中文时包语法错误的主要内容,如果未能解决你的问题,请参考以下文章

SQL语句的执行过程

H2 SQL 语句中是不是有语法错误?

Oracle SQL中的Merge用法

为啥在eclipse中执行 sql server 的查询语句总是提示语法错误,请大家帮我看看。

执行时语法错误

oracle执行sql没得结果也不报错