AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Prism DataSet, DataView, DataGrid und andere fiese Matenten...
Thema durchsuchen
Ansicht
Themen-Optionen

DataSet, DataView, DataGrid und andere fiese Matenten...

Ein Thema von wikingersven · begonnen am 14. Apr 2006
Antwort Antwort
wikingersven

Registriert seit: 6. Dez 2005
Ort: Hamburg
15 Beiträge
 
Delphi 2005 Professional
 
#1

DataSet, DataView, DataGrid und andere fiese Matenten...

  Alt 14. Apr 2006, 01:13
Datenbank: MS SQL Server • Version: 2005 • Zugriff über: ADO ?
Moin Moin!

Nach zwei verlorenen Tagen schreibe ich jetzt doch mal mein Problem hier rein:

Ich habe eine Tabelle 'tbl_1' auf dem SQL Server. Diese soll in einem DataGrid angezeigt und bearbeitet werden (Update, Insert und Delete), sowie zur Laufzeit gefiltert werden können.

Eine Spezialität: Der Datensatz soll direkt nach verlassen gespeichert werden, soll heissen, nach jedem DS-Wechsel erfolgt ein DataAdapter.Update(DataSet, 'tbl_1'). Die DataSet.AcceptChanges folgen direkt auf das Update.

Der PrimaryKey der Tabelle wird im Datagrid nicht sofort angezeigt, die Lösung mit der Stored Procedure funzt nicht.

Stored Procedure:

SQL-Code:
CREATE Procedure [dbo].[InsertPrevControl]
         @process varchar(150)
           ,@comment text
           ,@importable bit
           ,@requirement text
           ,@legitimacypurpose text
           ,@correctness text
           ,@legitimacytransfer text
           ,@adequecy text
           ,@tableid int
           ,@company int
           ,@deleted bit
   ,@identity int out
AS
INSERT INTO [mgds].[dbo].[tbl_prevControl]
           ([fld_process]
           ,[fld_comment]
           ,[fld_importable]
           ,[fld_requirement]
           ,[fld_legitimacypurpose]
           ,[fld_correctness]
           ,[fld_legitimacytransfer]
           ,[fld_adequecy]
           ,[fld_tableid]
           ,[fld_company]
           ,[fld_delete])
     VALUES
           (@process
           ,@comment
           ,@importable
           ,@requirement
           ,@legitimacypurpose
           ,@correctness
           ,@legitimacytransfer
           ,@adequecy
           ,@tableid
           ,@company
           ,@deleted)
SET @Identity = SCOPE_IDENTITY()
Einen Workaround habe ich gefunden, indem ich nach dem DataSet.AcceptChanges selbigen zerstöre und neu auffülle mit DataAdapter.Fill(DataSet, 'tbl_1'). Das Ergebnis ist OK, der PrimaryKey wird aktualisiert. Über diese DB-Zugriffe bin ich natürlich nicht begeistert.

Die weiteren Funktionen wie Update und Delete funktionieren auch, es sei denn ich ändere den Filter des Dataviews oder befinde mich am Ende (letzter Datensatz) des Datagrids, dann bekomme ich eine Fehlermeldung mit dem Hinweis auf ein fehlendes Objekt.

Initialisierung der Komponenten:

