【问题标题】:Why does my strcmp fail?为什么我的 strcmp 失败?
【发布时间】:2015-03-02 15:03:37
【问题描述】:

我正在开发一个应用程序,如果给出了这个特定的错误消息,它会被忽略:

[Oracle][ODBC][Ora]ORA-24338: 语句句柄未执行

我的比较代码如下:

char Sqlstate[10];
long NativeErrorPtr;
char MessageText[1024];
long BufferLength=1024;
long TextLengthPtr;

SQLGetDiagRec(SQL_HANDLE_STMT,sqlc.g_hstmt,1,(SQLCHAR *) Sqlstate,(SQLINTEGER *) &NativeErrorPtr, 
(SQLCHAR *) MessageText,(SQLSMALLINT) BufferLength,(SQLSMALLINT *) &TextLengthPtr);

success=false;          
char* msg = MessageText;
char* oracleMsg = "[Oracle][ODBC][Ora]ORA-24338: statement handle not executed";

int i = strcmp(msg, oracleMsg);

我收到i ==1。当我将鼠标悬停在msgoracleMsg 上时,它们看起来完全一样。这是每个变量的复制文本。

oracleMsg 0x00c1cd88 "[Oracle][ODBC][Ora]ORA-24338: 语句句柄未执行" char *

msg 0x0132d0a4 "[Oracle][ODBC][Ora]ORA-24338: 语句句柄未执行" char *

【问题讨论】:

  • 可能错误消息不是以 NULL 结尾的。 msg[TextLengthPtr] = 0;.
  • 当我尝试添加该代码时,我得到未处理的异常“访问冲突写入位置 0xcd81cf88”。
  • 尝试使用 strncmp 代替
  • 请编辑您的问题并包含声明和初始化 SQLGetDiagRec 调用中使用的变量的代码,尤其是 MessageText、BufferLength 和 TextLengthPtr。谢谢。
  • 好的。我已经编辑了帖子以包含变量的初始化。

标签: c++ sql oracle oracle11g string-comparison


【解决方案1】:

我的问题一定是它不是以 NULL 结尾的。我听从了 ibre5041 的建议并使用了if((strncmp(msg, oracleMsg, 55))== 0)。这仅比较前 55 个字符,从而避免了非 NULL 终止的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    • 2014-01-11
    • 2012-10-18
    • 1970-01-01
    相关资源
    最近更新 更多