读书人

DELPHI中的SQL代码怎么优化

发布时间: 2012-02-26 20:19:43 作者: rapoo

DELPHI中的SQL代码如何优化
DELPHI中的SQL代码如何优化
原MSSQL信息代码如下:
AddSqlstr:='INSERT INTO [EmailMC] '+
' ([EmailBH],[CUSTOMCODE],[EmailNnte],[EmailJB]'+
'VALUES (''' + trim(DDCUSTOMCODE.Text)+''','+''''+
trim(Edit1.Text)+''','+''''+
trim(EdDB_Email_Note.Text)+''','+''''+
trim(FlComBox_JB.Text)+''','+''''+''')';
DM_DBS.MainDconnect.Execute(AddSqlstr);
上面代码是正常的,并且能将“用户信息”保存数据库中
但是我想将上面代码扩展一下,
也能保存 文档和图片功能
EdDB_Email_Note.text 我将OFFICE中的(Word/Excel)内存流的试读取进来的,
增加了一个图片pic
也是以内存流方式读取的,用以下方式
//保存信息
with ADOQuery_Save do
begin
Close;
Open;
Append; //追加记录

是可以保存的,但是反映有点“慢”,我想以
DM_DBS.MainDconnect.Execute(AddSqlstr);
方式保存,代码不知如何写,还请多多赐教




[解决办法]
sql的字符串要求是可见的,而图像、文档是有不可见的字符的
这样肯定就要编码,而且字节数也大了,效率只会更低

图片、文档最好直接保存在数据库所在的服务器的文件系统,而不是数据库里
[解决办法]
大附件直接放在数据库里占用空间很大,而且也很慢。
[解决办法]
文件流或者内存转换成字符串再存入数据库,至少需要2次转换,而且传输的字节数也大了至少1/8
[解决办法]
如果用TMemoryStream进行数据库保存,占用空间太大。
建议做成ftp目录进行保存或读取。。。
[解决办法]
靠谱点的方法是提取二进制转字符串
但这样651就变成了'651'何止是大了1/8
[解决办法]
你为什么要保存成字符串啊?

这样效率低不说, 读取的时候 你还要转流


直接用 Image 就行了


或者 就记录一下 Image的地址, 然后开个 Http的链接, 用Http读取图片,效率都会更好
[解决办法]
好西

[解决办法]
转换为base64编码
[解决办法]
用BinToHex(Buffer, Text: PChar; BufSize: Integer)将内存流转换成字符串,
若是sql server ,支持对二进制字段一字符串字面值的形式插入,格式是0x+上述转换出来的hex字符串值。
也就是 insert into table1 (imagefield1) values ('0x......')

其他数数据库比如oracle啥的应该也有相关的函数可以转换。可以查一下参考文档。


[解决办法]
查了一下oracle里面有个hextoraw的函数可以做转换。
[解决办法]
这个问题曾经我也有过这个想法;根本就达不到这个功能;别浪费感情了!
[解决办法]
如果你实在想继续研究,就看看下边吧
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, jpeg, ExtCtrls{, PSock};

type
TForm1 = class(TForm)
Image1: TImage;
Button1: TButton;
Image2: TImage;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

function StreamToString(mStream:TStream): string;
{将内存流转换成字符串}
function StringToStream(mString:string;mStream:TStream):Boolean;
{返回将字符串保存到内存流是否成功}

var
Form1: TForm1;

implementation

{$R *.dfm}

function StreamToString(mStream: TStream): string;
{将内存流转换成字符串}
var
I: Integer;
begin
Result := '';
if not Assigned(mStream) then Exit;
SetLength(Result, mStream.Size);
for I := 0 to Pred(mStream.Size)do


try
mStream.Position := I;
mStream.Read(Result[Succ(I)], 1);
except
Result:='';
end;
end;{StreamToString}

function StringToStream(mString: string; mStream: TStream): Boolean;
{返回将字符串保存到内存流是否成功}
var
I: Integer;
begin
Result:=True;
try
mStream.Size := 0;
mStream.Position := 0;
for I := 1 to Length(mString) do
mStream.Write(mString[I],1);
except
Result := False;
end;
end; { StringToStream }

procedure TForm1.Button1Click(Sender: TObject);
var
Strm,Strn: TMemoryStream;
Bitmap:TBitmap;
vDir:String;
tStr:String;
begin
if Image1.Picture.Graphic <> nil then
begin
Strm:=TMemoryStream.Create;
Strn:=TMemoryStream.Create;
try
Image1.Picture.Graphic.SaveToStream(Strm);

