Sie sind hier: Startseite
 Liste aller Codebeispiele

Verwendung des CommandBuilders zur Generierung von SQL-DML-Befehlen

Ein Beispiel zum Einsatz der Klasse System.Data.OleDb.OleDbCommandBuilder aus der .NET-Klassenbibliothek.

Autor: Dr. Holger Schwichtenberg 

Beschreibung

In vielen Fällen reichen die vom OleDbCommandBuilder automatisch generierten SQL-DML-Befehle (UPDATE, INSERT und DELETE). Der OleCommandBuilder erwartet als Ausgangsbasis für seine Dienste ein OleDbDataAdapter-Objekt. Den dort abgelegten SQL-Befehl verwendet er als Grundlage für die Generierung der SQL-DML-Befehle. Die OleDbCommandBuilder-Klasse bietet mit GetInsertCommand(), GetUpdateCommand() und GetDeleteCommand() Zugriff auf die generierten SQL-Befehle. Alle drei Methoden liefern ein OleDbCommand-Objekt zurück, das in dem Attribut CommandText den jeweiligen SQL-Befehl enthält.

Es ist nicht möglich, die generierten SQL-Befehle direkt über den Datenadapter zu ermitteln. Ein OleDbDataAdapter-Objekt besitzt zwar Attribute mit Namen InsertCommand, UpdateCommand und DeleteCommand. Diese Attribute sind aber nur für die manuelle Zuweisung von Befehlen zu gebrauchen. Beim Einsatz eines CommandBuilders enthalten sie alle Nothing.

Beispiel
Das folgende Beispiel gibt die von einem OleDbCommandBuilder-Objekt für die Tabelle "Bestellungen" generierten SQL-DML-Befehle aus.

Beschränkungen
Sehr ärgerlich ist, dass der OleDbCommandBuilder zwei Beschränkungen unterliegt:
  • Er kann nur SQL-DML-Befehle für einzelne Tabellen erzeugen. Er verweigert die Unterstützung, wenn mehrere Tabellen an dem SQL-Befehl beteiligt sind.
  • Der CommandBuilder verweigert auch seine Mithilfe, wenn in den Feldnamen Leerzeichen oder andere nicht-alphanumerische Zeichen vorkommen.

Wenn dem CommandBuilder ein DataAdapter mit einem SQL-Befehl wie "SELECT * FROM Produkte, Bestellungen where Produkte.ID = Bestellungen.PID" überreicht wird, tritt er in den Streik: "Dynamic SQL generation is not supported against multiple base tables."

Programmcodebeispiele Visual Basic .NET (VB.NET)

' ============================
' .NET-Code-Beispiel in Visual Basic .NET
' Verwendung des CommandBuilders zur Generierung von SQL-DML-Befehlen
' (C) Holger@Schwichtenberg.de
' ============================
Sub ADONET_CommandBuilder()

Const FAKTOR As Single = 1.1
Const SQL As String = _
"SELECT * FROM Bestellungen"

' --- Nicht erlaubter SQL-String
' Const SQL As String = _
' "SELECT * FROM Produkte,
' Bestellungen where Produkte.ID = Bestellungen.PID"


Dim DA As System.Data.OleDb.OleDbDataAdapter
Dim CB As System.Data.OleDb.OleDbCommandBuilder

outtitle("Test des OLEDBCommandBuilder")

' --- Tabelle einlesen
DA = New OleDbDataAdapter(SQL, CONNSTRING)
CB = New OleDbCommandBuilder(DA)

out("SELECT-Befehl: " & SQL)
out("INSERT-Befehl: " & _
CB.GetInsertCommand.CommandText())
out("DELETE-Befehl: " & _
CB.GetDeleteCommand.CommandText())
out("UPDATE-Befehl: " & _
CB.GetUpdateCommand.CommandText())

End Sub

Programmcodebeispiele CSharp (C#)

using System;
using System.Data;
using System.Data.OleDb;

using FCL_Buch;

namespace FCLBuch._SystemData {

public class SamplesADONETDataSet {
public void ADONET_CommandBuilder() {

// Verwendung des CommandBuilder zur Generierung von sql-DML-Befehlen
string sql = "SELECT * FROM Bestellungen";

// Nicht erlaubter sql-String
// string sql As String = "SELECT * FROM Produkte, Bestellungen where Produkte.ID = Bestellungen.PID";
FclOutput.PrintOutSubHeader("Test des OLEDBCommandBuilder");

// Tabelle einlesen
OleDbDataAdapter da = new OleDbDataAdapter( sql, ADONET_Globals.ConnectionString );
OleDbCommandBuilder cb = new OleDbCommandBuilder( da );

// Ausgabe aus dem CommandBuilder-Objekt
FclOutput.PrintOut( "SELECT-Befehl: " + sql );
FclOutput.PrintOut( "INSERT-Befehl: " + cb.GetInsertCommand().CommandText );
FclOutput.PrintOut("DELETE-Befehl: " + cb.GetDeleteCommand().CommandText );
FclOutput.PrintOut("UPDATE-Befehl: " + cb.GetUpdateCommand().CommandText );
}
}
}

Querverweise

 Definition '.NET Framework Class Library'  Verfügbarkeit der Klasse 'System.Data.OleDb.OleDbCommandBuilder'  Übersicht über den FCL-Namensraum 'System.Data.OleDb'  .NET & Visual Studio Community Portal