2017-07-24 7 views
1
Private Sub ButtonSubmitID_Click(sender As Object, e As EventArgs) Handles ButtonSubmitID.Click 
    Dim comm As New SqlCommand 
    Dim conn As New SqlConnection 
    conn.ConnectionString = "Data Source = localhost\SQLEXPRESS; Initial Catalog = test2Forms; Integrated Security = SSPI;" 
    comm.Connection = conn 
    Dim ID = TextBoxID.Text 
    comm.Parameters.AddWithValue("@ID", ID) 
    Dim adapter As SqlDataAdapter = New SqlDataAdapter(comm.CommandText, comm.Connection) 
    comm.CommandText = "SELECT * FROM withActivityLog3 WHERE ID = @ID" 
    Dim records As DataSet = New DataSet 
    adapter.Fill(records) 
    DataGridView2.DataSource = records 
End Sub 

CommandText-Eigenschaft wurde nicht initialisiert ist der Fehler, den ich erhalte. Ich bin in der Lage, alle Daten aus der Datenbank in die GridView auf dem Form Load zu ziehen, aber wenn ich versuche, es auf eine ID mit einer WHERE-Klausel auf der Schaltfläche Trigger einzugrenzen, kommt es zu dem obigen Fehler. Ich habe den Debugger verwendet, um einen Schritt nach dem anderen zu verfolgen, und die Befehls- und Verbindungszeichenfolgen sehen korrekt aus. Ich habe auch erfolgreich die Abfrage in meiner Datenbank mit der SQL Server-Befehlszeile dupliziert. Ich suche nach einem Primärschlüssel (ID), sodass die erwarteten Ergebnisse eine eindeutig identifizierte Zeile aus der Datenbank sein würden.CommandText-Eigenschaft wurde nicht initialisiert, Daten werden abgerufen

+1

Achten Sie genau auf Ihren Code zu speichern, verwendet werden könnten ... Sie setzen 'comm.CommandText' *** nach *** Sie reichte es (leer) zum Dataadapter. Sie müssen weder ein Befehlsobjekt noch ein Verbindungsobjekt zu einem DataAdapter erstellen - übergeben Sie einfach das SQL und die Verbindungszeichenfolge.Da Sie für den Parameter ein DBCommand-Objekt benötigen/benötigen, benötigen Sie den DataAdapter nicht, sondern füllen Sie die Datentabelle direkt aus. Es ist nicht notwendig, dass ein lokales DataSet-Objekt verwendet wird. [Rubber duck debugging] (https://en.wikipedia.org/wiki/Rubber_duck_debugging) – Plutonix

+0

yeah, kann ich nicht lesen, dass – Plutonix

+0

Beachten Sie, dass Sie jetzt abstimmen können (klicken Sie auf den Pfeil nach oben) neben * any * Q oder A, die Sie nützlich oder informativ finden. Wie die [Tour] erklärt, hilft die Abstimmung anderen, gute Beiträge zu finden. Es ist eine passive Art, wie jemand teilnehmen und anderen helfen kann, ohne Antworten zu veröffentlichen. – Plutonix

Antwort

1

Was das Problem, das Sie wissen, Sie haben:

' initialize DataAdapter with (EMPTY) commandtext 
Dim adapter As SqlDataAdapter = New SqlDataAdapter(comm.CommandText, comm.Connection) 
' initialize Command Text 
comm.CommandText = "SELECT * FROM withActivityLog3 WHERE ID = @ID" 

Wenn Sie die CommandText zum Dataadapter übergeben, es ist leer, weil Sie setzen havent es noch, die in dem Fehler führt.

Es gibt jedoch eine Menge Ineffizienz in Ihrem Code. Neu geschrieben:

' form level conn string 
Private TheConnString As String = "Data Source = localhost\..." 

Private Sub ButtonSubmitID_Click(sender ... 

    Dim dt As New DataTable 

    Using dbcon As New MySqlConnection(TheConnString) 
     Using cmd As New MySqlCommand("select * from Sample where Id = @id", dbcon) 

      cmd.Parameters.Add("@id", MySqlDbType.Int32).Value = Convert.ToInt32(TextBox2.Text) 
      dbcon.Open() 
      dt.Load(cmd.ExecuteReader) 

      dgvA.DataSource = dt 

     End Using 
    End Using 
End Sub 

Hinweis: Dies nutzt MySQL aber die Konzepte sind für SQLite, Access, SQL Server usw.

  • Es besteht keine Notwendigkeit zu geben oder die Verbindungszeichenfolge einfügen und über überall ist es benutzt. Eine Formebenenvariable ermöglicht DRY (Dont Repeat Yourself) Code.
  • Alles, was die Dispose() Methode implementiert, sollte entsorgt werden. Das schließt fast alle DB-Provider-Objekte ein. Die Using-Anweisung ermöglicht es Ihnen, ein Objekt zu deklarieren und zu initialisieren, und es wird bei End Using entsorgt. Fehler bei Dispose der Dinge können Lecks verursachen und sogar Verbindungen oder Ressourcen zum Erstellen von Dingen wie DB-Befehlsobjekte auslaufen lassen.
  • Es muss kein lokaler DbDataAdapter erstellt werden. Dies sind sehr mächtige und nützliche Kreaturen, die viel mehr tun, als nur eine DataTable zu füllen. Wenn das alles ist, was Sie tun, können Sie ExecuteReader Methode auf dem DbCommand Objekt verwenden.
  • Noch benötigen Sie eine lokale DataSet. Im Gegensatz zum Namen halten diese keine Daten, sondern DataTables. Da es nur einen gibt, und es ist lokal (geht aus dem Geltungsbereich, wenn die Methode endet), benötigen Sie keine DataSet, um es zu speichern.
  • Die Add Methode sollte anstelle von AddWithValue verwendet werden. Der obige Code gibt den Datentyp für den Parameter an, sodass der Compiler keine Rätselraten benötigt. Natürlich mit dem kommt die Notwendigkeit, den Text in eine Zahl zu konvertieren ...
  • ... Da dies Benutzereingaben sind, sollten Sie dem Benutzer nicht vertrauen, so Integer.Tryparse wäre passender: I like pie wird nicht in eine ganze Zahl konvertieren . Datenüberprüfung ist etwas, was Sie tun sollten, bevor Sie mit den DB-Operationen beginnen.
  • Dim ID = TextBoxID.Text wie verwendet ist sinnloser Code. Sie müssen den Textfeldtext nicht in eine neue Variable verschieben, um sie zu verwenden. Allerdings ID den ganzzahligen Wert
+0

Ja, ich habe das heute Morgen zur Arbeit bekommen. Danke noch einmal. –

Verwandte Themen