Delphi-Quellcode:
procedure Vorabkontrolle.Vorabkontrolle_Load(sender: System.Object; e: System.EventArgs);
begin
  try
  insertcmd := SQLCommand.create;
  ds := dataset.Create;
  db.get_dataset(ds,'Select * from tbl_prevcontrol', da, 'Vorabkontrolle',true);
  dv := dataview.Create(ds.Tables['Vorabkontrolle']);
  dv.RowFilter := 'fld_company = ' +compnr2.ToString;
  DataGrid1.DataSource := dv;
  Include(BindingContext[dv, ''].PositionChanged, poschanged);
  oldrow := dv.Item[bindingcontext[dv,''].position].Row;
  with insertcmd do begin
    CommandText := 'Insert Vorabkontrolle';
    CommandType := System.Data.CommandType.StoredProcedure;
    Parameters.Add(System.Data.SqlClient.SqlParameter.Create('@process', System.Data.SqlDbType.VarChar, 150, 'fld_process'));
    Parameters.Add(System.Data.SqlClient.SqlParameter.Create('@comment', System.Data.SqlDbType.Text, 640000, 'fld_comment'));
    Parameters.Add(System.Data.SqlClient.SqlParameter.Create('@importable', System.Data.SqlDbType.Bit,2, 'fld_importable'));
    Parameters.Add(System.Data.SqlClient.SqlParameter.Create('@reqiurement', System.Data.SqlDbType.text,640000, 'fld_reqiurement'));
    Parameters.Add(System.Data.SqlClient.SqlParameter.Create('@legitimacypurpose', System.Data.SqlDbType.text,640000, 'fld_legitimacypurpose'));
    Parameters.Add(System.Data.SqlClient.SqlParameter.Create('@correctness', System.Data.SqlDbType.text,640000, 'fld_correctness'));
    Parameters.Add(System.Data.SqlClient.SqlParameter.Create('@legitimacytransfer', System.Data.SqlDbType.text,640000, 'fld_legitimacytransfer'));
    Parameters.Add(System.Data.SqlClient.SqlParameter.Create('@adequecy', System.Data.SqlDbType.text,640000, 'fld_adequecy'));
    Parameters.Add(System.Data.SqlClient.SqlParameter.Create('@tableid', System.Data.SqlDbType.int ,8, 'fld_tableid'));
    Parameters.Add(System.Data.SqlClient.SqlParameter.Create('@company', System.Data.SqlDbType.int, 8,'fld_company'));
    Parameters.Add(System.Data.SqlClient.SqlParameter.Create('@deleted', System.Data.SqlDbType.bit,1, 'fld_delete'));
    Parameters.Add(System.Data.SqlClient.SqlParameter.Create('@Identity', System.Data.SqlDbType.int,8, 'fld_delete')) ;
    with parameters.Item['@Identity'] do begin
     Direction := ParameterDirection.Output;
     SourceColumn := 'fld_prevcontrolid';
     SourceVersion := DataRowVersion.Original;
    end;
  end;
  except
    on ex: Exception do Messagebox.Show(ex.Message, 'Fehler beim Include');
  end;
end;
Bei Position-Wechsel:
Delphi-Quellcode:
Procedure vorabkontrolle.poschanged(sender: System.Object; e: System.EventArgs);
var
  pos: Integer;
  id: string;
  currentrow: DataRow;
begin
  try
    pos := BindingContext[dv, ''].Position;
    currentrow := dv.Item[pos].Row;
    DataGrid1.CaptionText := 'Vorabkontrolle - Position: ' + pos.ToString;
    if (oldrow.RowState = DataRowState.Added) then begin
      db.write_changes(da,ds,true,'Vorabkontrolle');
      ds.AcceptChanges;
      db.get_dataset(ds,'Select * from tbl_prevcontrol', da, 'Vorabkontrolle',true);
      dv := DataView.Create(ds.Tables['Vorabkontrolle']);
      DataGrid1.DataSource := dv;
      Include(BindingContext[dv, ''].PositionChanged, poschanged);
    end;
    oldrow := currentrow;
  except
    on ex: Exception do Messagebox.Show(ex.Message, 'Fehler bei wechseln des Datensatzes ');
  end;
end;
Die Methode für das Wegschreiben der Daten:

Delphi-Quellcode:
procedure DBForm.write_changes(var dat: sqldataadapter; var dst: dataset; ins: boolean; tablename: string);
var
  builder: SQLCommandBuilder;
begin
  dat.DeleteCommand := nil;
  dat.InsertCommand := nil;
  dat.UpdateCommand := nil;
  builder := SQLCommandBuilder.Create(dat);
  try
    dat.Update(dst, tablename);
  except
    on ex: Exception do Messagebox.Show(ex.Message, 'FehleR');
  end;
  builder.Dispose;
end;
Sobald ich die Rowstates Changed oder Deleted mit einfüge kommt es zu den besagten Fehlern am Ende des DataGrids, bzw. nach dem Filtern.

Vielleicht hat ja jemand eine Ahnung... Danke im Voraus.

Sven
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:55 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz