CommandText bei einem im Designer erstellten Datenset ändern

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Panter.

    CommandText bei einem im Designer erstellten Datenset ändern

    Hallo zusammen

    Ich möchte eine kleines Zeiterfassungsprogramm erstellen und habe mich für VB.Net entschieden, da ich vorher meistens in Access unterwegs war. Daher ist die Datenbank auch eine Access Tabelle.

    Ich habe ein Dataset mit dem Designer erstellt, einfach die Datenbank verbunden und die Tabelle in das Datenset gezogen. Funktioniert soweit gut.

    Für das Form mit dem Mitarbeiter funktioniert alles Tipp Topp. Nun möchte ich noch eine Form mit den Stempelungen erstellen. Ich möchte nicht alle Daten in das Datenset laden, möchte ich den Datenadapter den SQL entsprechend anpassen.

    Wenn ich die Datenbankverbindung manuell erfasse, kann ich beim Datenadapter den CommandText problemlos anpassen.

    Hier ein Beispiel:

    VB.NET-Quellcode

    1. Dim Con_str As String
    2. Dim DB_Path As String
    3. Dim DB_name As String
    4. Dim sql As String
    5. DB_Path = "C:\Script\Zeiterfassung"
    6. DB_name = "Zeiterfassung.accdb"
    7. Con_str = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Script\Zeiterfassung\Zeiterfassung.accdb"
    8. conn = New OleDbConnection
    9. If System.IO.File.Exists(DB_Path & "\" & DB_name) Then
    10. conn.ConnectionString = Con_str
    11. Else
    12. MsgBox("Datenbank nicht gefunden - bitte Einstellen und neu starten")
    13. Exit Sub
    14. End If
    15. sql = "Select TOP 4 * From Stempelzeit Where MaNr = 1084 Order by Stempelzeit DESC"
    16. daStempelzeit = New OleDbDataAdapter("", conn)
    17. daStempelzeit.SelectCommand.CommandText = sql
    18. daStempelzeit.SelectCommand.CommandType = CommandType.Text
    19. '........Hier wird der Code gekürzt...
    20. sql = "Select TOP 4 * From Stempelzeit Where MaNr = " & Me.TB_MANr.Text & " Order by Stempelzeit DESC"
    21. daStempelzeit.SelectCommand.CommandText = sql
    22. daStempelzeit.Fill(Me.ZeiterfassungDataSet.Stempelzeit)




    Wenn ich aber den Datenadapter vom
    Dataset anpassen möchte, ist dies nicht möglich. (Achtung –
    Beispiel auf andere Tabelle – ist nur für die Erklärung)


    VB.NET-Quellcode

    1. Dim sql
    2. sql = "Select * FROM Mitarbeiter WHERE MANR = 1084"
    3. Me.MitarbeiterTableAdapter1.Adapter.SelectCommand.CommandText = sql
    4. Me.MitarbeiterTableAdapter1.Fill(Me.ZeiterfassungDataSet.Mitarbeiter)



    Es
    kommt folgender Fehler bei Zeile 3:

    System.NullReferenceException: "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."
    System.Data.OleDb.OleDbDataAdapter.SelectCommand.get hat Nothing zurückgegeben.

    Könnt Ihr mir da weiterhelfen.

    Besten Dank
    Hallo ErfinderDesRades

    Zuerst möchte ich mich für deine Videos bedanken. Dank diesen habe ich das Dataset begriffen. Auch dass man die Felder vom Datenquelle einfach in die Form ziehen kann ist sehr hilfreich, auch dass man umstellen kann von DatagridView auf Detail.

    Die Frage ist, wo finde ich den den SelectCommand.

    Ich habe extra eine neue Form erstellt, und von Datenquelle die Tabelle Stempelzeit in die Form gezogen.

    So funktioniert der Code:

    VB.NET-Quellcode

    1. Private Sub Form4_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. 'TODO: Diese Codezeile lädt Daten in die Tabelle "ZeiterfassungDataSet.Stempelzeit". Sie können sie bei Bedarf verschieben oder entfernen.
    3. Me.StempelzeitTableAdapter.Fill(Me.ZeiterfassungDataSet.Stempelzeit)
    4. End Sub


    Im Formular wird folgendes angezeigt:
    ZeiterassungDataSet
    StempelzeitBindingSource
    StempelzeitAdapterManager
    StempelzeitBindingNavigator

    So funktioniert der Code leider nicht:

    VB.NET-Quellcode

    1. Private Sub Form4_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. 'TODO: Diese Codezeile lädt Daten in die Tabelle "ZeiterfassungDataSet.Stempelzeit". Sie können sie bei Bedarf verschieben oder entfernen.
    3. Dim sql As String
    4. sql = "Select * From Stempelzeit WHERE MANR = 1084"
    5. Me.TableAdapterManager.StempelzeitTableAdapter.Adapter.SelectCommand.CommandText = sql
    6. Me.TableAdapterManager.StempelzeitTableAdapter.Adapter.SelectCommand.CommandType = CommandType.Text
    7. Me.StempelzeitTableAdapter.Fill(Me.ZeiterfassungDataSet.Stempelzeit)
    8. End Sub


    Besten Dank für eure Antworten

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Panter“ ()

    Hallo,
    wenn ich das so richtig verstanden habe, willst Du in einer neuen Abfrage von einem SQL Server Daten abfragen.
    Dazu muß man erstmal eine neue SQL Verbindung aufbauen, damit der Tableadapter abfragen kann.
    Von was für einem Sever reden wir denn? (MySQL, ...?)
    Kunst kommt von können und nicht von wollen, sonst hieße es Wunst!
    Hallo zusammen
    @ErfinderDesRades:
    Es kommt eben diese Fehlermeldung:
    System.NullReferenceException: "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."
    System.Data.OleDb.OleDbDataAdapter.SelectCommand.get hat Nothing zurückgegeben.

    @xmise
    Nein - Ich greife auf einen Access Datenbank zu. Ich möchte meinen Code vereinfachen. Der Desinger hat alles erstellt. Wenn ich in das Datenset alle Daten füllen möchte, funktioniert alles Tipp Topp. Leider kann ich den vom Designer erstellen Adapter nicht ändern, damit ich nur die benötigten Daten einfüllen kann.

    Ich möchte nur die letzten 4 Stempelungen dem Benutzer anzeigen. Das sind 4 Datensätze. Die Datenbank wird ja zukünftig für jeden Benutzer 4 Datensätze pro Tag abspeichern * 50 Mitarbeiter. Das gibt ja schon 73'000 Datensätze pro Jahr.

    Was ich aber kann ist, einen neuen Datenadapter zu erstellen, siehe Post eins und das vom Designer erstellen Datenset füllen. Leider habe ich keine Erfahrung in VB.net, daher dachte ich, es gäbe eine einfache Möglichkeit den Datenadapter vom Designer zu ändern. Ich finde meine Lösung etwas unschön.

    Panter schrieb:

    System.Data.OleDb.OleDbDataAdapter.SelectCommand.get hat Nothing zurückgegeben
    Tja, in dem DbDataAdapter ist kein SelectCommand angelegt.
    Ich arbeite ja sogutwienie mit die Dinger, weil die sich so leicht verhaspeln, aber dass selbst das SelectCommand fehlt habich auch noch nicht erlebt.

    Du könntest mal deine Solution zippen und anhängen - aber bitte ohne .dll und .exe - Dateien.
    Dann kann man mal reingucken.

    Das in post#3 empfohlene hast du ausgeführt? Wenn nein, warum nicht?

    und Fehler ist nachwievor derselbe?
    Hallo ErfinderDesRades


    Ich dachte, wenn ich eine neue Form erzeuge ist auch dieser Datenadapter neu erstellt, wie in post#4 beschrieben. Nun habe ich ein neues Projekt erstellt inkl. Dataset und als ZIP angefügt. Der Fehler wie in post# 1 ist leider immer noch da.
    Dateien
    Hallo zusammen

    Ich habe nun eine Lösung gefunden:

    Im Datasetdesinger kann man beim entsprechenden Adapter eine Abfrage hinzufügen, optional einen Namen vergeben, in meinem Beispiel FillByTop4.

    Bei mir sieht dann der SQL wie folgt aus:

    SQL-Abfrage

    1. SELECT TOP 4 ID, Stempelzeit, Stempelzeit_man, MANr, Geloescht
    2. FROM Stempelzeit
    3. WHERE (MANr = ?)


    und füllen geht dann wie folgt:

    VB.NET-Quellcode

    1. Me.StempelzeitTableAdapter.FillByTop4(Me.ZeiterfassungDataSet.Stempelzeit, 1084)