如何使用Clientdataset控件的SQL语句在客户端直接在客户端上传文件到数据库?(50分)

  • 主题发起人 主题发起人 4110349
  • 开始时间 开始时间
4

4110349

Unregistered / Unconfirmed
GUEST, unregistred user!
服务端只起到连接数据库和让客户端连接的作用,直接在客户端用SQL语句操作数据库。
数据库用的是SQL SERVER 2000,有一个表中的字段类型是IMAGE,我用来存EXE文件的,我在客户端直接用SQL语句上传EXE文件到数据库,但是传上去的只是一个3字节大小的文件,可能是文件损坏,也可能是根本就没有传上去,但是程序运行正常,没有提示错误。我用ADO控件直接连接数据库,同样的操作方法,是可以把exe文件正确上传到数据库的。不知道用Clientdataset控件问题出在什么地方,请大家帮忙。谢谢!!!
 
服务端用ADO+DataSetProvider会上传的文件不能用,换用dbexpress+DataSetProvider同样也是上传的文件不可用。
 
www.source520.com 站长必进 2万源代码电子经典书狂下载
 
有这样的问题吗?不知道你是怎么处理的
 
就是用SQL语句添加和读取sql server 2000的Image字段,往字段里面存的是EXE文件!
 
我往里面写图片,就可以写进去,取出来啊 Ado做的com+
 
function THRDM.UpFile(aStrWhere,upFieldName,upFile:string;otherUpFieldsVal:string=''): string;
var
fileOle:olevariant;
begin
result:='失败';
try
p.ChangeCursor();
fileOle:=FileToVariant(upFile);
result:=self.sckCon.AppServer.UpBlobData(aStrWhere,upFieldName,fileOle,otherUpFieldsVal);
//对指定表和字段上传BLOB值,系统自动判断增加还是修改,最后一个参数把字段名和值用;隔开
// self.UpFile('select * from 生产_调度日志表 where ID=1','调度日志内容',Upfile);
if result='ok' then
result:='成功';
finally
p.RestoreCursor;
end;
end;
function FileToVariant(FileName: String): OleVariant;
var
AStream: TFileStream;
MyBuffer: Pointer;
begin
AStream:=TFileStream.create(FileName,fmOpenRead);
try
aStream.Seek(0, soFrombegin
ning);
Result:=VarArraycreate([0, AStream.size-1], VarByte);
MyBuffer:=VarArrayLock(Result);
AStream.ReadBuffer(MyBuffer^, AStream.Size);
VarArrayUnlock(Result);
finally
AStream.Free;
end;

end;

----------------------------以上是客户端代码
-----------------以下是中间层函数的实现
function THRRDM.UpBlobData(const strSelSql, strUpField: WideString;
var varData: OleVariant;
const FieldsAndVal: WideString): OleVariant;
var //更新BLOB字段内容,根据strSelSql查找,有则更新,无或者多就新增
//通常strSelSql 根据 主键来定位
//FieldsAndVal 用来传入当要新增的时候需要一起提交的字段=值;隔开
tmpDb:TadoDataSet ;
tmpStream:TmemoryStream;
whereStr:string;
FieldValList:TstringList;
i:integer;
begin
result:='发生未知错误';
tmpDb:=TadoDataSet.Create(self);
try
tmpDb.Connection:=TheMainForm.ADOConnection1;

if FieldsAndVal='' then
begin
//表示更新
DBRunSQL(tmpDb,strSelSql);
tmpStream:=TmemoryStream.Create;
try
VariantToStream(varData,tmpStream);
tmpDb.Edit;
tBlobField(tmpDb.fieldbyname(strUpField)).LoadFromStream(tmpStream);
tmpDb.Post;
// tBlobField(tmpDb.fieldbyname(strUpField)).SaveToFile('c:/ldl');

result:='ok';
finally
tmpStream.Free;
end;
end
else
//以下新增
begin
//begin
11 1
//
DBRunSQL(tmpDb,'select top 1 * from '+after('from',strSelSql));
tmpStream:=TmemoryStream.Create;
try
VariantToStream(varData,tmpStream);
tmpDb.insert;
tBlobField(tmpDb.fieldbyname(strUpField)).LoadFromStream(tmpStream);
FieldValList:=TstringList.Create;
TRY
FieldValList.Text:=stringReplace(FieldsAndVal,';',chr(13),[rfReplaceAll]);
for i:= 0 to FieldValList.Count-1do
begin
if FieldValList<>'' then
tmpDb.FieldByName(before('=',FieldValList)).AsString:=UnQuotedStr(after('=',FieldValList));//
end;
//for 得到每个更新字段
tmpDb.Post;
result:='ok';
FINALLY
FieldValLisT.Free;
end;
finally
tmpStream.Free;
end;
end;
//begin
11 1

finally
tmpDb.Free ;
end;
end;
 
谢谢楼上的回复,我现在是想不在中间层写代码,只是想在客户端用SQL语句操作数据库。
 
多人接受答案了。
 
后退
顶部