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

 

Primärschlüsselwerte abrufen

Wenn die von Ihnen aktualisierte Tabelle einen autoinkrementierenden Primärschlüssel hat oder UUIDs benutzt bzw. der Primärschlüssel aus einem Primärschlüsselpool bezogen wird, können Sie eine gespeicherte Prozedur verwenden, um die von der Datenquelle generierten Werte abzufragen.

Wenn Sie das SADataAdapter-Objekt verwenden, kann diese Technik eingesetzt werden, um die Spalten im DataSet-Objekt mit den Primärschlüsselwerten zu füllen, die von der Datenquelle generiert wurden. Wenn Sie diese Technik mit dem SACommand-Objekt verwenden möchten, können Sie entweder Schlüsselspalten aus den Parametern beziehen oder das DataReader-Objekt nochmals öffnen.

Beispiele

In den nachstehenden Beispielen wird eine Tabelle namens adodotnet_primarykey verwendet, welche zwei Spalten - "ID" und "Name" - enthält. Der Primärschlüssel für die Tabelle ist "ID". Die Spalte hat den Datentyp INTEGER und enthält einen autoinkrementierenden Wert. Die Spalte "Name" hat den Datentyp CHAR(40).

Diese Beispiele rufen die folgende gespeicherte Prozedur auf, um den autoinkrementierten Primärschlüsselwert in der Datenbank abzufragen.

CREATE PROCEDURE sp_adodotnet_primarykey( out p_id int, in p_name char(40) )
BEGIN
    INSERT INTO adodotnet_primarykey( name ) VALUES(
      p_name );
    SELECT @@IDENTITY INTO p_id;
END
♦  So fügen Sie eine neue Zeile mit einem autoinkrementierten Primärschlüssel mithilfe des SACommand-Objekts ein
  1. Stellen Sie eine Verbindung zur Datenbank her.

    SAConnection   conn = OpenConnection();
  2. Erstellen Sie ein SACommand-Objekt, das neue Zeilen in das DataTable-Objekt einfügen soll. Im nachfolgenden Beispielcode prüft die Zeile int id1 = ( int ) parmId.Value; den Primärschlüsselwert der Zeile.

    SACommand      cmd = conn.CreateCommand();
    cmd.CommandText = "sp_adodotnet_primarykey";
    cmd.CommandType = CommandType.StoredProcedure;
    SAParameter parmId = new SAParameter();
    parmId.SADbType = SADbType.Integer;
    parmId.Direction = ParameterDirection.Output;
    cmd.Parameters.Add( parmId );
    SAParameter parmName = new SAParameter();
    parmName.SADbType = SADbType.Char;
    parmName.Direction = ParameterDirection.Input;
    cmd.Parameters.Add( parmName );
    parmName.Value = "R & D --- Command";
    cmd.ExecuteNonQuery();
    int id1 = ( int ) parmId.Value;
    parmName.Value = "Marketing --- Command";
    cmd.ExecuteNonQuery();
    int id2 = ( int ) parmId.Value;
    parmName.Value = "Sales --- Command";
    cmd.ExecuteNonQuery();
    int id3 = ( int ) parmId.Value;
    parmName.Value = "Shipping --- Command";
    cmd.ExecuteNonQuery();
    int id4 = ( int ) parmId.Value;
  3. Binden Sie die Ergebnisse an das Raster der Anzeige und übernehmen Sie die Änderungen in die Datenbank.

    cmd.CommandText = "SELECT * FROM " +
        adodotnet_primarykey";
    cmd.CommandType = CommandType.Text;
    SADataReader dr = cmd.ExecuteReader();
    dataGrid.DataSource = dr;
  4. Schließen Sie die Verbindung.

    conn.Close();
♦  So fügen Sie eine neue Zeile mit einem autoinkrementierten Primärschlüssel mithilfe des SADataAdapter-Objekts ein
  1. Erstellen Sie ein neues SADataAdapter-Objekt.

    DataSet         dataSet = new DataSet();
    SAConnection   conn = OpenConnection();
    SADataAdapter  adapter = new SADataAdapter();
    adapter.MissingMappingAction =
        MissingMappingAction.Passthrough;
    adapter.MissingSchemaAction =
        MissingSchemaAction.AddWithKey;
  2. Füllen Sie das DataSet-Objekt mit Daten und dem Schema. Das SelectCommand-Objekt wird dafür von der SADataAdapter.Fill-Methode aufgerufen. Sie können das DataSet-Objekt auch manuell erstellen, ohne die Fill-Methode und das SelectCommand-Objekt zu verwenden, wenn Sie die bestehenden Datensätze nicht brauchen.

    adapter.SelectCommand = new SACommand( "select * from  + adodotnet_primarykey", conn );
  3. Erstellen Sie ein SACommand-Objekt, um die Primärschlüsselwerte aus der Datenbank zu beziehen.

    adapter.InsertCommand = new SACommand(
        "sp_adodotnet_primarykey", conn );
    adapter.InsertCommand.CommandType =
        CommandType.StoredProcedure;
    adapter.InsertCommand.UpdatedRowSource =
        UpdateRowSource.OutputParameters;
    SAParameter parmId = new SAParameter();
    parmId.SADbType = SADbType.Integer;
    parmId.Direction = ParameterDirection.Output;
    parmId.SourceColumn = "ID";
    parmId.SourceVersion = DataRowVersion.Current;
    adapter.InsertCommand.Parameters.Add( parmId );
    SAParameter parmName = new SAParameter();
    parmName.SADbType = SADbType.Char;
    parmName.Direction = ParameterDirection.Input;
    parmName.SourceColumn = "name";
    parmName.SourceVersion = DataRowVersion.Current;
    adapter.InsertCommand.Parameters.Add( parmName );
  4. Füllen Sie das DataSet-Objekt.

    adapter.Fill( dataSet );
  5. Fügen Sie die neuen Zeilen in das DataSet-Objekt ein.

    DataRow row = dataSet.Tables[0].NewRow();
    row[0] = -1;
    row[1] = "R & D --- Adapter";
    dataSet.Tables[0].Rows.Add( row );
    row = dataSet.Tables[0].NewRow();
    row[0] = -2;
    row[1] = "Marketing --- Adapter";
    dataSet.Tables[0].Rows.Add( row );
    row = dataSet.Tables[0].NewRow();
    row[0] = -3;
    row[1] = "Sales --- Adapter";
    dataSet.Tables[0].Rows.Add( row );
    row = dataSet.Tables[0].NewRow();
    row[0] = -4;
    row[1] = "Shipping --- Adapter";
    dataSet.Tables[0].Rows.Add( row );
  6. Übernehmen Sie die Änderungen im DataSet-Objekt in die Datenbank. Wenn die Update-Methode aufgerufen wird, werden die Primärschlüsselwerte auf die Werte geändert, die aus der Datenbank bezogen wurden.

    adapter.Update( dataSet );
    dataGrid.DataSource = dataSet.Tables[0];

    Wenn Sie neue Zeilen in das DataTable-Objekt einfügen und die Update-Methode aufrufen, ruft das SADataAdapter-Objekt das InsertCommand-Objekt auf und ordnet die Ausgabeparameter der Schlüsselspalte für jede Zeile zu. Die Update-Methode wird nur einmal aufgerufen, das InsertCommand-Objekt hingegen wird von der Update-Methode so oft aufgerufen wie für jede hinzugefügte Zeile erforderlich.

  7. Schließen Sie die Verbindung zur Datenbank.

    conn.Close();