2014-11-14 2 views
0

많은 튜토리얼에서 datasnap 클라이언트의 데이터베이스에서 데이터를 선택하는 방법을 읽습니다. dbgrid를 완료하십시오. 하지만 이제 행을 삽입하거나 업데이트하는 방법을 알아야합니다 (p.e "new client"). 모두가 나에게 책이나 튜토리얼을 추천 할 수 있습니까?DataSnap으로 레코드를 삽입하는 방법

clientclassesunit과는 별도로 clientide의 clientdatamodule에 sqlconnection이 있습니다. 삽입 SQL 문을 사용하여 wuth에 SQLQuery를 적용하려고했으나 기능이 작동하지 않습니다. 내가 서버 측에있는 다른 한강

: 내가 삽입하려고이 방법

procedure TServerMethods1.nuevocheque(idcliente,numero,cuenta,idbanco : integer; fr,fc, titular:string ;importe:Double;cobrado:Boolean); 
var 
ucheque:integer; 
begin 
    with qicheque do 
    begin 
     Open; 
     ParamByName('idcliente').AsInteger:=idcliente; 
     ParamByName('numero').AsInteger:=numero; 
     ParamByName('fr').AsDate:=StrToDate(fr); 
     ParamByName('fc').AsDate:=StrToDate(fc); 
     ParamByName('importe').AsFloat:=importe; 
     ParamByName('titular').AsString:=titular; 
     ParamByName('cobrado').AsBoolean:=cobrado; 
     ParamByName('cuenta').AsInteger:=cuenta; 

     ExecSQL(); 

    end; 
end; 

는 문은 구성 요소의 SQL 속성에 있습니다.

procedure TForm4.BGuardarClick(Sender: TObject); 
var 
idcliente,numero,cuenta,idbanco:integer; 
titular:string; 
cobrado:Boolean; 
fr,fc:string; 
importe:Double; 
begin 
    ClientModule1.nuevocheque.Create(nil); 
    with ClientModule1.nuevocheque do 
    begin 

    idcliente:=1; 
    numero:=StrToInt(ENumero.Text); 
    cuenta:=StrToInt(Ecuenta.Text); 
    idbanco:=1; 
    titular:=ENombre.Text; 
    cobrado:=False; 
    importe:=StrToFloat(EMonto.Text); 
    fr:=EFechaEmision.Text; 
    fc:=EFechacobro.Text; 


    end; 

end; 

하지만 나던 기능 : 클라이언트 측에

, 나는 TSqlServerMethod는 느릅 나무 통화 "nuevocheque"가. 도움을 주셔서 감사합니다

+0

코드에서 'Open' 호출을 제거하십시오. 'qicheque'가 준비된 SQL 문을 포함하고 있다면, params를 채우고'ExecSQL'을 호출하십시오. – TLama

+0

어떤 서버 백엔드, MS Sql Server, MySql 등을 사용하고 있습니까? – MartynA

+0

MySQL, 나는 워크 벤치를 가지고있다 – user3780282

답변

0

데이터베이스 연결로 사용하는 방법을 모르겠습니다. 내 자신의 편의를 위해 dbGO (변형에 의해 전달 된 매개 변수)를 약간 수정했습니다.
또한 서버 메서드에서 함수를 만들었습니다. 클라이언트가 문제 (쿼리, 연결 등)를 받았음을 알릴 수 있습니다. 난 당신이 일반적으로 ServerMethods1라는 개체를 생성하는 프록시 유닛을 생성한다고 가정 클라이언트에 대한

//server 
function TServerMethods1.NuevoCheque(idcliente, numero, cuenta, 
    idbanco: integer; fr, fc, titular: string; importe: Double; 
    cobrado: Boolean): Boolean; 
begin 
    try 
    with qicheque, Parameters do 
     begin 
     Close; 
     ParamByName('idcliente').Value:=idcliente; 
     ParamByName('numero').Value:=numero; 
     ParamByName('fr').Value:=StrToDate(fr); 
     ParamByName('fc').Value:=StrToDate(fc); 
     ParamByName('importe').Value:=importe; 
     ParamByName('titular').Value:=titular; 
     ParamByName('cobrado').Value:=cobrado; 
     ParamByName('cuenta').Value:=cuenta; 
     ExecSQL(); 
     end; 
     Result := true; 
    except 
    Result := false; 
    //raise; <-- uncomment if you want to handle this properly in your code 
    end; 
end; 


다음은 서버 방법?
클라이언트 dbx 연결을 여기에 전달해야합니다. 코드에 nil을 넣는 것을 보았 기 때문에 이것을 말합니다.

// client 
procedure TfrmClient.BGuardaClick(Sender: TObject); 
var 
    sm : TServerMethods1Client; // <-- generated by proxy generator 
    idcliente,numero,cuenta,idbanco : integer; 
    fr,fc, titular : string ; 
    importe : Double; 
    cobrado : Boolean; 
begin 
    sm := TServerMethods1Client.Create(SQL.DBXConnection); 
    if sm.nuevocheque(idcliente,numero,cuenta,idbanco, fr,fc, titular, importe, cobrado) then 
    // ok 
    else 
    // error 
    sm.Free; 
end; 


HTH

+1

'Value' 속성을 통해 param 값을 할당 할 때 타입 안전성을 잃어 가고있다. – TLama

+0

