gpt4 book ai didi

C++:sqlite3 是否使用 errno 代码?

转载 作者:太空狗 更新时间:2023-10-29 21:46:17 25 4
gpt4 key购买 nike

我正在使用 sqlite3 C++ api。运行后

int rc = sqlite3_exec(db, pSQL, 0, 0, 0);

返回 rc SQLITE_OK 的结果.

另外,我测试了errno != 0 .cout << strerror(errno) << endl的结果始终如一:没有那个文件或目录

换句话说,我知道 sqlite3 有自己的一组“返回码”(即 SQLITE_OK)。但是,sqlite3 是否正确/一致地使用 errno 代码?也就是说,如果我的应用程序的另一部分正在使用全局 errno 变量,我是否应该在每次调用 sqlite3_exec 后重置它? ?

谢谢。


我的代码的更完整示例:

    const int errno_start = errno;
if (errno_start > 0) {
std::cout << "errno=" << strerror(errno) << std::endl;
std::cout << "errno_start=" << strerror(errno_start) << std::endl;
}
// prepare sql statement
const char *pSQL;
pSQL = "CREATE TABLE "
"IF NOT EXISTS "
"test1"
"("
"id INTEGER,"
"field VARCHAR(32),"
"value DOUBLE,"
"timestamp DATETIME"
")";

//int rc = sqlite3_exec(db, pSQL, callback, 0, &szErrMsg);
int rc = sqlite3_exec(db, pSQL, 0, 0, 0);
const int errno_here1 = errno;
if (errno_here1 > 0) {
std::cout << "errno_start=" << strerror(errno_start) << ", errno_here1="
<< strerror(errno_here1) << std::endl;
}
if (rc != SQLITE_OK) {
std::cout << "SQL Error: " << szErrMsg << std::endl;
sqlite3_free(szErrMsg);
} else {
std::cout << "initialize successful" << std::endl;
}

这段代码的结果是:

errno_start=Success, errno_here1=No such file or directory

initialize successful

最佳答案

您应该永远不要依赖errno中的值在下一次操作系统调用之后继续存在,因为几乎所有可能失败的操作系统调用(即,几乎所有它们) 可以设置它。不过至少有一件事:errno 现在通常是幕后的本地线程。不过,库可能会在您调用它时设置 errno,因此明智的做法是在系统调用失败后立即保存该值,否则忽略它。

SQLite 在自身内部进行操作系统调用(当然,当它访问数据库文件时),因此它可以将 errno 设置为几乎任何值。它遇到的错误在它内部处理;如果出现问题,它会使用自己的记录错误机制告诉您。这从不包含来自 errno 的任何信息(事实上,这将是不可移植的;SQLite 也可以在 Windows 上运行,并且使用不同的错误代码报告机制)。

关于C++:sqlite3 是否使用 errno 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15618189/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com