Loading... <!-- wp:paragraph {"style":{"typography":{"fontSize":"16px"}}} --> <p style="font-size:16px">之前为客户开发的一个工具,因为客户这边的环境比较固定,一直用的MSSQL,我在代码里使用了很多数据库查询语句,都只是在MSSQL环境中调试的。现在有个Oracle环境的客户想试用,于是我想着可能只是稍微改下查询语句吧,能有多大难度,哇哦,干起来才发现这事儿可真不是想象中的那么简单。下面我列了一些遇到的坑,各位引以为戒吧。</p> <!-- /wp:paragraph --> <!-- wp:separator --> <hr class="wp-block-separator"/> <!-- /wp:separator --> <!-- wp:paragraph {"style":{"typography":{"fontSize":"16px"}}} --> <p style="font-size:16px"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">1、与Oracle自身关键字冲突的列名无法直接使用,需要加双引号使用。例如UID,Oracle的内置UID是当前Session连接用户的ID</mark>。</p> <!-- /wp:paragraph --> <!-- wp:paragraph {"style":{"typography":{"fontSize":"16px"}}} --> <p style="font-size:16px"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-purple-color">2、SQLServer和Oracle的OID格式是不同的<br>sOID = "{00013885-0000-0000-5502-A9E71C556B04}" for MSSQL<br>sOID = "0002231100000000060193593655DC01" for Oracle<br>MSSQL在数据库中存储的格式没有大括号,因此如果你用查询语句直接从数据库中得到的OID,在转BO时需要手动加上{},而Oracle中存储的格式无需做任何处理,可以直接用来转BO。至于为什么他们两者存储的格式有所不同,就要追溯到两者生成GUID的函数,Oracle那边是SYS_GUID(),MSSQL这边叫NewID(),生成的是两种不同不同格式化的GUID,在代码里有个Guid.ToString()的格式化方法,如下图,大家可以大致了解GUID的几种格式:</mark></p> <!-- /wp:paragraph --> <!-- wp:image {"id":2006,"sizeSlug":"full","linkDestination":"media"} --> <figure class="wp-block-image size-full"><a href="https://mrgeng.com/usr/uploads/2021/09/Guid.ToString.jpg"><img src="https://mrgeng.com/usr/uploads/2021/09/Guid.ToString.jpg" alt="" class="wp-image-2006" style=""></a></figure> <!-- /wp:image --> <!-- wp:paragraph {"style":{"typography":{"fontSize":"16px"}}} --> <p style="font-size:16px"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-purple-color">但Oracle生成的GUID是16位的RAW格式,这种格式在某些软件中是无法直接显示的,会乱码或空,所以有时我们需要通过ROWTOHEX函数将其转换为16进制的32位字符串才能正常使用和显示。</mark></p> <!-- /wp:paragraph --> <!-- wp:paragraph {"style":{"typography":{"fontSize":"16px"}}} --> <p style="font-size:16px"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">3、代码的查询语句里如果有中文,则需要注意要在系统变量中添加一个东西: <br>变量名:NLS_LANG <br>变量值:SIMPLIFIED CHINESE_CHINA.ZHS16GBK</mark></p> <!-- /wp:paragraph --> <!-- wp:image {"id":2008,"sizeSlug":"large","linkDestination":"media"} --> <figure class="wp-block-image size-large"><a href="https://mrgeng.com/usr/uploads/2021/09/ORA-00911-invalid-character.png"><img src="https://mrgeng.com/usr/uploads/2021/09/ORA-00911-invalid-character-1024x347.png" alt="" class="wp-image-2008" style=""></a></figure> <!-- /wp:image --> <!-- wp:paragraph {"style":{"typography":{"fontSize":"16px"}}} --> <p style="font-size:16px"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-purple-color">4、S3D在Oracle和MSSQL里的View不一定一致,有些没有,有些名字不一样的,很正常,要多查一下。</mark></p> <!-- /wp:paragraph --> <!-- wp:paragraph {"style":{"typography":{"fontSize":"16px"}}} --> <p style="font-size:16px"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">5、语法方面的差异就更多了,每段查询几乎都要写两种</mark>。</p> <!-- /wp:paragraph --> <!-- wp:paragraph {"style":{"typography":{"fontSize":"16px"}}} --> <p style="font-size:16px"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-purple-color">6、DBConnection要先判断DBProvider再创建,如果你在连MSSQL站点的时候创建Oracle的DBConnection,或连Oracle站点的时候创建MSSQL的DBConnection,程序会崩。</mark></p> <!-- /wp:paragraph --> <!-- wp:paragraph {"style":{"typography":{"fontSize":"16px"}}} --> <p style="font-size:16px"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">7、有些语句在代码里始终查询不出结果,但在Toad或PL/SQL或Developer中单独运行又能出结果,原因至今未找到。</mark></p> <!-- /wp:paragraph --> <!-- wp:spacer {"height":42} --> <div style="height:42px" aria-hidden="true" class="wp-block-spacer"></div> <!-- /wp:spacer --> <!-- wp:paragraph {"style":{"typography":{"fontSize":"16px"}}} --> <p style="font-size:16px">鉴于以上种种问题,可以得出一个结论,在写代码时能不直连数据库进行查询就尽量不要去直连。尽量通过前台封装的API去实现功能,会大大降低程序的维护成本。</p> <!-- /wp:paragraph --> 最后修改:2025 年 03 月 13 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏
5 条评论
博主你好,请问你是通过QueryInterpreter访问数据库的吗
DBConnection啊
DBConnection貌似需要自己写连接字符串,QueryInterpreter是Smart3D提供的,可以直接连接数据库,不知道为什么我运行示例就报错,大佬可以研究下
不需要啊,3D自带的DBConnection,不是微软的DBConnection。
大佬,自带的DBConnection我没找到,能分享下连数据库的代码吗