我应该绑定什么数据类型作为查询参数以与 Oracle ODBC 中的 NUMBER(15) 列一起使用?

2023-12-03

我刚刚被SO问题中描述的问题所困扰绑定 int64 (SQL_BIGINT) 作为查询参数会导致在 Oracle 10g ODBC 中执行期间出错.

我正在使用 ODBC 2 将 C/C++ 应用程序从 SQL Server 移植到 Oracle。对于超过 NUMBER(9) 的数字字段,它使用 __int64 数据类型,该数据类型作为 SQL_C_SBIGINT 绑定到查询。显然 Oracle ODBC 不支持这种绑定。我现在必须在应用程序范围内转换为另一种方法。由于我没有太多时间——这是一个意想不到的问题——我宁愿使用经过验证的解决方案,而不是反复试验。

应该使用什么数据类型来绑定,例如Oracle 中的 NUMBER(15)?有记录的推荐解决方案吗?你用什么?有什么建议么?

我对不需要任何额外转换的解决方案特别感兴趣。我可以轻松地提供和使用 __int64 或 char* 形式的数字(正常非指数没有千位分隔符或小数点的形式)。任何其他格式都需要我进行额外的转换。


到目前为止我已经尝试过:

SQL_C_CHAR

看起来这对我有用。我担心数字格式的可变性。但在我的用例中,这似乎并不重要。显然只有小数点字符随系统语言设置而变化。

我不明白为什么应该在 SQL INSERT 或 UPDATE 命令中使用显式转换(例如 TO_NUMERIC)。当我将参数与 SQL_C_CHAR 作为 C 类型和 SQL_NUMERIC (具有适当的精度和小数位数)作为 SQL 类型绑定时,一切正常。我无法重现任何数据损坏效果。

SQL_NUMERIC_STRUCT

我注意到 ODBC 3.0 添加了 SQL_NUMERIC_STRUCT,并决定尝试一下。我很失望。

在我的情况下这就足够了,因为应用程序并不真正使用小数。但作为一个通用的解决方案......简单地说,我不明白。我的意思是,我终于明白了它应该如何使用。我不明白的是:为什么有人会引入这种新的结构,然后让它以这种方式工作.

SQL_NUMERIC_STRUCT 具有表示任何 NUMERIC(或 NUMBER 或 DECIMAL)值及其精度和小数位数所需的所有字段。只是它们没有被使用。

读取时,ODBC 设置数字的精度(基于列的精度;除了 Oracle 返回更大的精度,例如 NUMBER(15) 为 20)。但是,如果您的列有小数部分(比例> 0),则默认情况下它会被截断。要以适当的比例读取数字,您需要在获取数据之前使用 SQLSetDescField 调用设置精度并自行调整比例。

值得庆幸的是,在编写时,Oracle 尊重 SQL_NUMERIC_STRUCT 中包含的比例。但 ODBC 规范并未强制要求它,并且 MS SQL Server 会忽略该值。那么,再次回到 SQLSetDescField。

See 如何:使用 SQL_NUMERIC_STRUCT 检索数字数据 and INF:如何将 SQL_C_NUMERIC 数据类型与数字数据一起使用了解更多信息。

为什么 ODBC 不完全使用自己的 SQL_NUMERIC_STRUCT?我不知道。看起来确实有效,但我认为这工作量太大了。


我想我会使用 SQL_C_CHAR。


我个人的偏好是使绑定变量为字符串(VARCHAR2),并让Oracle将字符转换为它自己的内部存储格式。很容易(在 C 中)以可接受的格式获取表示为空终止字符串的数据值。

因此,不要像这样编写 SQL:

SET MY_NUMBER_COL = :b1
  , MY_DATE_COL = :b2

我这样写SQL:

SET MY_NUMBER_COL = TO_NUMBER( :b1 )
  , MY_DATE_COL   = TO_DATE( :b2 , 'YYYY-MM-DD HH24:MI:SS')

并提供字符串作为绑定变量。

这种方法有几个优点。

一种是解决绑定其他数据类型时遇到的问题和错误。

另一个优点是绑定值在 Oracle 事件 10046 跟踪上更容易破译。

