- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在执行一个简单的 INSERT 语句,其中一个参数 ( SQL_BIGINT
) 使用 SQLBindParameter
绑定(bind)功能。执行失败,但没有错误诊断。命令看起来像这样:
INSERT INTO oracle_test_table (id) VALUES (?)
如果我使用 SQLGetDiagField
得到SQL_DIAG_NUMBER
(错误诊断计数)- 为 0。并尝试使用 SQLGetDiagRec
检索诊断也不返回任何内容。
最小的例子:
#include <cstdint>
#include <cstdio>
#include <string>
#include <sql.h>
#include <sqlext.h>
/** Oracle ODBC insert fail without error diagnostic test.
* ======================================================
*
* compile with: g++ oracle_test.cpp -o oracle_test -lodbc -std=c++11
*/
// Extract error diagnostic.
void extractDiag(SQLSMALLINT handleType, SQLHANDLE& handle, std::string& s) {
SQLINTEGER i = 1;
SQLINTEGER native;
SQLCHAR state[7];
SQLCHAR text[512];
SQLSMALLINT len;
SQLRETURN ret;
while(true) {
ret = SQLGetDiagRecA(handleType, handle, i++, state, &native, text, sizeof(text), &len);
if (!SQL_SUCCEEDED(ret))
break;
s += "[";
s += reinterpret_cast<char*>(state);
s += "] (native ";
s += std::to_string(native);
s += "): ";
s += reinterpret_cast<char*>(text);
s += "; ";
}
}
// Allocate a statement handle.
int allocateStatement(SQLHDBC& dbConn, SQLHSTMT& stmt) {
SQLRETURN ret = SQLAllocHandle(SQL_HANDLE_STMT, dbConn, &stmt);
if (!SQL_SUCCEEDED(ret)) {
std::string s("statement allocation failed: \n");
extractDiag(SQL_HANDLE_DBC, dbConn, s);
fprintf(stderr, "%s\n", s.c_str());
return 1;
}
return 0;
}
int main() {
SQLRETURN ret;
SQLHENV env;
SQLHDBC dbConn;
SQLHSTMT stmt;
// Allocate an environment handle.
ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);
// Use ODBC version 3.
SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (void*) SQL_OV_ODBC3, 0);
// Allocate a connection handle.
ret = SQLAllocHandle(SQL_HANDLE_DBC, env, &dbConn);
// Set connection attributes.
SQLSetConnectAttr(dbConn, SQL_ATTR_QUIET_MODE, 0, SQL_IS_POINTER);
SQLSetConnectAttr(dbConn, SQL_ATTR_LOGIN_TIMEOUT, (SQLPOINTER)60, SQL_IS_UINTEGER);
SQLSetConnectAttr(dbConn, SQL_ATTR_CONNECTION_TIMEOUT, (SQLPOINTER)60, SQL_IS_UINTEGER);
// Connection string.
char connStr[] = "UID=user;PWD=pass;DRIVER={Oracle 12c ODBC driver};Dbq=192.168.15.1:1521/dbora;"; // Oracle
//char connStr[] = "UID=user;PWD=pass;DRIVER={PostgreSQL Unicode};Server=192.168.15.1;Database=dbpg;"; // PostgreSQL
//char connStr[] = "UID=user;PWD=pass;DRIVER={MySQL ODBC 5.3 Unicode Driver};Server=192.168.15.1;Database=dbmy;"; // MySQL
// Connect.
ret = SQLDriverConnectA(dbConn, 0, reinterpret_cast<SQLCHAR*>(connStr), sizeof(connStr)-1, 0, 0, 0, SQL_DRIVER_NOPROMPT);
if (!SQL_SUCCEEDED(ret)) {
std::string s("connection failed: \n");
extractDiag(SQL_HANDLE_DBC, dbConn, s);
fprintf(stderr, "%s\n", s.c_str());
return 1;
}
char dropTable[] = "DROP TABLE oracle_test_table";
char createTable[] = "CREATE TABLE oracle_test_table (id int)";
char insert[] = "INSERT INTO oracle_test_table (id) VALUES (?)";
// Drop table in case it exists.
if (allocateStatement(dbConn, stmt))
return 1;
ret = SQLExecDirectA(stmt, reinterpret_cast<SQLCHAR*>(dropTable), sizeof(dropTable)-1);
// could fail if there's no table... ignored
SQLFreeHandle(SQL_HANDLE_STMT, stmt);
// Create new table.
if (allocateStatement(dbConn, stmt))
return 1;
ret = SQLExecDirectA(stmt, reinterpret_cast<SQLCHAR*>(createTable), sizeof(createTable)-1);
SQLFreeHandle(SQL_HANDLE_STMT, stmt);
// Allocate handle for the INSERT statement.
if (allocateStatement(dbConn, stmt))
return 1;
// Bind BIGINT parameter.
int64_t ival = 2;
ret = SQLBindParameter(stmt, 1, SQL_PARAM_INPUT, SQL_C_SBIGINT, SQL_BIGINT, 19, 0, &ival, sizeof(int64_t), 0);
if (!SQL_SUCCEEDED(ret)) {
fprintf(stderr, "int binding failed\n");
return 1;
}
// Execute the INSERT statement.
ret = SQLExecDirectA(stmt, reinterpret_cast<SQLCHAR*>(insert), sizeof(insert)-1);
if (!SQL_SUCCEEDED(ret)) {
fprintf(stderr, "insert failed\n");
SQLULEN diagCount = 0;
ret = SQLGetDiagField(SQL_HANDLE_STMT, stmt, 0, SQL_DIAG_NUMBER, &diagCount, SQL_IS_UINTEGER, 0);
if (!SQL_SUCCEEDED(ret))
fprintf(stderr, "failed retrieving error diagnostic count\n");
else
fprintf(stderr, "error diagnostic count: %lu\n", diagCount);
std::string s("error diagnostics:\n");
extractDiag(SQL_HANDLE_STMT, stmt, s);
fprintf(stderr, "%s\n", s.c_str());
return 1;
}
return 0;
}
其他命令,包括直接在命令中使用值的 CREATE TABLE、DROP TABLE 或 INSERT(而不是使用 SQLBindParameter
绑定(bind))执行时没有任何问题。并且错误诊断检索在其他方面完全正常。例如,当试图删除一个不存在的表时,它会正确返回:
[42S02] (native 942): [Oracle][ODBC][Ora]ORA-00942: table or view does not exist
但是在这里,没有任何返回。
你们有没有遇到过执行命令失败但没有可用的错误诊断的问题?
我在 Xubuntu 16.04 64 位上使用“Oracle 12c ODBC 驱动程序”(即时客户端 12.1.0.2.0)。使用 ODBC 版本 3。该数据库是在 CentOS 7 上运行的“Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 64bit”。
相同的代码在 PostgreSQL 9.2.15(驱动程序“PostgreSQL Unicode”9.3.300)上运行良好,
和 MySQL 5.5.50(驱动程序“MySQL ODBC 5.3 Unicode 驱动程序”5.3.6)。
最佳答案
我终于在 this other question 中找到了发生这种情况的原因。显然是 Oracle ODBC 驱动程序 doesn't support binding of BIGINT parameters 。糟糕的是,它不会为您提供有关失败原因的任何错误信息。
因此,如果您想使用 64 位整数参数(SQL_C_UBIGINT
或 SQL_C_SBIGINT
),您必须将它们绑定(bind)为字符串,如本例所示:
int64_t val = 123456789;
char* cstr = convert_to_string(val);
size_t len = strlen(cstr);
SQLLEN ind = len;
SQLRETURN ret = SQLBindParameter(hstmt, column, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, len, 0, cstr, len, &ind);
关于c++ - Oracle ODBC 插入失败,没有任何错误诊断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40936038/
当我在一台机器上启动我的应用程序时,它立即退出说它已经“停止工作”。在事件日志中,我看到 MissingMethodException 是原因。没有显示异常对话框,并且在事件日志详细信息中我看不到任何
我正在从 Windows Phone 8 模拟器调用 Azure 移动服务。有时我会收到没有 InnerException 属性的 MobileServiceInvalidOperationExcep
我正在创建一个 Web 客户端,用于使用 ACS Calling SDK 加入 Teams session 。我在加载诊断 API 时遇到问题。 Microsoft 提供了此页面: https://l
知道为什么我的应用程序被杀死吗?我是该节点的唯一用户。 我的历史记录服务器也没有显示任何内容。我如何进一步追踪并了解是谁杀死了它,以及为什么以及如何修复它? ubuntu@anmol-vm1-new:
我正在创建一个 Web 客户端,用于使用 ACS Calling SDK 加入 Teams session 。我在加载诊断 API 时遇到问题。 Microsoft 提供了此页面: https://l
我正在寻找一种从 Windows Azure 中的性能计数器获取原始数据的方法 使用诊断 API。 到目前为止,我注意到我可以从已知的计数器中配置一个计数器 并设置该计数器的采样率。 诊断配置中配置的
我在将 WebRole(WCF 服务)部署到 Azure 时遇到问题。我的 WebRole 持续显示忙碌状态至少 30 分钟,直到我中止它。我通过 Visual Studio 2010 进行部署。我正
Clang has several kinds of diagnostics ,其中三种主要是错误、警告和注释。 注释通常伴随着某些警告和错误,例如重复定义: error: conflicting t
调试由于 Win32 生产过程中的死锁而导致的明显挂起的步骤和技术是什么。我听说 WinDbg 可用于此目的,但您能否提供有关如何实现此目的的明确提示? 最佳答案 此 post应该让您开始使用各种选项
我有一个在 Azure 上运行的应用程序,它会记录(实际上是跟踪)到 Azure 诊断存储。我正在寻找一个可以用来分析这些日志的好工具。 我知道可以使用 Visual Studio 中的服务器资源管理
我在当前项目中使用 Bazel 经历了很长的“干净构建”时间。 我们推荐的诊断步骤是什么? 最佳答案 尝试使用 --profile 分析您的构建 语法为 bazel build --profile f
我在解释 gcc (4.8.2) 警告和错误时遇到问题。更准确地说,很难分辨一个问题在哪里结束,另一个问题从哪里开始。我只能通过控制台访问构建机器,因此不能选择使用 IDE。 我真的需要能够快速区分个
我想为我的 azure 云服务启用 azure 诊断,但我有点困惑。 我读了这篇文章:https://learn.microsoft.com/en-us/azure/cloud-services/cl
我想我这里有个卷曲的地方...我有一个WinForms应用程序,当它作为x64进程运行时,它每小时大约会定期崩溃。我怀疑这是由于堆栈损坏引起的,并且想知道是否有人看到过类似的问题,或者是否有诊断和检测
我正在研究 Azure Web 角色的性能改进,并想知道在发布/部署到生产站点时是否应保留诊断。 This article说要禁用它,但其中一条评论说您会丢失关键数据。 最佳答案 您绝对应该启用它。一
我的解决方案中有多个 Web 和辅助角色,但我还有一个在 Azure 托管 VM 上运行的非 Azure 应用程序。该应用程序连接到 Azure 存储以执行各种操作,例如读取和写入 blob 和队列,
我仍在努力理清思路 Azure Service Fabric Stateful Actors 。因此,我的(当前)问题最好放入这样的示例中: 我有一个帮助台系统,其中每张票证都是一个有状态的参与者。参
CUDA 到处都有大量文档和指南,但我找不到任何形式的说明来指导如何诊断编译但收到神秘、模糊错误消息(例如“未指定启动”)的内核“这些 block /网格结构有意义吗?”等等 我可以以某种方式拦截cu
我没有找到太多解决 azure 事件网格中事件丢失场景的方法。 因此我提出与以下场景相关的问题: 我们的代码将事件发布到域。 事件将传送到订阅中配置的网络 Hook 。 这在一段时间内有效。 消费者(
这个问题有点宽泛,但我觉得没有一个地方可以帮助系统地诊断 Elasticsearch 问题。广泛的类别可能是: 客户 查询错误 查询结果不正确 无法解释的行为 服务器 设置问题 性能问题 严重错误 无
我是一名优秀的程序员,十分优秀!