怎样用windows客户端存取大对象?
时间:2010-08-25
来源:互联网
本帖最后由 crykun 于 2010-08-25 16:37 编辑
最近,用虚拟机安装了一台freebsd服务器,IP地址设定为:192.168.1.253,数据库安装了postgresql8.4。
在windows xp的计算机上安装好postgresql8.2相关的pgAdmin III,psql等工具和ODBC数据库驱动。Windows IP地址为:192.168.1.196
用ODBC作为连接,用C++ builder写了一小段客户端程序,操作像字符型,整形类的数据表没有问题,感觉良好。但操作大对象,弄不出来。
阅读了相关资料,说是要使用libpq操作大对象,感觉太难,特向各位请教。
说简单一点,我的目的是想把客户端计算机上的文件“塞入”数据库中去。
FreeBSD上的postgresql截图:
创建数据表的SQL;
CREATE TABLE t
(
id serial,
name character varying(10),
age integer,
fin bytea,
doc oid
);
下面的是Windows xp客户端程序的界面截图:
C++ builder写的客户端程序(c-pg.exe)完整代码:
//---------------------------------------------------------------------------
#include <vcl.h>
#include <Inifiles.hpp>
#pragma hdrstop
#include "main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
String connstring;
String host;
String port;
String user;
String database;
String password;
//从IniFile中读取参数
TIniFile *ini;
ini = new TIniFile(ChangeFileExt(Application->ExeName, ".ini" ));
host=ini->ReadString( "pgsql", "host","" );
user=ini->ReadString( "pgsql", "user","" );
port=ini->ReadString( "pgsql", "port","" );
database=ini->ReadString( "pgsql", "database","" );
password=ini->ReadString( "pgsql", "password","" );
delete ini;
//取消连接密码对话框提示
ADOConnection1->LoginPrompt=false;
connstring="DRIVER={PostgreSQL Unicode};DATABASE="+database+";SERVER="+host+";PORT="+port+";UID="+user+";PWD="+password+";";
ADOConnection1->Connected=false;
ADOConnection1->ConnectionString=connstring;
ADOConnection1->Connected=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
//
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add("select * from t");
ADOQuery1->Open();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
//
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add("select * from t order by name");
ADOQuery1->Open();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button7Click(TObject *Sender)
{
/*
//用以前 写入SQL Server大对象的方法不行
//导入文件
if (OpenDialog1->Execute())
{
//写入BLOB 字段
if (ADOQuery1->Active)
{
TBlobField *pField=(TBlobField*)ADOQuery1->FieldByName("doc");
ADOQuery1->Edit();
pField->LoadFromFile(OpenDialog1->FileName);
ADOQuery1->Fields->FieldByName("name")->Text=OpenDialog1->FileName;
ADOQuery1->Post();
}
}
//该方法对postgresql数据库oid类型的字段操作会出错。
*/
}
//---------------------------------------------------------------------------
ODBC连接使用客户端程序c-pg.exe读取c-pg.ini文件来配置,ini文件内容如下:
[pgsql]
host=192.168.1.253
database=lindb
user=postgres
port=5432
password=123456
曾试着用postgresql 自带的psql 工具执行sql 命令操作大对象,但只能将服务器上的文件导入数据库,
即只能将freebsd操作系统中的文件导入,windows xp作为客户端计算机中的文件不能导入。
在windows下的用postgresql自带的psql工具:
在cmd 命令行中:
psql -h 192.168.1.253 -U postgres
psql连接成功后,使用以下sql命令测试:
\c lindb
CREATE TABLE dt(name text,doc oid);
INSERT INTO dt VALUES('11doc', lo_import('/tmp/11.doc'));
SELECT lo_export(dt.doc, '/tmp/test.doc') FROM dt WHERE name='11doc';
以上操作获得了成功, 在windows下操作, freebsd 操作系统下的/tmp/11.doc成功导入了数据库,也成功了读取出来,生成了一个test.doc文件。
请高人指点怎么用C语言,vc或者bcb 或其它编程语言,操作postgresql数据库中的大对象,把客户端上的文件而不是服务器上的文件“塞入”数据库。
最近,用虚拟机安装了一台freebsd服务器,IP地址设定为:192.168.1.253,数据库安装了postgresql8.4。
在windows xp的计算机上安装好postgresql8.2相关的pgAdmin III,psql等工具和ODBC数据库驱动。Windows IP地址为:192.168.1.196
用ODBC作为连接,用C++ builder写了一小段客户端程序,操作像字符型,整形类的数据表没有问题,感觉良好。但操作大对象,弄不出来。
阅读了相关资料,说是要使用libpq操作大对象,感觉太难,特向各位请教。
说简单一点,我的目的是想把客户端计算机上的文件“塞入”数据库中去。
FreeBSD上的postgresql截图:

