2017-02-09 18 views
-1

Hi, EveryBody!Delphi: Как получить все изображения из базы данных сервера, используя привязку к приложениям?

Я Клиент и сервер.

Я использую Delphi-xe8. App -> Multi-Device Application

ОбаClient и сервера используют App привязывать, SQLite базы данных.

Когда сервер добавления изображения в базу данных, это прекрасно, добавив,

Server Side

, но в стороне клиента, когда клиент нажмите «Получить список изображений кнопку». Клиент Получите только одно изображение [Хочу все изображения].

Client Side

1. Quation: Как получить все изображения из базы данных сервера в базе данных клиента. с помощью приложения tethering [SendStream]? Я думаю, проблема с AResource.Value.AsStream нужно Splite, How ... ???

2. Quation: Как скопировать все изображения из базы данных сервера и сохранить в папке Client Created [Client \ db \ images]?

Client 'Get Image List' код кнопки: со стороны

procedure TForm1.GetImgBtnClick(Sender: TObject); 
begin 
tAProfile.SendString(tManager.RemoteProfiles.First,'GetImages','get'); 
end; 

Сервер:

procedure TForm2.tAProfileResourceReceived(const Sender: TObject; 
    const AResource: TRemoteResource); 
    var 
    MS:TMemorystream; 
begin 
if AResource.Hint='GetImages' then 
     begin 
     MS:=TMemorystream.Create; 
     // ShowMessage(AResource.Value.AsString); // msg from client 'get' 

     while not rQuery.Eof do 
      begin 
      tblobField(rQuery.FieldByName('image')).SaveToStream(MS1); 
      Image1.Bitmap:=nil; // Если не занулить будет ошибка 
     // Image1.bitmap.LoadFromStream(MS); 
      rQuery.Next; 
      end; 
      tAProfile.SendStream(tManager.RemoteProfiles.First,'SendImages',MS); //Sending Images to Client MS 
     end; 
end; 

Client Side:

procedure TForm1.tAProfileResourceReceived(const Sender: TObject; 
    const AResource: TRemoteResource); 
begin 
if AResource.Hint='SendImages' then 

    begin 

    // Image1.Bitmap.LoadFromStream(AResource.Value.AsStream); 

    rQuery.Insert; 
    TBlobField(rQuery.FieldByName('image')).LoadFromStream(AResource.Value.AsStream); 
    rQuery.Post; 
    end; 

end; 
+0

