Avatar billede friiiiis Novice
16. april 2012 - 20:22 Der er 5 kommentarer og
1 løsning

Sende data ind i SQL database

Hej,

Jeg skal have lagt nogle data ind i en sql database - hvordan gør jeg det lettest ?

Jeg kan godt lave det vha. INSERT og UPDATE og sætte det ind i ren kildekode vha. en SQL statement men kan jeg ikke gøre det f.eks. i en form for StringGrid og så få data ind på den måde? Kan jeg lave noget "automatisk" validering af de indtastede data i stringgrid komponenten?

hm... jeg leder egentlig bare efter en simpel og ukompliceret måde at få data ind i en SQL database... Nogen forslag ? gerne kreative... ;-)
Avatar billede martinlind Nybegynder
16. april 2012 - 23:56 #1
Interbase/firebird kan læse direkte i en flad tekst fil, du skal bare definere strukturen...

Jeg kan ikke huske præcis hvordan med det finder du hurtigt i hjælpen :-)
Avatar billede mortvader Nybegynder
20. april 2012 - 13:54 #2
Jo, brug en tADOconnection forbundet med en tDataSource og en tDBgrid!

ADOconnectionen forbinder til sqldatabasen via connectionstring propertyen.

DataSourcen skal forbindes til ADOconnectionen via "connection" propertyen.

I datasourcen skal tabellen angives via commandstring propertyen. (eks select * from mintabel)

DBgriden skal forbindes til datasourcen via datasourcename propertyen.


Det var bare lige via min hukommelse. Sig til hvis du ikke kan komme i mål, så får jeg lige startet en delphi op senere på dagen!
Avatar billede hrc Mester
24. april 2012 - 13:32 #3
Har du data liggende på samme sql-server? Så kan du forbinde til den direkte og føre data over.

Jeg lavede dette i forbindelse med jeg skulle reetablere data som på mystisk vis var forsvundet hos kunden. Heldigvis havde jeg en kopi af databasen:

procedure TfrmMain.ExportData(aClientDataSet: TClientDataSet; aTablename: string; aLog: TStrings);
begin
  assert(fOperationType = otExport);

  aClientDataSet.Open;
  try
    aClientDataSet.SaveToFile(format('cds_%s.dat',[aTablename]),dfbinary);
    aLog.Add(format('%s: %d records',[aTablename,aclientDataSet.RecordCount]));
  finally
    aClientDataSet.Close;
  end;
end;

ClientDataSættet er forbundet til en TADOQuery der henter data til det. Det er hvad eksportfunktionen bruger.

procedure TfrmMain.ImportData(aDataset: TDataSet; aInsertScript: TStringList; aTablename: string);
var
  i: integer;
  Field: TField;
  Stream: TStream;
  Query: TADOQuery;
  Parameter: TParameter;
begin
  assert(fOperationType = otImport);

  Query := DM.CreateQuery;
  DM.ADOConnection.Execute(format('SET IDENTITY_INSERT dbo.%s ON',[aTablename]));
  try
    Query.SQL.Assign(aInsertScript);
    DM.ADOConnection.BeginTrans;
    try
      with aDataset do
      begin
        First;
        while not Eof do
        begin
          for i := 0 to Fields.Count - 1 do
          begin
            Field := Fields[i];
            Parameter := Query.Parameters.FindParam(Field.FieldName);
            if assigned(Parameter) then
            begin
              if Field.IsNull then
                Parameter.Value := NULL
              else
                Parameter.Assign(Field);

              if Field.IsNull then
              begin
                Parameter.Value := NULL;
                mLog.Lines.Add(format('%s = NULL',[Field.FieldName]));
              end
              else begin
                Parameter.Assign(Field);
                mLog.Lines.Add(format('%s',[Field.FieldName]));
              end;
            end;
          end;
          // Query.SaveQueryToFile(aTablename + FieldByName('ref').AsString + '.sql');
          Query.ExecSQL;
          Next;
        end;
        DM.ADOConnection.CommitTrans;
        MessageDlg(format('Genindsat %d records',[RecordCount]), mtInformation, [mbOK], 0);
      end;
    except
      DM.ADOConnection.RollbackTrans;
      raise;
    end;
  finally
    DM.ADOConnection.Execute(format('SET IDENTITY_INSERT dbo.%s OFF',[aTablename]));
    Query.Free;
  end;
end;

Hos kunden er min ADOConnection forbundet til deres database og så importerer jeg via et kald der indholder mit insertscript.

procedure TfrmMain.btnImportSagskortdatoerClick(Sender: TObject);
const
  Tablename = 'mytablename';
var
  List: TStringList;
begin
  List := TStringList.Create;
  try
    List.Clear;
    List.Add(format('insert into dbo.%s',[Tablename]));
    List.Add('(ref');
    List.Add(',oprettet');
    List.Add(',..');
    List.Add(',..');
    List.Add(',..');
    List.Add(',..)');
    List.Add('values');
    List.Add('(:ref');
    List.Add(',:oprettet');
    List.Add(',:..');
    List.Add(',:..');
    List.Add(',:..');
    List.Add(',:..)');

    ImportData(DM.cdsMyTable,List,Tablename);
  finally
    List.Free;
  end;
end;

Scriptet fik jeg MS management studio til at generere, men kunne ligeså godt have dannet det på baggrund af select-scriptet i min ADOQuery.

Bemærk, at mine ref-felter er primærnøglen og de er autoincrementerende. Ved at pille ved IDENTITY INSERT sætter jeg data ind på de samme pladser som de havde.

... jeg ved ikke om du kan bruge det til noget, men det var en sjov lille øvelse som kom til at fungere med alle slags felttyper.
Avatar billede friiiiis Novice
06. maj 2012 - 22:28 #4
HRC og mortvader: Skriv et svar og I får pointene...
Avatar billede hrc Mester
07. maj 2012 - 13:22 #5
Kunne du bruge noget af det eller er du bare flink?
Avatar billede mortvader Nybegynder
07. maj 2012 - 15:14 #6
Jeg tror ikke jeg har bidraget særligt, så jeg sidder over :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester