+ -
当前位置:首页 → 问答吧 → 怎样用windows客户端存取大对象?

怎样用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截图:

下载 (120.91 KB)
2010-08-25 15:38


创建数据表的SQL;

CREATE TABLE t
(
   id serial,
   name character varying(10),
   age integer,
   fin bytea,
   doc oid
);


下面的是Windows xp客户端程序的界面截图:

  
下载 (24.54 KB)
2010-08-25 15:19



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