'code' sm : = TServerMethods1Client.Create (SQL.DBXConnection); 'code'이 줄에는 "선언되지 않은 식별자"SQL "이 나와 있습니다. 다른 질문 : 우리가 조건을 필요로하는 if 문장에서 "= true"가 될 것인가? – user3780282

+0

코드 형식 : 제외 결과 : = false; 끝; *는 항상 피해야합니다 *. 예외를 숨기면 코드가 배포되면 훨씬 더 복잡한 문제를 식별 할 수 있습니다. 절대 오류 세부 사항을 잃지 마십시오. 항상 사용자에게 오류 세부 정보를 제공하여 사용자가 전화를 걸 때 잘못 된 점을 이해할 수 있도록하십시오. 사용자 전체 예외 정보를 표시하지 않으려면 어딘가에 기록하십시오. 처리하지 않은 예외는 항상 다시 발생하십시오. 예외는 매우 강력한 오류 처리 메커니즘이며, 코드 작성의 게으름 때문에 중성화하지 않습니다. – LDS

0

당신은 원격 메소드 호출을 사용할 수 있지만, 그들은 자동으로 자동으로 데이터를 인식 컨트롤을 업데이트하지 않습니다. Datasap은 그것을 처리 할 수 ​​있습니다. 먼저 클라이언트에 데이터를 추가/업데이트/제거해야합니다. TClientDataset에 의해 관리되는 로컬 캐시에서 일어납니다. 심지어 "게시"할 때도 마찬가지입니다. 준비가되면 Apply() 메서드를 호출하는 원격 서버에 변경 내용을 적용해야합니다. 서버 데이터를 호출하면 서버의 공급자 구성 요소가 클라이언트 데이터 집합에서 변경할 레코드가있는 "델타"를 받고 필요한 INSERT/UPDATED/DELETE SQL 문을 자동으로 생성합니다. 이들이 마음에 들지 않거나 더 복잡한 처리를 수행해야하는 경우 공급자 이벤트를 사용하여 변경된 각 레코드 에 대해 필요한 작업을 직접 수행 한 다음 공급자에게 자동 처리를 피하기 위해 수행자에게 알릴 수 있습니다. 그런 다음 공급자는 클라이언트에 "델타"를 전달하여 데이터 인식 컨트롤을 업데이트하는 데 사용합니다. 델타가 다시 전달되기 전에 "델타"를 수정할 수도 있습니다. 문서에서 Datasnap 아키텍처에 대한 설명을 읽습니다. 이는 다중 단계 구현을 허용하기 위해 여러 구성 요소가 작동하는 다단계 디자인입니다.

+0

그래서 당신이 나에게 권하는 componnent는 클라이언트 측의 TClientDataSet입니까? – user3780282

+0

Delphi DB 인식 컴포넌트를 사용하거나 TDataset 자손 클라이언트 측에서 작업하려는 경우 TClientDataset은 Datasnap 클라이언트 측 데이터 세트로 설계된 컴포넌트입니다. Delphi는 Delphi에서 이러한 작업을 수행하기 위해 도입되었지만 로컬 메모리 내 데이터 세트로도 단독으로 작동합니다. 이것은 Delphi에서 다중 계층 데이터베이스 응용 프로그램을 작성하는 가장 간단한 방법입니다. 그렇지 않으면 모든 것을 직접 처리 할 수 ​​있고 Datasnap을 RPC 메커니즘으로 사용하여 원격 메소드를 호출 할 수 있습니다. 더 많은 코드를 작성해야하며 훨씬 더 복잡해집니다. 앞에서 설명한대로 설명서에 설명되어 있습니다 – LDS

+0

TClientDataSet은 DatasetProvider에 연결해야하며 TQuery 또는 TTAble에 연결해야하지만이 모델은 데이터베이스에 직접 연결되어 있지 않습니까? 이것이 옳다면 왜 "서버"를 사용하거나 개발해야합니까? 예를 들어 ZeosLib을 사용하면 개발이 쉬워 지지만이 2 단계를 쉽게 사용할 수 있습니다. – user3780282

1

글쎄, 나는 데이터를 삽입 mysql 데이터베이스에 나는 desgined했다 달성.

procedure TForm4.BGuardarClick(Sender: TObject); 
var 

idcliente,numero,cuenta,idbanco:integer; 
titular:string; 
cobrado:Boolean; 
fr,fc:string; 
importe:Double; 
a:TServerMethods1Client; 
interes:Double; 
begin 
    a:=TServerMethods1Client.Create(ClientModule1.SQLConnection1.DBXConnection); 


    begin 

    idcliente:=Unit3.id; 
    numero:=StrToInt(ENumero.Text); 
    cuenta:=StrToInt(Ecuenta.Text); 
    idbanco:=lcbbanco.KeyValue; 
    titular:=ENombre.Text; 
    cobrado:=False; 
    if (EP.Text<>'') then 
     begin 
     importe:=StrToFloat(EHC.Text); 
     end 
     else 
     begin 
      importe:=StrToFloat(EMonto.Text); 
     end; 

    fr:=EFechaEmision.Text; 
    fc:=EFechacobro.Text; 


    end; 
    a.nuevocheque(idcliente,numero,cuenta, idbanco,fr,fc,titular,importe,cobrado); 
end; 

내가 만드는 방법이라고했습니다()는 SQL 구성 요소 M Diwo 나를 말했다 같은 :

이 버튼으로 델파이에서 테 코드입니다.

Im 너무 hapy. 모두에게 감사드립니다

관련 문제