Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (Deutsch) » SQL Anywhere Server - Programmierung » SQL Anywhere Datenzugriff-APIs » SQL Anywhere .NET-Datenprovider » Datenzugriff und Datenverarbeitung » SADataAdapter-Objekt für den Datenzugriff und die Datenverarbeitung verwenden

 

Zeilen mit dem SADataAdapter-Objekt einfügen, aktualisieren und löschen

Das SADataAdapter-Objekt ruft die Ergebnismenge in ein DataSet-Objekt ab. Ein DataSet-Objekt ist eine Zusammenstellung von Tabellen sowie ihrer Beziehungen und Integritätsregeln untereinander. Das DataSet-Objekt wird in das .NET Framework eingegliedert und ist unabhängig vom Datenprovider, der für die Verbindung zur Datenbank verwendet wird.

Wenn Sie das SADataAdapter-Objekt verwenden, müssen Sie mit der Datenbank verbunden sein, um das DataSet-Objekt zu füllen und die Datenbank mit Änderungen zu aktualisieren, die am DataSet-Objekt vorgenommen wurden. Sobald das DataSet-Objekt mit den Daten gefüllt ist, können Sie es jedoch auch ohne bestehende Datenbankverbindung ändern.

Wenn Sie Ihre Änderungen nicht sofort in der Datenbank übernehmen möchten, können Sie das DataSet-Objekt einschließlich Daten und/oder Schema mittels der WriteXML-Methode in eine XML-Datei schreiben. Danach können Sie die Änderungen zu einem späteren Zeitpunkt übernehmen, indem Sie das DataSet-Objekt mit der ReadXML-Methode laden.

Weitere Hinweise finden Sie in der Dokumentation zum .NET Framework unter den Rubriken WriteXML und ReadXML.

Wenn Sie die Update-Methode aufrufen, um Änderungen aus dem DataSet-Objekt in die Datenbank zu übernehmen, analysiert das SADataAdapter-Objekt die durchgeführten Änderungen und ruft dann die geeigneten Anweisungen (INSERT, UPDATE oder DELETE) auf. Wenn Sie das DataSet-Objekt verwenden, können Sie Änderungen (Einfügen, Aktualisieren oder Löschen) nur an Daten vornehmen, die aus einer einzelnen Tabelle stammen. Sie können keine Ergebnismengen aktualisieren, die auf Joins basieren. Wenn ein anderer Benutzer die Zeile, die Sie aktualisieren möchten, gesperrt hat, wird eine Ausnahmebedingung generiert.

Vorsicht

Alle Änderungen, die Sie im DataSet-Objekt vornehmen, werden offline durchgeführt. Das bedeutet, dass Ihre Anwendung für diese Zeilen keine Sperren in der Datenbank anlegt. Ihre Anwendung muss so konzipiert sein, dass sie Konflikte löst, die eventuell auftreten, wenn die am DataSet-Objekt vorgenommenen Änderungen auf die Datenbank übertragen werden und ein anderer Benutzer diese Daten inzwischen in der Datenbank verändert hat.

Konflikte beim Einsatz des SADataAdapter-Objekts lösen

Wenn Sie das SADataAdapter-Objekt verwenden, werden die Zeilen in der Datenbank nicht mit Sperren versehen. Daher könnten Konflikte auftreten, wenn Sie Änderungen aus dem DataSet-Objekt in der Datenbank übernehmen. Ihre Anwendung muss daher Logik enthalten, die auftretende Konflikte löst oder protokolliert.

Konflikte, die von Ihrer Anwendungslogik verarbeitet werden müssen, sind u.a.:

  • Eindeutige Primärschlüssel   Wenn zwei Benutzer neue Zeilen in eine Tabelle einfügen, muss jede Zeile einen eindeutigen Primärschlüssel haben. Bei Tabellen mit automatisch inkrementierten Primärschlüsseln können die Werte im DataSet-Objekt die Synchronität mit den Werten in der Datenquelle verlieren.

    Hinweise zum Abruf von Primärschlüsselwerten für automatisch inkrementierte Primärschlüssel finden Sie im Abschnitt Primärschlüsselwerte abrufen.

  • Aktualisierungen, die an demselben Wert vorgenommen werden   Wenn zwei Benutzer denselben Wert ändern, muss die Logik Ihrer Anwendung ermitteln können, welcher Wert richtig ist.

  • Schemaänderungen   Wenn ein Benutzer das Schema einer Tabelle verändert, die Sie im DataSet-Objekt aktualisiert haben, schlägt die Aktualisierung bei der Übernahme der Änderungen in die Datenbank fehl.

  • Parallelität von Daten   Gleichzeitig laufende Anwendungen müssen einen einheitlichen Datenbestand anzeigen. Das SADataAdapter-Objekt setzt keine Sperren auf Zeilen, die es abruft. Daher kann ein anderer Benutzer einen Wert in der Datenbank aktualisieren, nachdem Sie Daten aus dem DataSet-Objekt abgerufen haben und offline daran arbeiten.

