使用Delphi2006.net 编写Webservice
某个项目使用的是Sybase 11 版本,,程序里面用到了Sybase 12版本以上带的OLEDB 驱动,本来这个驱动挺方便的,不需要Sybase客户段就能链接服务端,但是存在问题,
在低版本上的Sybase上面使用,没法更新BLOB字段。没办法只好使用BDP 来更新。
以前没用过BDP,先测试了功能,测试的时候用Oracle来测试,结果用下面的代码更新了半天发现BLOB字段都是空的。
- uses Borland.Data.Provider,Borland.Data.Common,System.IO;
- procedure TForm2.Button1Click(Sender: TObject);
- var
- aBDPConnection : BDPConnection;
- aBDPCommand : BDPCommand;
- aBDPParameter : BDPParameter;
- aBytes : TBytes;
- aFileStream : TFileStream;
- begin
- aBDPConnection := BDPConnection.Create('assembly=Borland.Data.Oracle'
- +', Version=2.5.0.0, Culture=neutral, PublicKeyToken=91d62ebb5b0d1b1b;'
- +'vendorclient=oci.dll;pooling=True;grow on demand=True;'
- +'database=DBNAME;username=USERNAME;max pool size=100;'
- +'password=PASSWORD;provider=Oracle');
- aBDPConnection.Open();
- aBDPCommand := BDPCommand.Create('INSERT INTO T_BDPTEST(IDFIELD,ABLOB) VALUES(''1'',:ABLOB)',aBDPConnection);
- aFileStream := TFileStream.Create('c:/KFC.doc',fmOpenRead);
- Setlength(aBytes,aFileStream.Size);
- try
- aFileStream.Read(aBytes,aFileStream.Size);
- finally
- aFileStream.Free();
- end;
- aBDPparameter := BDPParameter.Create(':ABLOB'
- ,bdpType.Blob,bdpType.stBinary,Length(aBytes) );
- aBDPParameter.Value := ABytes;
- aBDPCommand.Parameters.Add(aBDPParameter);
- aBDPCommand.ExecuteNonQuery();
- aBDPCommand.Dispose();
- aBDPConnection.Close();
- aBDPCommand.Dispose();
- end;
后来检查了半天,发现,BDP比较土的,不支持命名参数,就是 BDPParameter.Create(':ABLOB',...) 写了ABLOB 也是没用的,BDP不知道你更新哪个字段 必须改为
aBDPparameter := BDPParameter.Create(':ABLOB'
,bdpType.Blob,bdpType.stBinary,Length(aBytes),'ABLOB' );才行。
BDP比Ado.net 方便的地方就是 可以通过DataReader来判断一个列的类型,而在Ado.net 中是无法判断一个列是不是BLOB