Code-Beispiel

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."

Programmcodebeispiel in 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

Weiteres Programmcodebeispiel in 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 );
}
}
}

Hinweise

Ausgaben werden in den Beispielen durch Hilfsroutinen wie out() und PrintOut() erzeugt. Diese sind hier nicht angegeben, da deren Implementierung von der jeweiligen Umgebung abhängt. Für Konsolenanwendungen können hier z.B. Console.WriteLine() einsetzen.


 

Querverweise

 Liste aller Codebeispiele  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

Buchtipp

Buchcover PowerShell 7 und Windows PowerShell 5 – das Praxishandbuch (6. Auflage Juni 2024 (10. Auflage Gesamtreihe)) PowerShell 7 und Windows PowerShell 5 – das Praxishandbuch
Autor(en): Dr. Holger Schwichtenberg
Erschienen 2024
Umfang: 1426 Seiten
ISBN: 3446481958

Beratung & Support

Schulungen

  Anfrage für eine individuelle Schulung zum Thema VISUAL BASIC C#   Gesamter Schulungsthemenkatalog

Fachbücher

  Alle unsere aktuellen Fachbücher   E-Book-Abo für ab 99 Euro im Jahr