另外,EXPLAIN PLAN(我相信)期望所有绑定变量都是 VARCHAR2,因此这意味着正在解释的语句与正在执行的实际语句略有不同(由于当实际绑定参数的数据类型时进行隐式数据转换)语句不是 VARCHAR2。)

而且(不太重要)当我在 TOAD 中测试语句时,能够在输入框中输入字符串会更容易,而不必在下拉列表框中更改数据类型。

我还让内置的 TO_NUMBER 和 TO_DATE 函数验证数据。 (至少在 Oracle 的早期版本中,我遇到了直接绑定 DATE 值的问题,它绕过了(至少部分)有效性检查,并允许无效的日期值存储在数据库中。

这只是个人偏好,基于过去的经验。我对 Perl DBD 使用同样的方法。

我想知道 Tom Kyte (asktom.oracle.com) 对这个话题有什么看法?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我应该绑定什么数据类型作为查询参数以与 Oracle ODBC 中的 NUMBER(15) 列一起使用? 的相关文章

  • C++:无法使用scoped_allocator_adaptor传播polymorphic_allocator

    我有一个vector
  • 如何在C++中实现模板类协变?

    是否可以以这样一种方式实现类模板 如果模板参数相关 一个对象可以转换为另一个对象 这是一个展示这个想法的例子 当然它不会编译 struct Base struct Derived Base template
  • SSH 主机密钥指纹与模式 C# WinSCP 不匹配

    我尝试通过 WinSCP 使用 C 连接到 FTPS 服务器 但收到此错误 SSH 主机密钥指纹 与模式不匹配 经过大量研究 我相信这与密钥的长度有关 当使用 服务器和协议信息 下的界面进行连接时 我从 WinSCP 获得的密钥是xx xx
  • 为什么 POSIX 允许在只读模式下超出现有文件结尾 (fseek) 进行搜索

    为什么寻找文件结尾很有用 为什么 POSIX 让我们像示例中那样在以只读方式打开的文件中进行查找 c http en cppreference com w c io fseek http en cppreference com w c io
  • 使用 Google Analytics API 在 C# 中显示信息

    我一整天都在寻找一个好的解决方案 但谷歌发展得太快了 我找不到有效的解决方案 我想做的是 我有一个 Web 应用程序 它有一个管理部分 用户需要登录才能查看信息 在本节中 我想显示来自 GA 的一些数据 例如某些特定网址的综合浏览量 因为我
  • c# Asp.NET MVC 使用FileStreamResult下载excel文件

    我需要构建一个方法 它将接收模型 从中构建excel 构建和接收部分完成没有问题 然后使用内存流导出 让用户下载它 不将其保存在服务器上 我是 ASP NET 和 MVC 的新手 所以我找到了指南并将其构建为教程项目 public File
  • 当 Cortex-M3 出现硬故障时如何保留堆栈跟踪?

    使用以下设置 基于 Cortex M3 的 C gcc arm 交叉工具链 https launchpad net gcc arm embedded 使用 C 和 C FreeRtos 7 5 3 日食月神 Segger Jlink 与 J
  • 为什么模板不能位于外部“C”块内?

    这是一个后续问题一个答案 https stackoverflow com questions 4866433 is it possible to typedef a pointer to extern c function type wit
  • 使用向量的 merge_sort 在少于 9 个输入的情况下效果很好

    不知何故 我使用向量实现了合并排序 问题是 它可以在少于 9 个输入的情况下正常工作 但在有 9 个或更多输入的情况下 它会执行一些我不明白的操作 如下所示 Input 5 4 3 2 1 6 5 4 3 2 1 9 8 7 6 5 4 3
  • 使用安全函数在 C 中将字符串添加到字符串

    我想将文件名复制到字符串并附加 cpt 但我无法使用安全函数 strcat s 来做到这一点 错误 字符串不是空终止的 我确实设置了 0 如何使用安全函数修复此问题 size strlen locatie size nieuw char m
  • Windows 窗体不会在调试模式下显示

    我最近升级到 VS 2012 我有一组在 VS 2010 中编码的 UI 测试 我试图在 VS 2012 中启动它们 我有一个 Windows 窗体 在开始时显示使用 AssemblyInitialize 属性运行测试 我使用此表单允许用户
  • 线程、进程和 Application.Exit()

    我的应用程序由主消息循环 GUI 和线程 Task Factory 组成 在线程中我调用一些第三方应用程序var p new Process 但是当我调用Application Exit 在消息循环中 我可以看到在线程中启动的进程仍在内存中
  • 我的 strlcpy 版本

    海湾合作委员会 4 4 4 c89 我的程序做了很多字符串处理 我不想使用 strncpy 因为它不会终止 我不能使用 strlcpy 因为它不可移植 只是几个问题 我怎样才能让我的函数正常运行 以确保它完全安全稳定 单元测试 这对于生产来
  • .NET 选项将视频文件流式传输为网络摄像头图像

    我有兴趣开发一个应用程序 它允许我从 xml 构建视频列表 包含视频标题 持续时间等 并将该列表作为我的网络摄像头流播放 这意味着 如果我要访问 ustream tv 或在实时通讯软件上激活我的网络摄像头 我的视频播放列表将注册为我的活动网
  • 如何在 C# 中播放在线资源中的 .mp3 文件?

    我的问题与此非常相似question https stackoverflow com questions 7556672 mp3 play from stream on c sharp 我有音乐网址 网址如http site com aud
  • 更改显示的 DPI 缩放大小使 Qt 应用程序的字体大小渲染得更大

    我使用 Qt 创建了一些 GUI 应用程序 我的 GUI 应用程序包含按钮和单选按钮等控件 当我运行应用程序时 按钮内的按钮和字体看起来正常 当我将显示器的 DPI 缩放大小从 100 更改为 150 或 200 时 无论分辨率如何 控件的
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new
  • 如何连接字符串和常量字符?

    我需要将 hello world 放入c中 我怎样才能做到这一点 string a hello const char b world const char C string a hello const char b world a b co
  • 将 viewbag 从操作控制器传递到部分视图

    我有一个带有部分视图的 mvc 视图 控制器中有一个 ActionResult 方法 它将返回 PartialView 因此 我需要将 ViewBag 数据从 ActionResult 方法传递到 Partial View 这是我的控制器
  • 不同类型的指针可以互相分配吗?

    考虑到 T1 p1 T2 p2 我们可以将 p1 分配给 p2 或反之亦然吗 如果是这样 是否可以不使用强制转换来完成 或者我们必须使用强制转换 首先 让我们考虑不进行强制转换的分配 C 2018 6 5 16 1 1 列出了简单赋值的约束

随机推荐

  • 为什么我收到错误无法解析模块路径? Eslint 与 Typescript

    我阅读了很多资源 包括将 eslint 与 Typescript 结合使用 无法解析模块的路径 我一次又一次地遇到同样的错误 yarn lint 2 24 error Unable to resolve path to module com
  • 查找非 Visual C# 组件

    我尝试了多种方法来列出表单的所有非可视组件 例如 OpenDialog ImageList TableAdapters 等 但找不到任何内容 为了找到屏幕上的控件 我在 控件 屏幕中使用了 Foreach 但对于那些非可视组件我什么也没找到
  • 使用 JNI 时 Eclipse 对 C 文件的行为令人惊讶,为什么会这样?

    我正在开发一个 Android 应用程序 其中使用了大量 JNI 代码 最近 从过去 2 3 天开始 我真的对 Eclipse 的意外行为感到恼火 一旦我打开 c 文件 它就会显示模糊的错误 但是 如果我关闭并重新打开项目 错误就会消失 请
  • 获取一个月内的工作日

    我正在尝试获取给定月份内的日期 我的计划是 获取给定月份的开始日期和结束日期 获取该范围内的所有日期 迭代它们并使用以下方法消除周末内的日期isDateInWeekend method 其余日期为工作日 所以我创建了两个NSDate扩展方法
  • groovy++ 发生了什么? [关闭]

    Closed 这个问题是无关 目前不接受答案 我刚刚偶然发现了 groovy 发现它非常有趣 不幸的是 它似乎没有进一步发展 根据 github 的说法 最后一次提交是一年多前 邮件列表完全不活跃 最后一条消息是在四月份返回的 最近没有这方
  • 如何从 XML 文档中删除所有文本

    如何删除所有文本 但保持结构完整 例如
  • 清除MySQL查询缓存而不重新启动服务器

    有什么办法可以clear mysql 查询缓存无需重新启动 mySQL 服务器 我相信你可以用 RESET QUERY CACHE 如果您运行的用户具有重新加载权限 或者 您可以通过以下方式对查询缓存进行碎片整理 FLUSH QUERY C
  • MySQL - 来自另一个表的总和

    我想运行一个包含另一个表中的总和的 select 语句 我知道我可能需要设置一个连接 但我不知道如何处理它 我想选择一个帐户列表 然后获取它们的余额 来自另一个表的总和 这是我一直以来的想法 但显然它是不正确的 SELECT account
  • 如何从 Android 应用程序将 db 文件上传到 google 驱动器?

    我想将数据库文件从我的应用程序上传到谷歌驱动器 我可以在谷歌驱动器中创建一个文件夹 但我不知道如何上传数据库文件 这是我的代码 import java io BufferedInputStream import java io Buffer
  • 使用 Gatsbyjs 包含本地 JS 和 CSS 文件

    我对这个完全陌生gatsbyjs生态系统 同时我正在学习一些reactjs 我最近购买了一个 html 模板 并尝试将其用作 UIgatsbyjs应用 该模板有很多 css 和 js 无论是专有的还是定制的 这意味着没有插件gatsbyjs
  • 添加对 Jtree 的拖放支持

    我想为我的 JTree 应用程序添加拖放支持 我创建了一个自定义的 DefaultMutableTreeNode 子类 有一个默认的 TreeCellRenderer 我需要添加哪些内容以及在哪里添加 最简单的方法是1 调用tree set
  • UIWebView 没有释放内存

    我在尝试恢复分配给 a 的内存时遇到了一些真正的麻烦UIWebView在我的应用程序中 我本质上是创造并呈现UIWebView暂时为用户单独ViewController 然后删除所有引用并弹出ViewController从堆栈中 尽管做了所
  • 如何使用 Lambda 函数对 Alexa Skill 应用程序进行异步 API 调用?

    我想从 Lambda 函数调用 api 我的处理程序由包含两个必需插槽的意图触发 因此我事先不知道我是否会退货Dialog Delegate指令或我对 api 请求的响应 在调用意图处理程序时 我如何承诺这些返回值 这是我的处理程序 con
  • 更新过期的 iO​​S MDM 配置文件

    因此 我设置了 SCEP 服务器来生成 iOS 身份证书 该证书仅在短时间内有效 当它过期时 配置文件会显示 此配置文件已过期 请更新此配置文件以获取更新版本 并显示 更新配置文件 按钮 然而 单击此按钮只会告诉我 无法更新配置文件 请联系
  • 查找非零元素的索引并按值分组

    我用 python 编写了一段代码 它接受 numpy 矩阵作为输入 并返回按相应值分组的索引列表 即 输出 3 返回值为 3 的所有索引 然而 我缺乏编写矢量化代码的知识 不得不使用 ndenumerate 来完成 这个操作只花了大约9秒
  • this.href 与 $(this).attr('href')

    读完这篇文章后net tutsplus com tutorials javascript ajax 14 helpful jquery tricks notes and best practices 我得出的结论是使用这个 href更有效率
  • Google 文档的 Apps 脚本 findText()

    我正在将正则表达式搜索应用于谷歌文档带有一些 Markdown 代码块刻度 的文本 在我的文档上运行下面的代码将返回空结果 var codeBlockRegEx 3 s 3 RegEx to find lazily all text bet
  • 如何使用 build-number 插件在 Maven 中显示 SVN 版本

    如何使用内部版本号插件显示 svn 版本和时间戳 目前我有以下内容
  • iPhone将彩色图像转换为2位图像(黑白)

    我需要帮助将彩色图像转换为 黑白 而不是灰度 我如何使用 iPhone SDK 和 Core Graphics 来做到这一点 因为我相信这是可能的 这是可能的 我之前尝试过两条路径 转换为灰度 然后逐像素转换为黑白 问题是我在透明图像上没有
  • 我应该绑定什么数据类型作为查询参数以与 Oracle ODBC 中的 NUMBER(15) 列一起使用?

    我刚刚被SO问题中描述的问题所困扰绑定 int64 SQL BIGINT 作为查询参数会导致在 Oracle 10g ODBC 中执行期间出错 我正在使用 ODBC 2 将 C C 应用程序从 SQL Server 移植到 Oracle 对