Language:

Insert-Anweisung über Data Access Layer mit Rückgabe des aktuellen primary keys

Language: Deutsch
Programming Language: C#
Published by: Cyron
Last Update: 9/1/2006
Views: 851

License: Public Domain

Description

Es ist ein generelles Problem und nach langer Recherche im Internet bin ich zu der Erkenntnis gekommen, das Informationen zu diesem Problem so gut wie gar nicht zu finden sind, wenn man aus Unkenntniss nicht weiß nach welchen Fachbegriffen man suchen soll. Daher dieses Snippet.
Der Code ist für den Datenbankzugriff über einen Data Access Layer ausgelegt (TableAdapter). Als Beispiel dient eine Minidatenbank, die aus lediglich zwei Tabellen besteht, die über eine 1:n Beziehung verfügen. Damit der Code leichter nachzuvollziehen ist folgt nun der Aufbau von "SimpleDatabase".
Syntax:
Tabellen-Name
Feldname, Feld-Typ, null (wenn zulässig, sonst notnull), Beziehung

TableOne
T1_ID, int, notnull, PK
T1_Text, varchar, notnull, --
ID_T2, int, null, FK von TableTwo

TableTwo
T2_ID, int, notnull, PK
T2_Zahl, int, null, --

Um nun einen Datensatz zu insertieren, muß man zunächst TableTwo befüllen. Der Primary key wird von der Datenbank generiert. Dieser muß im Anschluß ausgelesen werden um TableOne damit befüllen zu können.
Da ID_T2 null sein darf, wird im Code der seit .Net 2.0 neu eingeführte nullable Typ benutzt (Typ-Bezeichner mit Fragezeichen).

Code

1 #region Using Directives 2 // Für eine WinForms-Anwendung die Using Directives bitte entsprechend anpassen. 3 using System; 4 using System.Data; 5 using System.Configuration; 6 using System.Web; 7 using System.Web.Security; 8 using System.Web.UI; 9 using System.Web.UI.WebControls; 10 using System.Web.UI.WebControls.WebParts; 11 using System.Web.UI.HtmlControls; 12 using SimpleDatabaseTableAdapters; // Nicht vergessen! :) 13 #endregion 14 15 [System.ComponentModel.DataObject] 16 public class BLL 17 { 18 #region Properties 19 private TableOneTableAdapter _tableOneAdapter = null; 20 protected TableOneTableAdapter AdapterOne 21 { 22 get 23 { 24 if(_tableOneAdapter == null) 25 _tableOneAdapter = new TableOneTableAdapter(); 26 return _tableOneAdapter; 27 } 28 } 29 private TableTwoTableAdapter _tableTwoAdapter = null; 30 protected TableTwoTableAdapter AdapterTwo 31 { 32 get 33 { 34 if(_tableTwoAdapter == null) 35 _tableTwoAdapter = new TableTwoTableAdapter(); 36 return _tableTwoAdapter; 37 } 38 } 39 #endregion 40 41 [System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Insert, true)] 42 public bool InsertData(string text, int? zahl) 43 { 44 SimpleDatabase.TableTwoDataTable TableTwoInstance = new SimpleDatabase.TableTwoDataTable(); 45 SimpleDatabase.TableTwoRow TableTwoRowInstance = TableTwoInstance.NewTableTwoRow(); 46 47 if(zahl == null) 48 TableTwoRowInstance.SetT2_ZahlNull(); 49 else 50 TableTwoRowInstance.T2_Zahl = zahl.Value; 51 TableTwoInstance.AddTableTwoRow(TableTwoRowInstance); 52 int rowsAffected = AdapterTwo.Update(TableTwoInstance); 53 // HACK: Ob bei rowsAffected=0 abgebrochen werden muß, hängt von der Datenbankstruktur ab. 54 // In diesem Beispiel darf rowsAffected 0 sein. 55 56 SimpleDatabase.TableOneDataTable TableOneInstance = new SimpleDatabase.TableOneDataTable(); 57 SimpleDatabase.TableOneRow TableOneRowInstance = TableOneInstance.NewTableOneRow(); 58 TableOneRowInstance.T1_Text = text; 59 TableOneRowInstance.ID_T2 = (int)TableTwoRowInstance.ItemArray.GetValue(0); // Hier wird der PK ausgelesen. 60 TableOneInstance.AddTableOneRow(TableOneRowInstance); 61 rowsAffected = AdapterOne.Update(TableOneInstance); 62 return rowsAffected == 1; // liefert true zurück wenn genau ein Row befüllt wurde. 63 } 64 }

No comments avaiable

Add a comment

Name *  

Email (won't be displayed) *    

Website  

Comment *  

Sicherheitscode Security Code *    

RSS