达梦数据库存二进制大文件
达梦数据库存储文件的2种方式:
1.通过存储过程在数据库中存储二进制大文件:
//使用BFILE、BLOB类型,通过存储过程在数据库中存储二进制大对象
create directory LOGDIR as '/home';
CREATE TABLE FILE_LOB
(
T_ID INT NOT NULL,
T_FILE BLOB NOT NULL,
PRIMARY KEY(T_ID)
);
CREATE OR REPLACE PROCEDURE FILE_INSERT
(
TID INT,
FILENAME VARCHAR(200)
)
AS
F_LOB BFILE;
B_LOB BLOB;
BEGIN
INSERT INTO FILE_LOB (T_ID,T_FILE) VALUES (TID,EMPTY_BLOB())
RETURN T_FILE INTO B_LOB;
F_LOB := BFILENAME('LOGDIR',FILENAME);
DBMS_LOB.FILEOPEN(F_LOB,DBMS_LOB.FILE_READONLY);
DBMS_LOB.LOADFROMFILE(B_LOB,F_LOB,
DBMS_LOB.GETLENGTH(F_LOB));
DBMS_LOB.FILECLOSE(F_LOB);
COMMIT;
END;
2. 直接在程序中将文件内容转为二进制,并插入表中的BLOB字段:
#include <QCoreApplication>
#include <QtSql>
#include <QDebug>
#include <QTextCodec>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
db.setHostName("192.168.104.21");
db.setPort(51236);
db.setDatabaseName("DM8");
db.setUserName("SYSDBA");
db.setPassword("SYSDBA");
if (db.open())
qDebug() << "connect ok!";
else
{
qDebug() << "connect fail! " << db.lastError().text().toLatin1();
}
QSqlQuery query;
//清理测试环境
QString strsql = "drop table if exists qt_demo";
query.exec(strsql);
strsql = "create table qt_demo(c1 int, c2 blob)";
query.exec(strsql);
// 读取文件数据,写入 lob 列
//选择要写入的文件
QString f = "../qt_lob/file/DM8_SQL.pdf";
//转换为字节数组
QByteArray mapData;
QFile file(f);
file.open(QIODevice::ReadOnly);
mapData = file.readAll();
file.close();
//插入数据
query.prepare("INSERT INTO qt_demo values(?, ?)");
query.bindValue(0, 1);
query.bindValue(1, mapData);
if (!query.exec()) {
qDebug() << query.lastError();
} else {
qDebug() << "insert OK!";
}
//读取 lob 列数据,写入到文件中
QSqlQuery readquery;
QByteArray databa;
if (readquery.exec("select c2 from provider_demo")) {
QSqlRecord myrecord = readquery.record();
if (readquery.next()) {
databa = readquery.value(myrecord.indexOf("C2")).toByteArray();
}
}
QFile mybfile("../qt_lob/file/DM81_SQL.pdf");
mybfile.open(QIODevice::WriteOnly);
mybfile.write(databa);
mybfile.close();
qDebug() << "select OK!";
return a.exec();
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 提示词工程——AI应用必不可少的技术
· 地球OL攻略 —— 某应届生求职总结
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界