Viele dieser potenziellen Probleme können vermieden werden, indem Sie Änderungen mithilfe der Objekte SACommand, SADataReader und SATransaction in die Datenbank übernehmen. Dabei wird die Verwendung des SATransaction-Objekts empfohlen, da Sie damit die Isolationsstufe für die Transaktion festlegen können und Sperren auf abgerufene Zeilen gesetzt werden, damit andere Benutzer diese nicht verändern können.

Weitere Hinweise zur Verwendung von Transaktionen für die Übernahme Ihrer Änderungen in die Datenbank finden Sie im Abschnitt Zeilen mit dem SACommand-Objekt einfügen, aktualisieren und löschen.

Um den Prozess der Konfliktlösung zu vereinfachen, können Sie Ihre INSERT-, UPDATE- oder DELETE-Anweisung so schreiben, dass sie als Aufruf einer gespeicherten Prozedur durchgeführt wird. Wenn Sie INSERT-, UPDATE- und DELETE-Anweisungen in gespeicherte Prozeduren einschließen, können Sie eventuell auftretende Fehler abfangen. Zusätzlich zur Anweisung können Sie Logik für die Fehlerbehandlung in die gespeicherte Prozedur einfügen, damit geeignete Maßnahmen getroffen werden, wenn der Vorgang fehlschlägt, z.B. indem die Fehlermeldung in ein Log eingetragen oder der Vorgang erneut versucht wird.