tStr:=StreamToString(Strm); //TMenoryStream转化为字符串

StringToStream(tStr,Strn); //字符串转化为TMenoryStream

Strn.Position:=0;
Bitmap:=TBitmap.Create;
try
Bitmap.LoadFromStream(Strn);
Image2.Picture.Graphic:=Bitmap;
finally
Bitmap.Free;
end;
finally
Strm.Free;
Strn.Free;
end;
end;
end;

end.
[解决办法]

探讨
引用:
用BinToHex(Buffer, Text: PChar; BufSize: Integer)将内存流转换成字符串,
若是sql server ,支持对二进制字段一字符串字面值的形式插入,格式是0x+上述转换出来的hex字符串值。
也就是 insert into table1 (imagefield1) values ('0x......')

……

[解决办法]
不客气,等待别人给我解决问题的;顺便来瞧瞧,能帮上忙就很高兴了
[解决办法]
哈哈,你的问题都解决了,还有谁会来啊
[解决办法]
这样可以解决你所有问题,文档和图片都可以
var
Tms:TMemoryStream;
Tss:TstringStream;
Tstr:string;
begin
Tms := TMemoryStream.Create;
???.SaveToStream(Tms);
Tss := TstringStream.Create('');

//DecodeStream(Tss,Tms);//在这个位置是将base64转为内存流
//Tms.Position :=0;
//.....
//???.LoadFromStream(Tms);

Tms.Position := 0;
EncodeStream(Tms,Tss);//将内存流转化base64
Tstr := Tss.DataString;

AddSqlstr:='INSERT INTO [EmailMC] (Image) Values ('''+Tstr+''')';
...

Tms.Free;
Tss.Free;
end;
[解决办法]
汗,打//的地方就是转回来的语句;
怎么不好好看看啊!
[解决办法]
可以用Tstringlist,和Tmemorystream转换吧

Image1.Picture.Graphic.SaveToStream(memstream);
list.loadfromstream(memsteam);

list.text就是字符串了.如果要字符串转流的话 list.SaveToStream(memstream);



[解决办法]
探讨
//DecodeStream(Tss,Tms);//在这个位置是将base64转为内存流

EncodeStream(Tms,Tss);//将内存流转化base64
这两行代码的定义过程在那里呀

[解决办法]
var
TMs:TMemoryStream;
Tss:TStringStream;
vDir:String;
begin
TMs:=TMemoryStream.Create;
Tss:=TStringStream.Create('');
TMs.LoadFromFile('D:\语音详单.xls');
Tms.Position:=0;
EncodeStream(Tms,Tss);//将内存流编码为base64字符流
Memo1.Text:=Tss.DataString;
TMs.Free;
Tss.Free;
//
TMs:=TMemoryStream.Create;
Tss:=TStringStream.Create(Memo1.Text);
DecodeStream(Tss,Tms);//将base64字符流还原为内存流
Tms.Position:=0;
TMs.SaveToFile('D:\语音详单1111.xls');



TMs.Free;
Tss.Free;
end;
[解决办法]
大文件保存到数据库?不必这样浪费数据库空间吧?

[解决办法]
...
procedure TForm1.Button1Click(Sender: TObject);
var
MS:TMemoryStream;
sBlob:string;
bBlob:PChar;
iSize:Integer;
sSQL:string;
begin
MS:=TMemoryStream.Create;
try
MS.LoadFromFile('c:\1.bmp');
iSize:=MS.Size;
GetMem(bBlob,iSize);
MS.Position:=0;
MS.ReadBuffer(bBlob^,iSize);
SetLength(sBlob,iSize*2);
BinToHex(bBlob,PChar(sBlob),iSize);
FreeMem(bBlob);
sBlob:='0x'+sBlob;
sSQL:='Insert Into Test(Pic)Select '+sBlob;
finally
MS.Free;
end;
end;
[解决办法]
sSQL:='Insert Into Test(Pic)Select '+sBlob;
执行这段SQL语句,就可以将图片插入到数据库了
[解决办法]
你的问题,不是要将流转换为字符串保存到数据库吗,我给的那段代码就是将流转换为字符串,然后保存到数据库的呀

读书人网 >.NET

热点推荐