关于三层结构中的客户端数据图像存储,数据库为 MS SQL2000,遇到问题了(100分)

  • 主题发起人 主题发起人 李崇文
  • 开始时间 开始时间

李崇文

Unregistered / Unconfirmed
GUEST, unregistred user!
数据库中有一个表,有三个字段,分别为ID,BinData,ImageData,字段定
义如下:
ID int
BinData varbinary(1152)
ImageData Image
三层结构
服务器端有一个TQuery和TDataSetProvider
我想通过客户端的TClientDataSet进行读出和存取,写了一段代码,
但运行老提示错误信息:
变量或者类型不正确,或者不可以接受的范围之内,要不就与其他数据
相冲突。
我的程序代码如下:
procedure Save(AID: string;
ABinData: OleVariant;
AImg: TPicture);
var
SQL: string;
begin
SQL := 'INSERT INTO Finger(ID,BinData,ImageData) '+
'VALUES(:pID,:pBinData,:pImageData)';
cdsInsert.Close;
cdsInsert.CommandText := SQL;
cdsInsert.Params.ParamByName('pID').AsInteger := StrToInt(AID);
cdsInsert.Params.ParamByName('pBinData').Value := ABinData;
cdsInsert.Params.ParamByName('pImageData').Assign(AImageData);
cdsInsert.Execute;
end;

如果改为如下代码这一切正常:
procedure Save(AID: string;
ABinData: OleVariant;
AImg: TPicture);
var
SQL: string;
begin
SQL := 'SELECT * FROM TableName';
cdsInsert.Close;
cdsInsert.CommandText := SQL;
cdsInsert.Open;
cdsInsert.Insert;
cdsInsert.FieldByName('ID').AsInteger := StrToInt(AID);
cdsInsert.FieldByName('BinData').Value := ABinData;
cdsInsert.FieldByName('ImageData').Assign(AImageData);
cdsInsert.Post;
end;
但我想用SQL操作,不只怎么用SQL实现插入和修改?
 
用Post方式必须的先打开数据表,这可能太耗时了,我想用SQL来实现,
或则能在在AppServer端做一个接口函数,如Save(ID,BinData,ImageData)
客户端直接调用这个函数也行,问题不知道客户端如何把图像数据通过
ImageData参数打包传给AppServer.我是初次接触三层结构,希望大家
指点指点
 
请大家发言
 
procedure Save(AID: string;
ABinData: OleVariant;
AImg: TPicture);
var
SQL: string;
begin
SQL := 'INSERT INTO Finger(ID,BinData,ImageData) '+
'VALUES(:pID,:pBinData,:pImageData)';
//你要设置这几个参数的type,size等
cdsInsert.Close;
cdsInsert.CommandText := SQL;
cdsInsert.Params[0].type:=...
cdsInsert.Params[0].size:=...
....
cdsInsert.Params.ParamByName('pID').AsInteger := StrToInt(AID);
cdsInsert.Params.ParamByName('pBinData').Value := ABinData;
cdsInsert.Params.ParamByName('pImageData').Assign(AImageData);
cdsInsert.Execute;
end
 
To: Flysand:
我把参数类型打下都设了,但还是类型或大小错误
参数类型舍维如下:
cdsInsert.Params.ParamByName('pID').DataType := ftFixedChar;
cdsInsert.Params.ParamByName('pID').Size := 18;
cdsInsert.Params.ParamByName('pBindata').DataType := ftVarBytes;
cdsInsert.Params.ParamByName('pBinData').Size := 1152;
cdsInsert.Params.ParamByName('pImageData').DataType := ftBlob;
cdsInsert.Params.ParamByName('pImageData').Size := 0;
 
是不是服务器端的DataSetProvider还需设置其他属性?
 
DataSetPriovider 的poAllowCommandText为true;
 
看样子用SQL带参数不好解决了,
没办法,我只好首先打开表,然后进行表编辑,最后Post
 
后退
顶部