zoukankan      html  css  js  c++  java
  • DELPHI 数据库操作

    DELPHI 把数据库中的数据转换成XML格式

    function ReplaceString(AString: string): string; 
    begin 
    Result := StringReplace(AString, '&', '&', [rfReplaceAll]); 
    Result := StringReplace(Result, '>', '>', [rfReplaceAll]); 
    Result := StringReplace(Result, '<', '&lt;', [rfReplaceAll]); 
    end; 
    
    function DataSetToXml(ADataSet: TDataSet; 
    Indent: Integer): string; 
    var 
    i: Integer; 
    Indent1, Indent2: string; 
    temp: string; 
    begin 
    Indent1 := Format('%*s', [Indent * 2, ' ']); 
    Indent2 := Indent1 + ' '; 
    Result := EmptyStr; 
    ADataSet.First; 
    while not ADataSet.Eof do 
    begin 
    Result := Result + Format('%s<%s>'#13#10, [Indent1, 'Record']); 
    for i := 0 to ADataSet.FieldCount - 1 do 
    if ADataSet.Fields[i].DataType in [ftString..ftAutoInc, ftMemo, 
    ftWideString] then 
    begin 
    temp := ReplaceString(ADataSet.Fields[i].AsString) 
    Result := Result + Format('%2:s<%0:s>%1:s</%0:s>'#13#10, 
    [ADataSet.Fields[i].FieldName, temp, Indent2]) 
    end; 
    Result := Result + Format('%s</%s>'#13#10, [Indent1, 'Record']); 
    ADataSet.Next; 
    end; 
    end; 
    
    function GenerateXml(ADataSet: TDataSet): string; 
    begin 
    Result := 
    Format('<?xml version="1.0" encoding="gb2312"?>'#13#10'<Records>'#13#10'%s</Records>', 
    [DataSetToXml(ADataSet, 1)]); 
    end;   
    View Code

     DELPHI存取JPEG、BMP图像到数据库完整解决方案

    {=================================================================
    DELPHI存取JPEG、BMP图像到数据库完整解决方案(演示版)
    版权所有  李明亮 2003-2008
    成都地区的朋友需要我兼职的话,请联系。
    nlh6@sina.com.cn
    ==================================================================}
    unit Unit1;
    
    interface
    
    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, DB, ExtDlgs, StdCtrls, ADODB, Grids, DBGrids, ExtCtrls,jpeg,
    DBCtrls;
    
    type
    TForm1 = class(TForm)
    DBGrid1: TDBGrid;
    ADOConnection1: TADOConnection;
    ADOTable1: TADOTable;
    selectimage: TButton;
    savetodb: TButton;
    OpenPictureDialog1: TOpenPictureDialog;
    DataSource1: TDataSource;
    DBNavigator1: TDBNavigator;
    savetofile: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Button1: TButton;
    Bevel1: TBevel;
    Bevel2: TBevel;
    GroupBox1: TGroupBox;
    Image1: TImage;
    Label3: TLabel;
    Label4: TLabel;
    DBImage1: TDBImage;
    procedure selectimageClick(Sender: TObject);
    procedure savetodbClick(Sender: TObject);
    procedure ADOTable1AfterScroll(DataSet: TDataSet);
    procedure savetofileClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure ADOTable1BeforeScroll(DataSet: TDataSet);
    private
    { Private declarations }
    public
    { Public declarations }
    end;
    
    var
    Form1: TForm1;
    
    implementation
    uses unit2;
    {$R *.dfm}
    
    procedure TForm1.selectimageClick(Sender: TObject); //选择图像
    begin
    if openpicturedialog1.Execute then
    image1.Picture.LoadFromFile(openpicturedialog1.FileName );
    end;
    
    ////如下保存方法only to sql and access'data
    procedure TForm1.savetodbClick(Sender: TObject); //保存图像
    var
    strm:tmemorystream;
    ext:string;
    begin
    if image1.picture.Graphic <> nil then //避免image1中无图像保存出错
    begin
    ext:=extractfileext(openpicturedialog1.FileName );
    strm := tmemorystream.Create ;
    try
    image1.Picture.Graphic.SaveToStream(strm);
    adotable1.Edit ;
    strm.Position :=0;
    DBImage1.dataField :=''; //dbimage只能显示BMP,否则myimage由BMP变为jpeg时会出错
    tblobfield(adotable1.FieldByName('myimage')).LoadFromStream(strm);
    //如需直接由文件保存 TBlobField(adotable1.FieldByName('myimage')).LoadFromFile(OpenPictureDialog1.FileName);
    //以下记录保存到数据库的图像格式
    if uppercase(ext) = '.BMP' then
    begin
    adotable1.FieldByName('isbmp').Value := 1;
    dbimage1.dataField := 'myimage';
    end
    else if (uppercase(ext) = '.JPG') OR ( uppercase(ext) = '.JPEG') THEN
    adotable1.FieldByName('isbmp').Value := 0;
    adotable1.Post ;
    finally
    strm.Free ; //如果你选用TBLOBSTREAM类,程序运行到此语句会出错,可该语句前添入adotable1.edit
    end;
    end;
    end;
    ///如下显示方法不适用于paradox中的graphic字段的显示。
    procedure TForm1.adoTable1AfterScroll(DataSet: TDataSet); //显示图像
    var
    strm:tadoblobstream;
    jpegimage:tjpegimage;
    bitmap:tbitmap;
    begin
    strm := tadoblobstream.Create(tblobfield(adotable1.fieldbyname('MYIMAGE')),bmread);
    try //try1
    strm.position :=0;
    image1.Picture.Graphic := nil;
    DBIMAGE1.DataField := '';
    //显示时,BMP、JPEG两种图像数据必需分别处理
    if adotable1.fieldbyname('isbmp').asstring ='1' then
    begin //begin11
    bitmap := tbitmap.Create ;
    try //try11
    bitmap.LoadFromStream(strm);
    image1.Picture.Graphic := bitmap;
    DBIMAGE1.DataField := 'myimage';
    finally
    bitmap.Free;
    end; //end try11
    end //end begin11
    else if adotable1.fieldbyname('isbmp').asstring ='0' then
    begin //begin12
    jpegimage := tjpegimage.Create ;
    try //try12
    jpegimage.LoadFromStream(strm);
    image1.Picture.Graphic := jpegimage;
    finally
    jpegimage.Free ;
    end; //end try12
    end; //end begin12
    finally
    strm.Free ;
    end; //end try1
    end;
    
    ////显示时必须分bmp and jpeg 两种情况处理,而保存可统一。
    
    procedure TForm1.savetofileClick(Sender: TObject);
    var
    tmpstr:string;
    begin
    if image1.Picture.Graphic <> nil then
    begin
    tmpstr := openpicturedialog1.Filter;
    if adotable1.fieldbyname('isbmp').asstring ='1' then
    begin
    openpicturedialog1.Filter := 'Bitmaps (*.bmp)|*.bmp';
    if openpicturedialog1.Execute then
    image1.Picture.SaveToFile(openpicturedialog1.FileName+'.bmp');
    end
    else
    begin
    openpicturedialog1.Filter := 'JPEG Image File (*.jpg)|*.jpg';
    if openpicturedialog1.Execute then
    image1.Picture.SaveToFile(openpicturedialog1.FileName+'.jpg');
    end;
    openpicturedialog1.Filter := tmpstr;
    end;
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    form2.Show;
    end;
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    adoconnection1.Connected := true;
    adoconnection1.LoginPrompt := false;
    adotable1.Active := true;
    end;
    
    procedure TForm1.ADOTable1BeforeScroll(DataSet: TDataSet);
    begin
    dbimage1.dataField :=''; //这条语句不能遗漏,不信你试试
    end;
    
    end. 
    View Code

    Delphi数据库连接池源码

    1.连接池基类THL_RTC_DBPool,可以在这个类基础上继承实现具体数据库的连接池
    unit THighlander_rtcDatabasePool;
    
    // RTC SDK Test proyect
    // freeware
    // Font used in Delphi IDE = Fixedsys
    
    
    {
         Database parameters:
          Set before first call to AddDBConn or GetDBConn.
    
         Put a database connection back into the pool.
          Need to call this after you抮e done using the connection.
    
         GetDBConn = Get database connection from the pool.
          Need to call this after you抮e done using the connection.
    
         CloseAllDBConns = Close all connections inside the Pool.
    }
    
    
    interface
    
    uses
    
      // From CodeGear
      Classes, SysUtils,
    
      // From RealThinClient
      rtcSyncObjs;
    
    
    type
      THL_RTC_DBPool = class
      private
    
        CS      : TRtcCritSec;
        fDBPool : TList;
    
      protected
    
        function  SetUpDB           : TComponent; virtual; abstract;
        function  InternalGetDBConn : TComponent;
        function  GetCount : integer;
        procedure InternalPutDBConn(conn : TComponent );
    
      public
    
        db_server   : ansistring;
        db_username : ansistring;
        db_password : ansistring;
    
        property Count : integer read GetCount;
    
        constructor Create;
        destructor  Destroy; override;
    
        procedure   AddDBConn;
        procedure   CloseAllDBConns ;
    
      end;
    
    implementation
    
    constructor THL_RTC_DBPool.Create;
    begin
      inherited Create;
    
      CS      := TRtcCritSec.Create;
      fDBPool := TList.Create;
    
    end;
    
    Function THL_RTC_DBPool.GetCount : integer;
    begin
      result := fDBPool.Count;
    end;
    
    destructor THL_RTC_DBPool.Destroy;
    begin
      CloseAllDBConns;
      fDBPool.Free;
      CS.Free;
      inherited;
    end;
    
    procedure THL_RTC_DBPool.AddDBConn;
    begin
      CS.Enter;
      try
        fDBPool.Add(SetUpDB);
      finally
        CS.Leave;
      end;
    end;
    
    Function THL_RTC_DBPool.InternalGetDBConn : TComponent;
    begin
      Result := nil;
      CS.Enter;
      try
        if fDBPool.Count > 0 then  begin
          Result := fDBPool.items[fDBPool.Count-1];
          fDBPool.Delete(fDBPool.Count-1);
        end;
      finally
        CS.Leave;
      end;
    end;
    
    procedure THL_RTC_DBPool.InternalPutDBConn(conn : tcomponent) ; 
    begin
      CS.Enter;
      try
        fDBPool.Add(conn);
      finally
        CS.Leave;
      end;
    end;
    
    procedure THL_RTC_DBPool.CloseAllDBConns;
      var  i    : integer;
           dbx  : tComponent;
    begin
      CS.Enter;
      try
        for i := 0 to fDBPool.count - 1 do begin
          dbx := fDBPool.items[i];
          FreeAndNil(dbx);
        end;
        fDBPool.clear;
      finally
        CS.Leave;
      end;
    end;
    
    end.
    
    2.在THL_RTC_DBPool上继承生成THL_RTC_IBXDBPoll连接池
    [delphi] view plain copy
    
    unit THighlander_rtcIBXDatabasePool;
    
    // RTC SDK Test proyect
    // freeware
    // Font used in Delphi IDE = Fixedsys
    
    interface
    
    uses
      // From CodeGear
      Classes, SysUtils,
    
      // Classes and Components for accessing Interbase from Codegear
      IBDatabase,
    
      // From RealThinClient
      rtcSyncObjs,
    
      // Dennis Ortiz rtc DBPool version;
      THighlander_rtcDatabasePool;
    
    
    type THL_RTC_IBXDBPoll = class(THL_RTC_DBPool)
         protected
            function SetUpDB : TComponent; override;
         public
            function  GetDBConn : TIBDatabase;
            procedure PutDBConn(conn : TIBDatabase);
         end;
    
    implementation
    
    function THL_RTC_IBXDBPoll.SetUpDB : Tcomponent;
      var pIBXTrans : TIBTransaction;
    begin
      Result := TIBDatabase.Create(nil);
      try
           tIBDatabase(result).DatabaseName := db_server;
           tIBDatabase(result).LoginPrompt  := false;
    
           pIBXTrans := TIBTransaction.Create(tIBDatabase(result));
           pIBXTrans.Params.Clear;
           pIbxTrans.Params.Add('read_committed');
           pIbxTrans.Params.Add('rec_version');
           pIbxTrans.Params.Add('nowait');
    
           tIBDatabase(result).DefaultTransaction := pIBXTrans;
           tIBDatabase(result).Params.Clear;
           tIBDatabase(result).Params.add('user_name='+db_UserName);
           tIBDatabase(result).Params.add('password='+db_Password);
           tIBDatabase(result).Open;
      except
          FreeAndNil(Result);
          raise;
      end;
    end;
    
    function THL_RTC_IBXDBPoll.GetDBConn : TIBDatabase;
    begin
      result := TIBDatabase(InternalGetDBConn);
    
      if Result = nil then begin
          Result := TIBDatabase(SetupDB);
      end else if not Result.Connected  then begin
        Result.Free;
        Result := TIBDatabase(SetupDB);
      end;
    
    end;
    
    procedure THL_RTC_IBXDBPoll.PutDBConn(conn : tIBDatabase);
    begin
      if conn is tIBDatabase then InternalPutDBConn(conn);
    end;
    
    end.
    View Code

    delphi操作blob字段数据

    第一种解决方案是在库中直接保存原始数据。具体方法如下:
      BLOB数据的入库:要把BLOB数据入库,不能向普通的数据那样直接赋值;而是利用BLOB字段的LoadFromfile方法。采用这个方法,可以直接将各种数据的数据文件存入数据库。代码如下:
    AblobField.LoadFromfile(aFileName);
      数据库与OLE控件间的数据传递也要通过数据文件。即,BLOB字段先将数据存盘;然后,OLE从将数据文件中创建所需要的OLE对象。代码如下:
    AblobField.SaveToFile(aFileName);
    AOleContainer.CreateObjectFromFile(aFileName);
    注意:OLE对象不能直接使用LoadFromFile方法,因为,数据库中存放的BLOB对象的格式是文件原来的格式,而不? E格式,是不能直接读取的。直接读取将导致运行错误。

       第二种方案是在库中以OLE格式保存数据。具体方法如下:
      本方案的不同之处,在于数据入库前先进行格式的转换。格式的转换是通过OLE控件完成的。即,先创建OLE对象,然后入库。示例代码如下:
    AOleContainer.CreateObjectFromFile(aFileName);
    AoleContainer.SaveToFile(tmpFileName);
    AblobField.LoadFromfile(tmpFileName);
      这样作的好处是,由于库中直接存储的是OLE格式,所以,在库与OLE控件之间的数据传递将非常方便。在这种情况下,可以通过文件直接传递:数据字段先将数据存到一个临时文件中,然后,OLE控件从临时文件中读取。即:
    AblobField.SaveToFile(aFileName);
    AOleContainer.LoadFromFile(aFileName);
    另外,还可以通过内存流来完成。使用内存流,可减少磁盘操作,大大提高运行效率。即:
    AblobField.SaveToStream(aStream);
    AOleContainer.LoadFromStream(aStream);

    delphi存取Blob字段

    1.连接
    用Delphi中的TADOQuery查询Oracle10G中的数据表时,Open时提示"数据类型不被支持"的处理方法: 原因是你用的ADO &nbsp; for &nbsp; ORACLE的驱动是微软的Microsoft OLE DB provider for Oracle,不支持BLOB字段, 应使用ORACLE的驱动ORACLE provider  for OLE  DB,如果未装Oracle,去Oracle公司网站下载这个驱动.
    Microsoft OLE DB provider for Oracle 的连接字符串: Provider=MSDAORA.1;Password=nchyuser;User ID=nchyuser;Data Source=ncms;
    ORACLE  provider for OLE DB的连接字符串: Provider=OraOLEDB.Oracle;Password=nchyuser;Persist Security Info=True;User ID=nchyuser;Data Source=NCMS;Extended Properties=""
    使用ORACLE provider for  OLE  DB的连接字符串就OK.
    
    
    2.
    CLOB类型数据的存取
    {假设表t中B字段是CLOB类型}
    {保存}
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      with ADOQuery1 do
      begin
        Close;
        Connection:=ADOConnection1;
        SQL.Clear;
        SQL.Add('select A,B from t where 1<>1');
        Open;
        Append;
        FieldByName('A').AsInteger:=1;
        TBlobField(FieldByName('B')).LoadFromFile('d:1.txt');
        try
        Post;
        except
          cancel;
          showmessage('文件保存失败,请重试!');
          exit;
        end;
        showmessage('文件保存成功!');
      end;
    end;
    
    
    {}
    procedure TForm1.Button2Click(Sender: TObject);
    var
      S:TADOBlobStream;
    begin
      with ADOQuery1 do
      begin
        Close;
        Connection:=ADOConnection1;
        SQL.Clear;
        SQL.Add('select A,B from t where A=1');
        Open;
        if not IsEmpty then
        begin
          s:=TADOBlobStream.Create(TBlobField(FieldByName('B')),bmRead);
          s.SaveToFile('d:2.txt');
          s.Free;
          showmessage('文件读取成功!');
        end else
          showmessage('无数据!');
      end;
    end;
    根据你要保存的数据,自己改变一下
    --------------------------------------------
    
     
    
    stream:TClientBlobStream,TADOBlobStream,
    
    http://www.cnblogs.com/del/archive/2010/02/04/1663860.html 使用Blob字段
    
     
    
    midas
    
    主要错误及解决方法:
    1),可以考虑在客户端和服务器内uses midaslib单元,这样就不用发布midas.dll文件了。
    2),或者在程序里用代码注册 也可以winexec(’regsvr32 c:windowssystem32midas.dll‘,SW_show)
    View Code

    在库中直接保存原始数据

    定义:
    
    TUser = packed record
       Name : string[50];
       CanAsk : boolean;
       NumberOfQuestions : integer;
    end; 
    
    存储:
    
    var
       User : TUser;
       blobF : TBlobField;
       bs : TStream;
    begin
       User.Name := edName.Text;
       User.NumberOfQuestions := StrToInt(edNOQ.Text) ;
       User.CanAsk := chkCanAsk.Checked;
    
       myTable.Insert;
    
       blobF := myTable.FieldByName('data') as TBlobField;
       bs := myTable.CreateBlobStream(blobF, bmWrite) ;
       try
         bs.Write(User,SizeOf(User)) ;
       finally
         bs.Free;
       end;
    end; 
    
     
    
    读取:
    
    var
       User : TUser;
       blobF : TBlobField;
       bs : TStream;
    begin
       if myTable.FieldByName('data').IsBlob then
       begin
         blobF := DataSet.FieldByName('data') as TBlobField;
         bs := myTable.CreateBlobStream(blobF, bmRead) ;
         try
           bs.Read(user,sizeof(TUser)) ;
         finally
           bs.Free;
         end;
       end;
    
       edName.Text := User.Name;
       edNOQ.Text := IntToStr(User.NumberOfQuestions) ;
       chkCanAsk.Checked := User.CanAsk;
    end; 
    View Code

    读取数据

    unit Unit1;
    interface
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, DB, DBTables, StdCtrls, Grids, DBGrids;
    type
      TForm1 = class(TForm)
        Button1: TButton;
        Table1: TTable;
        DataSource1: TDataSource;
        DBGrid1: TDBGrid;
        Button2: TButton;
        Memo1: TMemo;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    var
      Form1: TForm1;
    implementation
    {$R *.dfm}
    procedure TForm1.Button1Click(Sender: TObject);
    var Str:String;
     TxtFile:TextFile;//定义一个文本文件变量TxtFile
     Ch:Char;
    begin
       {设置Table1的属性}
     Table1.DatabaseName:=ExtractFilePath(ParamStr(0));
     Table1.TableName:='friends.db';
     Table1.open;
      //将friends.txt分配给TxtFile变量
     AssignFile(TxtFile,ExtractFilePath(ParamStr(0))+'friends.txt');
     Reset(TxtFile);               //打开friends.txt
     Str:='';
     while not Eof(TxtFile) do    //循环读取文本内容
     begin
      Read(TxtFile,Ch);           //从friends.txt中读一个字符
      if Ch<>Char(13)then         //是否为回车键
       Str:=Str+Ch                //不是回车键,继续读下一个字符
      else
      begin                      //是回车符,表明已经读完一行,此时Str变量即代表一行信息
       Table1.Append;            //追加记录
       Table1.Edit;              //编辑friends.db
         {读取文本内容到四个字段中。关键:顶格的行列号是(1,1)}
       Table1.FieldByName('姓名').AsString:=Copy(Str,1,8);
       Table1.FieldByName('性别').AsString:=Copy(Str,9,2);
       Table1.FieldByName('年龄').AsString:=Copy(Str,13,2);
       Table1.FieldByName('省份').AsString:=Copy(Str,15,8);
       Table1.Post;       //将数据过至friends.db中
       Read(TxtFile,Ch); //略过换行符
       Str:='';          //清Str变量
       end ;
     end;
     Button2.Enabled:=True;
    end;
    procedure TForm1.Button2Click(Sender: TObject);
    var i:integer;
        str:string;
    begin
     Memo1.clear;
     for i:=0 to Table1.FieldCount-1 Do
       str:=str+Table1.Fields[i].FieldName+'  '; //读取字段
     Memo1.Lines.Add(str);
     Memo1.Lines.Add('');
     str:='';
     {循环读取表格中的内容}
     Table1.First;
     While not Table1.Eof Do
      Begin
      for i:=0  To Table1.FieldCount-1 Do
        str:=str+Table1.Fields[i].AsString+'  ';  //读取数据记录
      Memo1.Lines.Add(str);
      Memo1.Lines.Add('');
      str:='';
      Table1.Next;
      end;
    end;
    end.
    View Code

    树型结构

    sort_tl分类表(树型结构)
    Content_tl内容表(id、Father、sort、title、Created、Modification、)

    treeview-listview-richview

    //打开数据库
    Function Sqlite_Open(Flnm:string;KeyWord:string;Conn:TUniConnection):integer;
    //打开数据库
    function Sqlite_Create_Tl(Flnm:string;Conn:TUniConnection):boolean;
    Function Open_Sqlite(DBfile:string;TreeV:TTreeView;Conn:TUniConnection):boolean;
    Function verify_User(Pwd:string;Conn:TUniConnection):boolean;
    Function ISverify(Conn:TUniConnection):boolean;
    Function Setverify(Pwd:string;Conn:TUniConnection):boolean;

    怎样将RichEdit中格式化过的文本保存在数据库,以后回调时能够显示保存时的格式

        
    
    save:
    a  TBlobField(Query1.FieldByName('RichEdit')).Assign(RichEdit1.Lines);
                                                           =================
                                                   .Lines不行的话改为.Lines.Text
    b  TBlobField(Query1.FieldByName('RichEdit')).LoadFromFile(filename);
    
    show:
      RichEdit1.Lines.Assign(Query1.FieldByName('RichEdit'));
        
    
    用流文件进行存储。
    
    给个函数给你。
    
    Function GetREditTextRTFIn(RichEdit:TRichEdit):String;
    var
      StreamF : TStringStream;
    begin
      StreamF := TStringStream.Create('');;
      RichEdit.Lines.SaveToStream(StreamF);
      Result := StreamF.DataString;
      StreamF.Free;
    end;
    主要的作用就是把RICHEDIT的内容转成以流的形式保存在数据库中.
    显示的时候再把数据从库中读出来就行了。
    
    1。定义一个stream:TStream
    2。RichEdit1.Lines.SaveToStream(stream)
    3。TBlobField(Query1.FieldByName('RichEdit')).Assign(stream)
    显示的时候做相反的动作即可。
    View Code

    用delphi 7中的 DBImage 显示 sql 2000里面表的 图片

    用delphi 7中的 DBImage 显示 sql 2000里面表的 图片!
    
    sql 的表该怎么设计呢? delphi 中的 deimage 是不是 选择 datasource=数据源,
    DataField =列名 就可以啦!
    
    
    SQL Server图像字段操作1(转)
    uses jpeg;
    保存 :
    var 
    Ms:TmemoryStream;
    jpg:Tjpegimage;
    begin
    ms:=TmemoryStream.Create;
    Jpg.Assign(Image1.Picture.Graphic);
    Jpg.SaveToStream(Ms) ;
    Ms.Position :=0;
    ADOquery1.append;
    TBlobField(ADOquery1.FieldByName('img')).LoadFromStream(Ms);
    ADOquery1.Post;
    Ms.Free ;
    jpg.free;
    end;
    读取到image中:
    Var
    Ms:TStringStream;
    jpg:Tjpegimage;
    begin
    Ms:=TstringStream.Create('');
    TBlobField(ADOquery1.FieldByName('img')).SaveToStream(Ms);
    Ms.Position :=0;
    Jpg.LoadFromStream(Ms);
    Image2.Picture.Assign(Jpg);
    Ms.Free;
    jpg.free;
    end;
    
    数据库中图片的存取2
    在保存图片时用:
       TBlobField(FieldByName('ZLPIC')).LoadFromFile(OPD.FileName);
    其中OPD为一个打开文件对话框。
    
    在打开图片时用:
       MS := CreateBlobStream(FieldbyName('ZLPIC'),bmRead);
       Image2.Picture.LoadFromStream(MS);
       MS.Free;
    MS 为TStream的变量。
    从来没有什么问题,显示、打印都没问题,也没管过什么文件头。
    
    注:以下程序中注意在uses处加上DB,jpeg,如没有则TBlobField找不到
    如何实现在MS Access数据库中图像的存储和显示
    一、 原理介绍--流式数据的类型及其应用
    在Dephi中提供了TStream来支持对流式数据的操作。TStream是万流之源,但由于它是一个抽象类,故不能被直接使用;而要使用其相应的子类,如:TFileStream 、TStringStream、TMemoryStream、TBlobStream、TWinSocketStream和TOleStream。TStream提供了统一、简洁的方法来进行数据的读写。
    1.)SaveToStream(Stream: TStream );    作用:将类中的数据写到Stream的当前位置中 
    2.)LoadFromStream(Stream: TStream); 作用:从当前位置读入Stream里的数据 
    实际使用时我们基本上只要使用上面两个函数就可以了。 
    二、所遇到的问题及相应的解决方法
    为了节省图像的存储空间和使用更加方便,决定采用JPEG这种图像格式。
    (一)所遇到的问题
    第一、在Delphi 5中进行画图所用到的组件是TImage,所生成的图像的格式为BMP格式,而为了节省图像的存储空间,图像在数据库里存储的格式须为JPEG格式,这样就产生了图像格式转化的需求;而TImage本身并不直接提供这两种图像格式之间的转化。
    第二、怎样将存储在Microsoft Access数据库中的图像取出并且显示出来:在Delphi 5中,能提供这种功能的组件是TDBImage,但该组件却存在着一个很大的缺陷:它所能显示的图像类型只能是一些图标文件,元文件和BMP文件,而不能支持JPEG格式的图像在该组件中的显示;但根据实际需要,在Microsoft Access数据库中所存储的图像数据却是以JPEG格式保存的。
    (二)相应的解决方法
    为了解决上述两个问题,可以采用目前数据库中一种名为大二分对象(BLOB--Binary Large Object),它是用来处理某些特殊格式的数据的。BLOB在数据库的表中实际上是以二进制数据的形式存放的。
    为了处理BLOB字段,可以借鉴一些可视的桌面数据库的方法。在这里,我们选择了通过内存流的方式来完成;使用内存流,可减少磁盘操作,大大提高运行效率。
    具体的过程和相关的程序代码如下:
    1、如何实现在Microsoft Access数据库中的图像存储:
    这里是利用TStream的子类TMemoryStream向Microsoft Access数据库中存储图像的。下面的这段代码是在按了“保存”按钮之后所触发的事件处理程序:
    procedure TForm1.Button1Click(Sender: TObject);
    var 
    MyJPEG : TJPEGImage;
    MS: TMemoryStream;
    begin
    MyJPEG := TJPEGImage.Create;
    try
        with MyJPEG do
        begin
          Assign(Image.Picture.Graphic);
          MS:=TMemoryStream.create;
          SaveToStream(MS);
          MS.Position:=0;
          Table1.Edit;
          TBlobField(Table1.FieldbyName('Image')).LoadFromStream(MS);
          Table1.Post;
          messagebox(getactivewindow(),'图像保存完毕!','保存',mb_ok);          
        end;
    finally
        MyJPEG.Free;
    end;
    end;
    在这段代码里TStream的子类TMemoryStream利用内存流起到了将BMP格式转化为JPEG格式的中间桥梁的作用。
    2、如何将图像从Microsoft Access数据库中取出并显示出来:
    下面的这段代码是在按了“查看图像”按钮之后所触发的事件处理程序:
    procedure TForm1.Button1Click(Sender: TObject);
    var 
    tempstream:TStringStream;
       tempjpeg:TJPEGImage; 
    begin
       try
            tempstream:=TStringStream.Create(' ');     
            TBlobField(Query1.FieldByName('Image')).SaveToStream(tempstream);            
            tempstream.Position:=0;
            tempjpeg:=TJPEGImage.Create;
            tempjpeg.LoadFromStream(tempstream);
            DBImage1.Picture.Bitmap.Assign(tempjpeg);
    finally
            tempstream.Free;
            tempjpeg.Free;
    end;
    end;
    这段代码的主要作用是:首先将查询结果中的JPEG图像格式数据保存到TStringStream中去,然后设置数据指针在TStringStream中的位置为0;接着从TStringStream中读入相关数据,并把它们赋给TDBImage.Picture.Bitmap,这样一来就实现了将数据库中所存储的JPEG格式的数据转化为BMP格式,并在TDBImage中将图像显示出来。最后将TStringStream和TJPEGImage这两个对象释放掉。特别要注意的是不能在设计阶段设置TDBImage的DataField属性,而只能通过写代码的形式在运行阶段把利用流式数据所转化过来的新格式的图像数据赋给TDBImage.Picture.Bitmap。
    
    使用ADO连接
    1.保存
    TBlobField(ADOQuery1.FieldName('blob')).Loadfromfile('文件名')
    提取
    TBlobField(ADOQuery1.FieldName('blob')).Savetofile('文件名')
    2.
    保存
    (ADOQuery1.FieldByName('blob') as TBlobField).Loadfromfile('文件名')
    提取
    (ADOQuery1.FieldByName('blob') as TBlobField).Savetofile('文件名') 
    
    ====================================
    ====================================
    
    uses jpeg;
    保存Image1中的图象至数据库 :
    var 
    Ms:TmemoryStream;
    jpg:Tjpegimage;
    begin
    ms:=TmemoryStream.Create;
    Jpg.Assign(Image1.Picture.Graphic);
    Jpg.SaveToStream(Ms) ;
    Ms.Position :=0;
    ADOquery1.append;
    TBlobField(ADOquery1.FieldByName('img')).LoadFromStream(Ms);
    ADOquery1.Post;
    Ms.Free ;
    jpg.free;
    end;
    从数据库中读取图象到image2中:
    Var
    Ms:TStringStream;
    jpg:Tjpegimage;
    begin
    Ms:=TstringStream.Create('');
    TBlobField(ADOquery1.FieldByName('img')).SaveToStream(Ms);
    Ms.Position :=0;
    Jpg.LoadFromStream(Ms);
    Image2.Picture.Assign(Jpg);
    Ms.Free;
    jpg.free;
    end;
    
    例子2:
    
    procedure TForm1.Button1Click(Sender: TObject);               //插入图片过程 
    var 
    testStream:TMemoryStream; 
    begin 
    try 
        testStream := TMemoryStream.Create;                                 //创建内存流 
        Image1.Picture.Graphic.SaveToStream(testStream);  //将图片保存至内存流中 
        adoquery1.Close; 
        adoquery1.SQL.Clear; 
        adoQuery1.SQL.Add('Insert into test (id,photo) values (:id,:photo)'); //进行插入操作 
        adoquery1.Parameters.ParamByName('id').Value := '003'; 
        adoQuery1.Parameters.ParamByName('photo').LoadFromStream(testStream,ftBlob); //读取保存的内存图 
        adoquery1.ExecSQL; 
    finally 
        testStream.Free;                                                                     //释放内存流 
    end; 
    end; 
    
    procedure TForm1.Button2Click(Sender: TObject);                //读取图片过程 
    var 
    mStream:TMemoryStream; 
    JpgFile:TjpegImage; 
    begin 
    if not ADOQuery1.FieldByName('photo').IsNull then begin ; 
        mStream:=TMemoryStream.Create ; 
        JpgFile:=TjpegImage.Create ; 
        TBlobField(ADOQuery1.FieldByName('photo')).SaveToStream(mStream);  //显示的转换为BlobFiled并保存至内存流 
        mStream.Position :=0; 
        jpgfile.LoadFromStream(MStream); 
        image2.Picture.Assign(JpgFile); 
    end 
    else 
    begin 
       image2.Picture :=nil; 
    end; 
    end;
    View Code

    delphi 一个关于xml文件导入数据库的问题

    function LoadXml(shortPath:string;var xmlobj: IXMLDOMDocument):boolean;
    
    var tmpXml:IXMLDOMDOCUMENT;
    
    begin
    
       shortPath:=localPath+shortPath;
    
       if not FileExists(shortPath) then
    
         begin
    
          LoadXml:=false;
    
          exit;
    
         end;
    
       tmpxml := CreateOLEObject('Microsoft.XmlDom') as IXMLDOMDocument;
    
       tmpxml.async := false;
    
       tmpxml.load(shortPath);
    
       if tmpxml.parseError.errorCode <> 0 then
    
         begin
    
           LoadXml:=false;
    
           Exit;
    
         end;
    
       xmlobj:=tmpxml;
    
       tmpxml:=nil;
    
       Loadxml:=true;
    
    end;
    
    
    
    procedure InitNetInfo(var theNet:netInfoType);
    
    var objxml:IxmlDomdocument;
    
        Node1:IxmlDomNode;
    
    begin
    
    if not Loadxml(iniFile,objXml) then exit;
    
    Node1:=objXml.selectSingleNode('//DefaultIP');
    
    if Node1<>nil then theNet.Csdn_IP:=Node1.text;
    
    Node1:=objXml.selectSingleNode('//DefaultPath');
    
    if Node1<>nil then theNet.Csdn_Path:=Node1.text;
    
    Node1:=objXml.selectSingleNode('//UseProxy');
    
    if Node1<>nil then theNet.flg_UseProxy:=StrtoBool(Node1.text);
    
    Node1:=objXml.selectSingleNode('//ProxyIP');
    
    if Node1<>nil then theNet.prx_IP:=Node1.text;
    
    Node1:=objXml.selectSingleNode('//ProxyPort');
    
    if Node1<>nil then theNet.prx_Port:=Node1.text;
    
    Node1:=objXml.selectSingleNode('//ProxyUser');
    
    if Node1<>nil then theNet.prx_User:=Node1.text;
    
    Node1:=objXml.selectSingleNode('//ProxyPass');
    
    if Node1<>nil then theNet.prx_Pass:=Node1.text;
    
    //其他信息
    
    Node1:=objXml.selectSingleNode('//HeadSize');
    
    if Node1<>nil then HeadSize:=strtoint(Node1.text);
    
    Node1:=objXml.selectSingleNode('//TopicSize');
    
    if Node1<>nil then TopicSize:=strtoint(Node1.text);
    
    objxml:=nil;
    
    Node1:=nil;
    
    end;
    View Code

    在 'msysobjects' 上没有读取数据权限

    出现这个错误是因为系统数据对象没有设置相应的权限。

    总结一下,可以通过如下方法解决:

    1.打开access数据库,在工具 - 选项 - 视图 - 系统对象 打钩

    2.在工具 - 安全 - 用户与组权限 中选择msysobjects 设置读取

    3.如果想隐藏这些系统对象,只要工具 - 选项 - 视图 - 系统对象 把钩去掉!

    在一个Dbgrid中显示多数据库

    在数据库编程中,不必要也不可能将应用程序操作的所有数据库字段放入一个数据库文件中。正确的数据库结构应是:将数据库字段放入多个数据库文件,相关的数据库都包含一个唯一
    的关键字段,在多数据库结构里可以建立联系。
    例如:要编制一个人事管理程序,为简化演示程序,只建立两个数据库,每个数据库都只建
    立两个字段。
    个人简介 jianjie.dbf,由人事处维护;工资情况 gongzi.dbf,由财务处维护。
    1.数据库的建立
    进入DataBase Desktop,建立数据库结构如下:

    jianjie.dbf
    编号 字段名:bianhao size:4 type:number
    姓名 字段名:xingming size:10 type:character

    gongzi.dbf
    编号 字段名:bianhao size:4 type:number
    工资 字段名:gongzi size:4 Dec 2 type:number

    注意: 两个数据库的bianhao字段的size、type必须一致。实际上,两数据库文件可以分布
    在网络的不同计算机上,为便于演示,分别存为″c: estjianjie.dbf″和 ″c: est
    gongzi.dbf″。

    2.应用程序的编制
    启动Delphi, 新建一个工程,在窗体中加入Query控件Query1,databasename属性设为c:
    est;

    加入DataSource控件datasource1, DataSet属性设为Query1; 加入DbGrid控件 dbgrid1,
    DataSource属性设为DataSource1,将Query1.sql属性设为

    SELECT DISTINCT A.bianhao,a.xingming, b.gongzi
    FROM ″jianjie.dbf″ A, ″gongzi.DBF″ b
    WHERE A.bianhao=b.bianhao

    再将Query1.enabled属性设为True, 不用编译, DbGrid1就会显示: bianhao,
    xingming, gongzi三个字段。如果jianjie.dbf和gongzi.dbf中有记录,则记录会显示出来。因
    篇幅所限,此文只介绍了Dbgrid中显示多个数据库内容的一般方法,读者可在此基础上进行完
    善,使该方法更好地适应您的需要。

    Delphi DBExpress 数据库教程自学

    一、dbexpress组件
    其组件下含以下控件,用于进行数据库操作
    1.SQLconnection:故名思义,用于建立数据库连接(相当于ASP中的conn)。相关参数以对话框方式输入,也可通过object inspector进行修改。D7功能强大,可以连接包括MSSQL在内的6种流行数据库:DB2,informix,interbase,MSsql,Mysql,Oracle。以SQL为例,以下参数应注意:
    (1) LoginPrompt:false/true,是否显示登录对话框,默认为false,程序调试时,建议设为true.
    (2) connected,是否建立连接,默认为false,调试时建议改为true.
    2.SQLdataset,通过此组件,可以建立数据集(相当于ASP中的recordset)。一般情况下,通过select语句生成一数据集,以供客户端使用,重要参数设置次序和说明如下:
    (1)第一步:SQLConnection:设定数据库连接
    (2)第二步:commandtype:可选参数有三种ctquery(默认,生成SQL查询:select,update,delete),ctstoreproc(执行存储过程),cttable(生成数据表),一般情况下,建议用ctquery.
    (3)commandtext:执行的SQL命令,须手工输入:如select * from bmxx
    (4)Params:SQL动态参数列表,如果commandtext的命令中用到了动态参数:select * from bmxx where id=:bmid,则在Params中自动出现bmid参数,系统要求对bmid的参数进一步设置,如数据类型等
    (5)Active:仅有两个参数
    flase:相当于ASP中的RS.close()
    true:相当于ASP中的RS.open()
    3.SQLQuery:可以看成是强化版的SQLdataset(commandtext=Ctquery),在程序设计中,多用于对数据表的增删更新操作(Add Delete Update),重要参数说明如下:
    (1)第一步:SQLConnection:设定数据库连接
    (2)第二步:SQL:执行的SQL命令,须手工输入:如delete from bmxx1 where bmid=10 等,
    (3)第三步:Params:SQL动态参数列表,如果SQL命令中用到了动态参数:select * from bmxx where id=:bmid,则在Params中自动出现bmid参数,系统要求对bmid的参数进一步设置,如数据类型等
    (4)第四步:Active:仅有两个参数
    flase:相当于ASP中的RS.close()
    true:相当于ASP中的RS.open()
    4.SQLStoreProc可以看成是强化版的SQLdataset(commandtext=Ctstoreproc),用于调用数据库里的存储过程,重要参数说明如下:
    (1)第一步:SQLConnection:设定数据库连接
    (2)第二步:StoreProcNmae:调用的存储过程名称,系统自动从数据库中取得存储过程名列表
    (3)第三步:Params:SQL动态参数列表,如果存储过程中用到了动态参数:那么Params中会自动出现相关参数。
    (4)第四步:Active:仅有两个参数
    flase:相当于ASP中的RS.close()
    true:相当于ASP中的RS.open()
    5.SQLtable可以看成是强化版的SQLdataset(commandtext=Cttable),用于数据库里的数据表的操作,相关参数如:indexFieldNmae,IndexNmae,MasterFields,MasterSource
    6.SQLMonitor:方便程序员观察SQL命令执行情况的调试工具
    7.SimpleDataSet,允许dbExpress修改数据的组件,可以结合Delphi的数据感知组件以访问数据
    delphi数据库教程自学(2) By 风轻扬兮 发表于 2007-4-4 23:12:00
    利用SQLconnection/SQLdataset/clientdataset/datasetprovider/datasource/dbnavigator建立可更新的数据集
    1)建立SQLconnection(设置loginprompt:false,connected:true)===>SQLconnection1
    说明:建立远程数据库的连接
    2)建立SQLdataset(设置SQLconnection:SQLconnection1,commandtext:select * from bmxx)==>SQLdataset1
    说明:建立远程数据库的远程记录集
    3)建立Datasetprovider(设置其dataset:SQLdataset1)===>datasetprovider1
    说明:将此记录集通过datasetprovider保存到本地缓存中
    4)建立Clientdataset(设置其ProviderName:datasetprovider1,active:true)
    说明:从本地缓存中建立本地记录集
    5)建立datasource(在Clientdataset1上右击,选择Add fields,拖至表单上)==>datasource1
    说明:显示本地记录集的记录对象
    6)设置dbnavigator(设置datasource:dataspurce1)
    说明:对本地记录集记录进行操作控制
    -----------------------------------------------------------------------------------------------------------------------
    经过上述操作,由于操作对象是本地缓存中的记录集,故dbEXpress单向游标的限制已经解决,通过dbnavigator组件,可以新增、修改、删除相关记录数据,但此时的操作仅对于本地缓存的记录集有效新增、修改、删除等操作的结果实际上并未更新于后台
    -----------------------------------------------------------------------------------------------------------------------
    如果需要更新后台数据,还必须调用Clientdataset1.Applyupdate(0)方法来进行

    其过程比较复杂,但是建议在考虑性能时,最好采用此种方法
    Delphi数据库教程自学(3) By 风轻扬兮 发表于 2007-4-5 8:11:00
    SimpleDataSet的用法
    第二讲曾经学习过,在建立可更新的数据集方面,我们通过四步来实现的
    1)建立远程数据库连接sqlconnction1
    2)建立远程记录集sqldataset1
    3)将远程记录集导入至本地datasetprovider1
    4)在本地缓存中寻对应记录集对象clientdataset1
    对于一般的应用而言,这个过程比较繁琐,Delphi提供了一种简易建立本地可更新记录集的方法,即simpledataset,此方法简化了建立本地可更新数据集的过程,在对于小的应用时,如在不过分考虑性能的前提下,可通过此方法,快速建立可更新本地记录集。其过程和设置如下:
    1)建立远程数据库连接sqlconnction1
    2)建立simpledataset1,其重要参数如下:
    (1)Connection:其设置同sqlconnction.(上述第一步)
    (2)Dataset:其设置同sqldataset1.(上述第二步,注意,Active设为true)
    回顾一下快速建立datasource1和DBNavigator的过程
    1)双击simpledataset1,点右键,选择filed editor,在field editor中点右键,选择add all fields(CTRL+F)
    2)选中所有字段(CTRL+L),拖至表单上,然后调整一次相关位置即可(可用CTRL+A全选,Shift+点击选择)
    到此datasource及其字段的输入输出设置完成
    3)建立DBNavigator,直接拖至表单上即可,设置一下其datasource为datasource1
    利用simpledataset建立本地可更新数据源到此完成。
    同样如果要更新远程数据表记录,必须调用simpledataset1.applyupdate(0)方法。
    小结
    simpledataset是一种经过简化后的建立本地可更新数据集的方法,相较dataset+datasetprovider+clientdataset方法而言,它较为便捷,但这是以牺牲数据库性能为代价的。
    故在有一定性能要求的数据库设计中,不推荐使用,在日常学习中,可以经常使用simpledataset
    delphi数据库自学教程(4) By 风轻扬兮 发表于 2007-4-5 8:50:00
    TSimpledataset中的重要参数
    1)dataset--------commandtype
    有三个参数:(1)ctquery-----------执行SQL语句
    (2)ctstoreproc------调用远程数据库中的存储过程
    (3)cttable------------访问指定数据表中的所有数据
    2)Active特性/Execute方法
    (1)仅用于执行返回结果数据集的SQL语句,如select .....的SQL语句,设置Active属性为true=调用了
    Tsimpledataset的open方法,设为false=调用了Tsimpledataset的close方法
    (2)执行不返回结时数据集的SQL语句,例如Delete,Update,Insert或是DDL语句
    3)PacketRecords,
    一次从远程数据源中取得的记录数,说明如下:
    -1 默认值,即一次性取出全部远程数据,建议10-100,应尽量避免造成网络拥挤。
    0 取出远程数据表的元数据(描述数据的信息)
    正数:指定数量
    4)Data特性
    用于暂时存储远程取得的数据集
    5)Delta特性
    用于暂时存储已经修改的数据
    考虑到更大的控制能力和性能因素,建议在应用系统开发时,应尽可能避免用simpledataset,而采用
    sqlconnetion+sqldataset+datasetprovider+clientdataset的方法来控制和访问相关数据
    #delphi编程

  • 相关阅读:
    Codeforces Round #522(Div. 2) C.Playing Piano
    zstu月赛 招生
    Codeforces Round #519 D
    RMQ[区间最值查询] 算法
    Codeforces #364 (Div. 2) D. As Fa(数学公式推导 或者二分)
    尺取法
    Codeforces #366 (Div. 2) D. Ant Man (贪心)
    Codeforces #366 Div. 2 C. Thor (模拟
    裴蜀定理
    CF850 E. Random Elections
  • 原文地址:https://www.cnblogs.com/blogpro/p/11345516.html
Copyright © 2011-2022 走看看