创建数据表的SQL;
CREATE TABLE t
(
id serial,
name character varying(10),
age integer,
fin bytea,
doc oid
);
下面的是Windows xp客户端程序的界面截图:

C++ builder写的客户端程序(c-pg.exe)完整代码:
//---------------------------------------------------------------------------
#include <vcl.h>
#include <Inifiles.hpp>
#pragma hdrstop
#include "main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
String connstring;
String host;
String port;
String user;
String database;
String password;
//从IniFile中读取参数
TIniFile *ini;
ini = new TIniFile(ChangeFileExt(Application->ExeName, ".ini" ));
host=ini->ReadString( "pgsql", "host","" );
user=ini->ReadString( "pgsql", "user","" );
port=ini->ReadString( "pgsql", "port","" );
database=ini->ReadString( "pgsql", "database","" );
password=ini->ReadString( "pgsql", "password","" );
delete ini;
//取消连接密码对话框提示
ADOConnection1->LoginPrompt=false;
connstring="DRIVER={PostgreSQL Unicode};DATABASE="+database+";SERVER="+host+";PORT="+port+";UID="+user+";PWD="+password+";";
ADOConnection1->Connected=false;
ADOConnection1->ConnectionString=connstring;
ADOConnection1->Connected=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
//
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add("select * from t");
ADOQuery1->Open();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
//
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add("select * from t order by name");
ADOQuery1->Open();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button7Click(TObject *Sender)
{
/*
//用以前 写入SQL Server大对象的方法不行
//导入文件
if (OpenDialog1->Execute())
{
//写入BLOB 字段
if (ADOQuery1->Active)
{
TBlobField *pField=(TBlobField*)ADOQuery1->FieldByName("doc");
ADOQuery1->Edit();
pField->LoadFromFile(OpenDialog1->FileName);
ADOQuery1->Fields->FieldByName("name")->Text=OpenDialog1->FileName;
ADOQuery1->Post();
}
}
//该方法对postgresql数据库oid类型的字段操作会出错。
*/
}
//---------------------------------------------------------------------------
ODBC连接使用客户端程序c-pg.exe读取c-pg.ini文件来配置,ini文件内容如下:
[pgsql]
host=192.168.1.253
database=lindb
user=postgres
port=5432
password=123456
曾试着用postgresql 自带的psql 工具执行sql 命令操作大对象,但只能将服务器上的文件导入数据库,
即只能将freebsd操作系统中的文件导入,windows xp作为客户端计算机中的文件不能导入。
在windows下的用postgresql自带的psql工具:
在cmd 命令行中:
psql -h 192.168.1.253 -U postgres
psql连接成功后,使用以下sql命令测试:
\c lindb
CREATE TABLE dt(name text,doc oid);
INSERT INTO dt VALUES('11doc', lo_import('/tmp/11.doc'));
SELECT lo_export(dt.doc, '/tmp/test.doc') FROM dt WHERE name='11doc';
以上操作获得了成功, 在windows下操作, freebsd 操作系统下的/tmp/11.doc成功导入了数据库,也成功了读取出来,生成了一个test.doc文件。
请高人指点怎么用C语言,vc或者bcb 或其它编程语言,操作postgresql数据库中的大对象,把客户端上的文件而不是服务器上的文件“塞入”数据库。
作者: crykun 发布时间: 2010-08-25
C++,我最头痛的了。
作者: renxiao2003 发布时间: 2010-08-25
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28