♦  So fügen Sie Zeilen mit dem SADataAdapter-Objekt in eine Tabelle ein
  1. Deklarieren und initialisieren Sie ein SAConnection-Objekt.

    SAConnection   conn = new SAConnection(
        c_connStr );
  2. Öffnen Sie die Verbindung.

    conn.Open();
  3. Erstellen Sie ein SADataAdapter-Objekt.

    SADataAdapter adapter = new SADataAdapter();
    adapter.MissingMappingAction =
        MissingMappingAction.Passthrough;
    adapter.MissingSchemaAction =
        MissingSchemaAction.Add;
  4. Erstellen Sie die erforderlichen SACommand-Objekte und definieren Sie dafür nötige Parameter.

    Der nachstehende Beispielcode erstellt eine SELECT- und einen INSERT-Anweisung und definiert die Parameter für die INSERT-Anweisung.

    adapter.SelectCommand = new SACommand(
        "SELECT * FROM Departments", conn );
    adapter.InsertCommand = new SACommand(
        "INSERT INTO Departments( DepartmentID, DepartmentName )
        VALUES( ?, ? )", conn );
    adapter.InsertCommand.UpdatedRowSource =
        UpdateRowSource.None;
    SAParameter parm = new SAParameter();
    parm.SADbType = SADbType.Integer;
    parm.SourceColumn = "DepartmentID";
    parm.SourceVersion = DataRowVersion.Current;
    adapter.InsertCommand.Parameters.Add(
        parm );
    parm = new SAParameter();
    parm.SADbType = SADbType.Char;
    parm.SourceColumn = "DepartmentName";
    parm.SourceVersion = DataRowVersion.Current;
    adapter.InsertCommand.Parameters.Add( parm );
  5. Füllen Sie das DataTable-Objekt mit den Ergebnissen der SELECT-Anweisung.

    DataTable dataTable = new DataTable( "Departments" );
    int rowCount = adapter.Fill( dataTable );
  6. Löschen Sie die Zeilen im DataTable-Objekt und übernehmen Sie die Änderungen in die Datenbank.

    DataRow row1 = dataTable.NewRow();
    row1[0] = 600;
    row1[1] = "Eastern Sales";
    dataTable.Rows.Add( row1 );
    DataRow row2 = dataTable.NewRow();
    row2[0] = 700;
    row2[1] = "Western Sales";
    dataTable.Rows.Add( row2 );
    recordsAffected = adapter.Update( dataTable );
  7. Zeigen Sie die Ergebnisse der Aktualisierungen an.

    dataTable.Clear();
    rowCount = adapter.Fill( dataTable );
    dataGrid.DataSource = dataTable;
  8. Schließen Sie die Verbindung.

    conn.Close();
♦  So aktualisieren Sie Zeilen mit dem SADataAdapter-Objekt
  1. Deklarieren und initialisieren Sie ein SAConnection-Objekt.

    SAConnection conn = new SAConnection( c_connStr );
  2. Öffnen Sie die Verbindung.

    conn.Open();
  3. Erstellen Sie ein SADataAdapter-Objekt.

    SADataAdapter adapter = new SADataAdapter();
    adapter.MissingMappingAction =
        MissingMappingAction.Passthrough;
    adapter.MissingSchemaAction =
        MissingSchemaAction.Add;
  4. Erstellen Sie ein SACommand-Objekt und definieren Sie seine Parameter.

    Der nachstehende Beispielcode erstellt eine SELECT- und eine UPDATE-Anweisung und definiert die Parameter für die UPDATE-Anweisung.

    adapter.SelectCommand = new SACommand(
        "SELECT * FROM Departments WHERE DepartmentID > 500",
        conn );
    adapter.UpdateCommand = new SACommand(
        "UPDATE Departments SET DepartmentName = ?
        WHERE DepartmentID = ?", conn );
    adapter.UpdateCommand.UpdatedRowSource =
        UpdateRowSource.None;
    SAParameter parm = new SAParameter();
    parm.SADbType = SADbType.Char;
    parm.SourceColumn = "DepartmentName";
    parm.SourceVersion = DataRowVersion.Current;
    adapter.UpdateCommand.Parameters.Add( parm );
    parm = new SAParameter();
    parm.SADbType = SADbType.Integer;
    parm.SourceColumn = "DepartmentID";
    parm.SourceVersion = DataRowVersion.Original;
    adapter.UpdateCommand.Parameters.Add( parm );
  5. Füllen Sie das DataTable-Objekt mit den Ergebnissen der SELECT-Anweisung.

    DataTable dataTable = new DataTable( "Departments" );
    int rowCount = adapter.Fill( dataTable );
  6. Aktualisieren Sie das DataTable-Objekt mit den aktualisierten Werten für die Zeilen und übernehmen Sie die Änderungen in die Datenbank.

    foreach ( DataRow row in dataTable.Rows )
    {
    row[1] = ( string ) row[1] + "_Updated";
    }
    recordsAffected = adapter.Update( dataTable );
  7. Binden Sie die Ergebnisse an das Raster der Anzeige.

    dataTable.Clear();
    adapter.SelectCommand.CommandText =
        "SELECT * FROM Departments";
    rowCount = adapter.Fill( dataTable );
    dataGrid.DataSource = dataTable;
  8. Schließen Sie die Verbindung.

    conn.Close();
♦  So löschen Sie Zeilen mit dem SADataAdapter-Objekt aus einer Tabelle
  1. Deklarieren und initialisieren Sie ein SAConnection-Objekt.

    SAConnection conn = new SAConnection( c_connStr );
  2. Öffnen Sie die Verbindung.

    conn.Open();
  3. Erstellen Sie ein SADataAdapter-Objekt.

    SADataAdapter adapter = new SADataAdapter();
    adapter.MissingMappingAction =
        MissingMappingAction.Passthrough;
    adapter.MissingSchemaAction =
        MissingSchemaAction.AddWithKey;
  4. Erstellen Sie die erforderlichen SACommand-Objekte und definieren Sie dafür nötige Parameter.

    Der nachstehende Beispielcode erstellt eine SELECT- und eine DELETE-Anweisung und definiert die Parameter für die DELETE-Anweisung.

    adapter.SelectCommand = new SACommand(
        "SELECT * FROM Departments WHERE DepartmentID > 500",
        conn );
    adapter.DeleteCommand = new SACommand(
        "DELETE FROM Departments WHERE DepartmentID = ?",
        conn );
    adapter.DeleteCommand.UpdatedRowSource =
        UpdateRowSource.None;
    SAParameter parm = new SAParameter();
    parm.SADbType = SADbType.Integer;
    parm.SourceColumn = "DepartmentID";
    parm.SourceVersion = DataRowVersion.Original;
    adapter.DeleteCommand.Parameters.Add( parm );
  5. Füllen Sie das DataTable-Objekt mit den Ergebnissen der SELECT-Anweisung.

    DataTable dataTable = new DataTable( "Departments" );
    int rowCount = adapter.Fill( dataTable );
  6. Fügen Sie die neuen Zeilen in das DataTable-Objekt ein und übernehmen Sie die Änderungen in die Datenbank.

    for each ( DataRow in dataTable.Rows )
    {
        row.Delete();
    }
    recordsAffected = adapter.Update( dataTable )
  7. Binden Sie die Ergebnisse an das Raster der Anzeige.

    dataTable.Clear();
    rowCount = adapter.Fill( dataTable );
    dataGrid.DataSource = dataTable;
  8. Schließen Sie die Verbindung.

    conn.Close();