Пожалуйста, используйте только общий тег Delphi и тег ** отдельного тега ** для версии Delphi, которую вы используете. Добавление всех из них (в том числе нескольких, которые ** не поддерживают привязку **, просто смешно. –

+0

Я исправлю сейчас. –

ответ

3

Как получить все изображения из базы данных сервера, используя привязку к приложениям?

На самом деле, это очень просто сделать, как я это сделал.

Я надеюсь, что, сравнивая свои приложения с двумя ниже, вы сможете понять , что вам нужно сделать, чтобы получить ваш правильно работать или, если нет, то по крайней мере, может помочь уточнить д чтобы сосредоточиться на том, что такое точная проблема.

Чтобы остановить детали, такие как отсутствие доступных здесь данных, а также использование FMX и живых привязок (и как вы можете их использовать), я вставил свои приложения в данные BioLife.CDS найдите в папке Delphi Samples/Data.Я на основе кода из двух приложений на Malcolm Гровс учебник здесь

http://www.malcolmgroves.com/blog/?p=1854

и в обоих приложениях у меня есть ClientDataSet, DataSource, DBGrid, DBNavigator и DBImage в каждом приложении, подключены именно так, как вы бы ожидайте в минимальном приложении db-aware-101.

Механизма привязывать отправляют данные CDS первого приложения для второго приложения в виде потока, с использованием TClientDataSet SaveToStream и LoadFromStream методы.

Эти два приложения работали в первый раз с нулевой отладкой.

App1 код:

TApp1Form = class(TForm) 
    TetheringManager1: TTetheringManager; 
    TetheringAppProfile1: TTetheringAppProfile; 
    DBImage1: TDBImage; 
    btnConnect: TButton; 
    Label1: TLabel; 
    CDS1: TClientDataSet; 
    CDS1SpeciesNo: TFloatField; 
    CDS1Category: TStringField; 
    CDS1Common_Name: TStringField; 
    CDS1SpeciesName: TStringField; 
    CDS1Lengthcm: TFloatField; 
    CDS1Length_In: TFloatField; 
    CDS1Notes: TMemoField; 
    CDS1Graphic: TGraphicField; 
    DataSource1: TDataSource; 
    DBGrid1: TDBGrid; 
    DBNavigator1: TDBNavigator; 
    btnSendStream: TButton; 
    [...] 
    end; 

    [...] 

procedure TApp1Form.btnConnectClick(Sender: TObject); 
begin 
    TetheringManager1.AutoConnect; 
end; 

procedure TApp1Form.btnSendStreamClick(Sender: TObject); 
begin 
    CDSToStream; 
end; 

procedure TApp1Form.FormCreate(Sender: TObject); 
begin 
    CDS1.Open; 
    Caption := Format('App1 : %s', [TetheringManager1.Identifier]); 
end; 

procedure TApp1Form.TetheringManager1PairedToRemote(const Sender: TObject; const 
    AManagerInfo: TTetheringManagerInfo); 
begin 
    Label1.Caption := Format('Connected : %s %s', 
         [AManagerInfo.ManagerIdentifier, 
          AManagerInfo.ManagerName]); 
end; 

procedure TApp1Form.CDSToStream; 
var 
    Stream : TMemoryStream; 
begin 
    Stream := TMemoryStream.Create; 
    CDS1.SaveToStream(Stream); 
    Stream.Position := 0; 
    TetheringAppProfile1.Resources.FindByName('BioLife').Value := Stream; 
end; 

код клиента:

type 
    TFmxApp2Form = class(TForm) 
    CDS1: TClientDataSet; 
    DataSource1: TDataSource; 
    ImageControl1: TImageControl; 
    BindingsList1: TBindingsList; 
    BindNavigator1: TBindNavigator; 
    BindSourceDB1: TBindSourceDB; 
    LinkControlToField2: TLinkControlToField; 
    TetheringManager1: TTetheringManager; 
    TetheringAppProfile1: TTetheringAppProfile; 
    StringGrid1: TStringGrid; 
    Label1: TLabel; 
    CDS1SpeciesNo: TFloatField; 
    CDS1Category: TStringField; 
    CDS1Common_Name: TStringField; 
    CDS1SpeciesName: TStringField; 
    CDS1Lengthcm: TFloatField; 
    CDS1Length_In: TFloatField; 
    CDS1Notes: TMemoField; 
    CDS1Graphic: TGraphicField; 
    LinkGridToDataSource1: TLinkGridToDataSource; 
    procedure TetheringAppProfile1ResourceReceived(const Sender: TObject; const 
     AResource: TRemoteResource); 
    procedure TetheringManager1PairedFromLocal(const Sender: TObject; const 
     AManagerInfo: TTetheringManagerInfo); 
    private 
    end; 
[...] 
procedure TFmxApp2Form.TetheringAppProfile1ResourceReceived(const Sender: TObject; 
    const AResource: TRemoteResource); 
begin 
    AResource.Value.AsStream.Position := 0; 
    CDS1.LoadFromStream(AResource.Value.AsStream); 
end; 

procedure TFmxApp2Form.TetheringManager1PairedFromLocal(const Sender: TObject; const 
    AManagerInfo: TTetheringManagerInfo); 
begin 
Label1.Text := Format('Connected : %s %s', 
         [AManagerInfo.ManagerIdentifier, 
         AManagerInfo.ManagerName]); 
end; 

Client DFM

object FmxApp2Form: TFmxApp2Form 
    [...] 
    object ImageControl1: TImageControl 
    Bitmap.PNG = {} 
    object BindNavigator1: TBindNavigator 
    [...] 
    DataSource = BindSourceDB1 
    end 
    object StringGrid1: TStringGrid 
    [...] 
    end 
    object Label1: TLabel 
    [...] 
    end 
    object CDS1: TClientDataSet 
    Aggregates = <> 
    FieldDefs = < 
     item 
     Name = 'Species No' 
     DataType = ftFloat 
     end 
     item 
     Name = 'Category' 
     DataType = ftString 
     Size = 15 
     end 
     item 
     Name = 'Common_Name' 
     DataType = ftString 
     Size = 30 
     end 
     item 
     Name = 'Species Name' 
     DataType = ftString 
     Size = 40 
     end 
     item 
     Name = 'Length (cm)' 
     DataType = ftFloat 
     end 
     item 
     Name = 'Length_In' 
     DataType = ftFloat 
     end 
     item 
     Name = 'Notes' 
     DataType = ftMemo 
     Size = 50 
     end 
     item 
     Name = 'Graphic' 
     DataType = ftGraphic 
     end> 
    IndexDefs = <> 
    Params = <> 
    StoreDefs = True 
    Left = 40 
    Top = 32 
    object CDS1SpeciesNo: TFloatField 
     FieldName = 'Species No' 
    end 
    object CDS1Category: TStringField 
     FieldName = 'Category' 
     Size = 15 
    end 
    object CDS1Common_Name: TStringField 
     FieldName = 'Common_Name' 
     Size = 30 
    end 
    object CDS1SpeciesName: TStringField 
     FieldName = 'Species Name' 
     Size = 40 
    end 
    object CDS1Lengthcm: TFloatField 
     FieldName = 'Length (cm)' 
    end 
    object CDS1Length_In: TFloatField 
     FieldName = 'Length_In' 
    end 
    object CDS1Notes: TMemoField 
     FieldName = 'Notes' 
     BlobType = ftMemo 
     Size = 50 
    end 
    object CDS1Graphic: TGraphicField 
     FieldName = 'Graphic' 
     BlobType = ftGraphic 
    end 
    end 
    object DataSource1: TDataSource 
    DataSet = CDS1 
    Left = 104 
    Top = 32 
    end 
    object BindingsList1: TBindingsList 
    Methods = <> 
    OutputConverters = <> 
    Left = 40 
    Top = 152 
    object LinkControlToField2: TLinkControlToField 
     Category = 'Quick Bindings' 
     DataSource = BindSourceDB1 
     FieldName = 'Graphic' 
     Control = ImageControl1 
     Track = False 
    end 
    object LinkGridToDataSource1: TLinkGridToDataSource 
     Category = 'Quick Bindings' 
     DataSource = BindSourceDB1 
     GridControl = StringGrid1 
     Columns = <> 
    end 
    end 
    object BindSourceDB1: TBindSourceDB 
    DataSet = CDS1 
    ScopeMappings = <> 
    Left = 40 
    Top = 88 
    end 
    object TetheringManager1: TTetheringManager 
    OnPairedFromLocal = TetheringManager1PairedFromLocal 
    Text = 'TetheringManager1' 
    AllowedAdapters = 'Network' 
    Left = 40 
    Top = 240 
    end 
    object TetheringAppProfile1: TTetheringAppProfile 
    Manager = TetheringManager1 
    Text = 'TetheringAppProfile1' 
    Group = 'MAGroup' 
    Actions = <> 
    Resources = < 
     item 
     Name = 'BioLife' 
     IsPublic = True 
     Kind = Mirror 
     ResType = Stream 
     OnResourceReceived = TetheringAppProfile1ResourceReceived 
     end> 
    OnResourceReceived = TetheringAppProfile1ResourceReceived 
    Left = 224 
    Top = 240 
    end 
end 

TClientDataSets, кажется, хорошо работают с LiveBindings, так что если вы все еще возникают проблемы, это может стоить делать передачу данных так же, как и я.

Что касается второго д

Как скопировать все изображения из базы данных сервера и сохранить на компьютере-клиенте папку [Client \ DB \ изображения]?

Если вы используете TClientDataSet для хранения данных на клиентском компьютере (даже если вы показываете его с помощью какой-то LiveBindings механизм), вы можете сохранить его на клиенте, просто вызвав метод SaveToFile компакт-дисках игровая.

+0

Мне нужно одним щелчком мыши получить все копии изображений из базы данных сервера в клиентскую базу данных! –

+0

Мне кажется, что нужно Splite AResource.Value.AsStream ... ??? –

+0

http://stackoverflow.com/questions/42153215/how-to-get-images-from-server-using-app-tethering –