c oracle 图片存储
导读:在很多实际开发的项目中,图片存储是我们很常见的需求,而如何高效地将图片存储到数据库中,显然是我们需要考虑和解决的问题。C语言和Oracle都是比较常见的开发语言和数据库系统,那么如果使用C语言操作Oracle来存储图片呢?下面我们就来详细讲...
在很多实际开发的项目中,图片存储是我们很常见的需求,而如何高效地将图片存储到数据库中,显然是我们需要考虑和解决的问题。C语言和Oracle都是比较常见的开发语言和数据库系统,那么如果使用C语言操作Oracle来存储图片呢?下面我们就来详细讲解这个问题。
在存储图片之前,我们首先需要了解Oracle数据库中的BLOB数据类型。BLOB是Oracle的一种二进制数据类型,用于存储大型对象(Binary Large Objects),它可以存储二进制文件,如图片、音频、视频等等。要将文件存储到数据库中,我们需要先将文件读入内存中,然后将字节流写入到BLOB字段中。
// C代码示例:#include#include#define MAXBUFLEN 1024*1024 // 定义最大读取字节数int main(){ // OCI初始化OCIEnv *envhp; OCIInitialize(OCI_DEFAULT, 0, 0, 0, 0); OCIEnvInit(& envhp, OCI_DEFAULT, 0, 0); // 获取数据库连接OCIServer *srvhp; OCIHandleAlloc(envhp, (void **)& srvhp, OCI_HTYPE_SERVER, 0, 0); OCISvcCtx *svchp; OCIHandleAlloc(envhp, (void **)& svchp, OCI_HTYPE_SVCCTX, 0, 0); OCIAttrSet(svchp, OCI_HTYPE_SVCCTX, srvhp, 0, OCI_ATTR_SERVER, 0); OCISession *usrhp; OCIHandleAlloc(envhp, (void **)& usrhp, OCI_HTYPE_SESSION, 0, 0); OCIAttrSet(usrhp, OCI_HTYPE_SESSION, "username", strlen("username"), OCI_ATTR_USERNAME, 0); OCIAttrSet(usrhp, OCI_HTYPE_SESSION, "password", strlen("password"), OCI_ATTR_PASSWORD, 0); OCISessionBegin(svchp, envhp, usrhp, OCI_CRED_RDBMS, OCI_DEFAULT); // 获取LOBCreatOCILobLocator* loc; OCIHandleAlloc(envhp, (void **) & loc, OCI_DTYPE_LOB, 0, 0); OCIDescriptorAlloc(envhp, (void **)& loc, OCI_DTYPE_LOB, 0, 0); // 读取文件内容FILE *fp = fopen("test.jpg", "rb"); if(fp == NULL){ printf("open file failed.\n"); return 1; } char *fileBuf = (char*)malloc(MAXBUFLEN*sizeof(char)); int len = fread(fileBuf, 1, MAXBUFLEN, fp); fclose(fp); // 将文件内容写入LOBCreatint i = 0; while (i以上是使用C语言将图片文件写入Oracle数据库的代码示例,其中读取文件内容和往LOBCreat写入二进制流的代码比较重要。要注意的是,由于内存有限,我们需要分块写入LOBCreat。
需要注意的是,我们在将二进制流写入数据库时,需要指定数据的字符集,可以使用SQLCS_IMPLICIT参数来指定默认字符集,而在读取二进制流时,可以使用SQLCS_BINARY参数来指定二进制流的字符集。
// 读取LOBCreat内容的代码示例int total = OCILobGetLength(svchp, errhp, loc); int bufsize = MIN(32767, total); char *buf = new char[bufsize]; int ret = OCILobRead(svchp, errhp, loc, & bufsize, 1, buf, bufsize, NULL, NULL, 0, SQLCS_BINARY); // 输出文件内容printf("file content:\n"); for(int i=0; i
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: c oracle 图片存储
本文地址: https://pptw.com/jishu/504877.html