frequent 2024-04-26 12:43 采纳率: 0%
浏览 10
已结题

sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?

我先打开了一个加密数据库test.db,然后将另外一个数据库文件abc.db附加到这个数据库中,abc.db的密码是123456,并且手工用数据库读取软件,并输入该密码后可以打开这个数据库文件,说明密码没有错。但我执行附加语句时,却返回26,返回值代表的意思是File opened that is not a database file,请问这是什么原因呢?代码如下:


sqlite3_open(“D:\\test.db", &db);
sqlite3_key(db, ”123456“, 6);
char chAttach[500];
sprintf_s(chAttach,500,"ATTACH DATABASE 'D:\\abc.db' AS 'db2' KEY '%s'","123456");
int nRet=sqlite3_exec(db, (const char*)chAttach, NULL, NULL, NULL);
if ( nRet!= SQLITE_OK) //调试发现这里nRet为26
{
    MessageBox(NULL,"Failure","",MB_OK);
}
  • 写回答

21条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-26 12:43
    关注
    获得0.45元问题酬金

    引自免费微信小程序:皆我百晓生

    在您的代码中,您尝试使用SQLite API来附加一个已加密的数据库文件(abc.db)到已打开并解密的数据库(test.db)。然而,操作过程中返回了错误码26,表示“File opened that is not a database file”。为了解决这个问题,我们需要从以下几个方面进行排查:

    1. 路径与文件名验证: 首先确保D:\\abc.db的路径正确无误,文件确实存在。如果有任何拼写错误、大小写不一致、路径不存在或文件已被移动/删除等情况,都会导致无法找到正确的数据库文件。

    2. 数据库文件格式检查: 确认abc.db是一个有效的SQLite数据库文件。虽然您提到使用其他数据库读取软件可以打开并正确解密,但建议再次确认其是否为SQLite格式,因为错误码26指示的是所打开的文件不是一个数据库文件。您可以尝试使用SQLite官方命令行工具或其他支持查看文件类型的应用程序验证其格式。

    3. 加密状态确认: 虽然您已成功对test.db应用了密码,但在附加abc.db时,确保使用了正确的加密密钥(即密码123456)。如果abc.db实际使用的密码与您提供的不同,即使能通过第三方软件打开,也无法通过SQLite API正确附加。

    4. SQL语句格式问题: 检查sprintf_s()函数生成的chAttach变量内容是否符合预期。特别是字符串格式化部分,确保键值对KEY '%s'中的%s被正确替换为密码字符串。下面是一个修改后的版本,使用snprintf()(C99标准)以提高安全性,并避免潜在的缓冲区溢出问题:

      char chAttach[500];
      snprintf(chAttach, sizeof(chAttach),
              "ATTACH DATABASE 'D:\\abc.db' AS 'db2' KEY '%s'",
              "123456");
      
    5. API调用与错误处理: 使用sqlite3_errmsg()获取详细的错误信息,有助于进一步定位问题。在sqlite3_exec()失败后添加以下代码:

      if (nRet != SQLITE_OK) {
          const char* errMsg = sqlite3_errmsg(db);
          printf("Error attaching database: %s\n", errMsg);
          // 或者使用 MessageBox() 显示错误消息
      }
      

    通过上述步骤逐一排查,应该能找出导致错误码26的具体原因。如果问题依然存在,请提供更详细的上下文信息或错误日志,以便进一步分析。

    注意: 上述代码示例未包含必要的错误检查(如sqlite3_open()的返回值),在实际编程中应确保对所有SQLite API调用的结果进行检查并妥善处理错误。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 5月4日
  • 修改了问题 4月26日
  • 创建了问题 4月26日

悬赏问题

  • ¥15 GDI处理通道视频时总是带有白色锯齿
  • ¥20 用雷电模拟器安装百达屋apk一直闪退
  • ¥15 算能科技20240506咨询(拒绝大模型回答)
  • ¥15 自适应 AR 模型 参数估计Matlab程序
  • ¥100 角动量包络面如何用MATLAB绘制
  • ¥15 merge函数占用内存过大
  • ¥15 Revit2020下载问题
  • ¥15 使用EMD去噪处理RML2016数据集时候的原理
  • ¥15 神经网络预测均方误差很小 但是图像上看着差别太大
  • ¥15 单片机无法进入HAL_TIM_PWM_PulseFinishedCallback回调函数