none
Fehler in SQL Abfrage VB.net RRS feed

  • Frage

  • Ich hoffe ich habe das richtige Forum getroffen :/

    ich möchte in meinem VB.net code eine SQL Abfrage machen. Hier der Code:

     Dim sqlConnection1 As New SqlClient.SqlConnection("Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\materialdb.mdf;Integrated Security=True")
    
                        Dim cmd As New SqlClient.SqlCommand
                        cmd.CommandType = System.Data.CommandType.Text
                        cmd.CommandText = "INSERT Table (ID,Bezeichnung,Kategorie,Owner,Lager, Transport,Location) VALUES (id, IP_bezeichnung.Text, IP_kategorie.SelectedText, IP_owner.SelectedText, IP_placehome.SelectedText, IP_transport.SelectedText, IP_placenow.SelectedText)"
                        cmd.Connection = sqlConnection1
                        sqlConnection1.Open()
                        cmd.ExecuteNonQuery()
                        sqlConnection1.Close()

    Ich vermute das der Fehler im Connection String liegt. Kann das jemand bestätigen oder findet jemand einen anderen Fehler?

    Habe ich vllt. nicht die richtigen Berechtigungen? Wo kann ich das einstellen?

    Er zeugt mir auch keine Fehlermeldung an, da ich den Code in einem Try block habe :(

    Gruß


    Julius Störrle

    Samstag, 26. April 2014 08:19

Antworten

  • Hallo Julius,

    Er zeugt mir auch keine Fehlermeldung an, da ich den Code in einem Try block habe :(

    ähm. Dann nimm den Code da raus oder gib die Fehlermeldung im Catch Zweig per ex.ToString() aus oder ...!? Außerdem wirst Du doch hoffentlich wissen, wie man einen Breakpoint setzt!? Falls nicht, solltest Du dich nochmal mit den Grundlagen von Visual Studio befassen.

      http://msdn.microsoft.com/de-de/library/5557y8b4.aspx#BKMK_Create_breakpoints_that_break_when_you_want

    Dein INSERT Statement kann so nicht funktionieren. Du schreibst weder Werte in die VALUES noch gibt es die angegebenen Spaltennamen (sind zwar deine Controlnamen und deren Text Eigenschaft, das weiß der SQL Server aber nicht, da das Statement eben komplett falsch aufgebaut ist).

    Setz bitte anstelle der Sachen wie "IP_Bezeichnung.Text" Parameternamen wie bspw. @IPBezeichnung in das Statement ein und füge dann Parameterobjekte zum SqlCommand hinzu. Ein Beispiel hierfür findest Du hier:

      http://www.aspnetzone.de/forums/permalink/224594/224595/ShowThread.aspx#224595


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community



    Samstag, 26. April 2014 11:15
    Moderator
  • Hallo Julius,

    "bei Gelegenheit" sollte sehr zeitnah sein. Denn da fehlen doch noch einige Grundlagen, ohne die Du auf immer mehr "unerklärliche" Probleme stoßen wirst.

    Was da jetzt normal ist und was nicht, kann ich dir nicht sagen. Generell würde ich nicht empfehlen, mit AttachDbFileName, ... zu arbeiten. Denn je nach Einstellung wird dann bei jeder Ausführung die Datenbank nochmals neu aus der Vorlage erstellt und deine Änderungen sind dann eben weg.

    Wenn die Anwendung sagt, dass die ID schon vorhanden wäre, ist das wohl auch so. Warum Du die in VS nicht sehen kannst, weiß ich nicht, da ich - ehrlich gesagt - mit VS noch nie eine Datenbank angeschaut habe. Dafür nutze ich das SQL Server Management Studio. Ich würde aber mal davon ausgehen, dass Du die falsche Datenbank anschaust.

    Um zu schauen, ob die Datenbank immer wieder überschrieben wird, schreib anstelle eines variablen Werts von "id" einfach mal eine feste Zahl (immer die gleiche). Wenn beim nächsten Starten der Anwendung der erste Aufruf wieder klappt, wird sie überschrieben.

    ---

    Kleiner Tipp am Rande: Wenn eine Klasse eine Dispose Methode hat (wie bspw. SqlCommand, SqlConnection, ...) solltest Du die auch aufrufen. Du rufst zwar bspw. Close auf, Dispose aber nicht. Letzteres ist die sinnvollere Variante.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Samstag, 26. April 2014 14:14
    Moderator

Alle Antworten

  • Hallo Julius,

    Er zeugt mir auch keine Fehlermeldung an, da ich den Code in einem Try block habe :(

    ähm. Dann nimm den Code da raus oder gib die Fehlermeldung im Catch Zweig per ex.ToString() aus oder ...!? Außerdem wirst Du doch hoffentlich wissen, wie man einen Breakpoint setzt!? Falls nicht, solltest Du dich nochmal mit den Grundlagen von Visual Studio befassen.

      http://msdn.microsoft.com/de-de/library/5557y8b4.aspx#BKMK_Create_breakpoints_that_break_when_you_want

    Dein INSERT Statement kann so nicht funktionieren. Du schreibst weder Werte in die VALUES noch gibt es die angegebenen Spaltennamen (sind zwar deine Controlnamen und deren Text Eigenschaft, das weiß der SQL Server aber nicht, da das Statement eben komplett falsch aufgebaut ist).

    Setz bitte anstelle der Sachen wie "IP_Bezeichnung.Text" Parameternamen wie bspw. @IPBezeichnung in das Statement ein und füge dann Parameterobjekte zum SqlCommand hinzu. Ein Beispiel hierfür findest Du hier:

      http://www.aspnetzone.de/forums/permalink/224594/224595/ShowThread.aspx#224595


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community



    Samstag, 26. April 2014 11:15
    Moderator
  • Natürlich weiß ich was ein Breakpoint drin ist. Deswegen habe ich den Fehler ja auf die SQL Anweisung eingrenzen können. Aber die Fehlermeldung SqLexeption usw. hilft mir nicht weiter.

    Ansonsten Danke für den Hinweis jetzt hab ichs wieder. Stimmt natürlich das der Server die Steuerelemente nicht auslesen kann.

    Gruß


    Julius Störrle

    Samstag, 26. April 2014 11:45
  • Hallo Julius,

    nuja, wenn Du einen Breakpoint gesetzt hast, kannst Du dir sowohl im Codefenster als auch über das "Überwachen 1" Fenster sämtliche Sachen im Detail anschauen. Dazu gehört auch die SQL Exception, deren Message, StackTrace, ...

    Und dort steht drin, was den Fehler verursacht bzw. wird die genaue Fehlermeldung erheblich mehr bringen als "bringt nix, da in Try Catch Block".

    Beschäftige dich daher bitte nochmal eingehend mit Debugging und Exceptions. Es gibt viele gute Informationen dazu in der MSDN (starten kannst Du mit dem Link, den ich gepostet hatte)


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Samstag, 26. April 2014 12:01
    Moderator
  • Werd ich bei Gelegenheit mal machen.

    Er gibt mir jetzt keine Fehlermeldung mehr aus, wenn ich jedoch mir die Datenbank ansehen möchte, über VS, zeigt er mir nur eine leere Tabelle an. Wenn ich bevor ich Debugging beende den Sub nochmals ausführe mit Der gleichen ID zeigt er mir trotzdem die Meldung an das er nicht zwei Einträge mit der selben ID machen kann. 

    Soll ich die Datenbank einmalneu erstellen oder ist das "Normal"?

    Vielen Dank

    Gruß


    Julius Störrle

    Samstag, 26. April 2014 13:37
  • Hallo Julius,

    "bei Gelegenheit" sollte sehr zeitnah sein. Denn da fehlen doch noch einige Grundlagen, ohne die Du auf immer mehr "unerklärliche" Probleme stoßen wirst.

    Was da jetzt normal ist und was nicht, kann ich dir nicht sagen. Generell würde ich nicht empfehlen, mit AttachDbFileName, ... zu arbeiten. Denn je nach Einstellung wird dann bei jeder Ausführung die Datenbank nochmals neu aus der Vorlage erstellt und deine Änderungen sind dann eben weg.

    Wenn die Anwendung sagt, dass die ID schon vorhanden wäre, ist das wohl auch so. Warum Du die in VS nicht sehen kannst, weiß ich nicht, da ich - ehrlich gesagt - mit VS noch nie eine Datenbank angeschaut habe. Dafür nutze ich das SQL Server Management Studio. Ich würde aber mal davon ausgehen, dass Du die falsche Datenbank anschaust.

    Um zu schauen, ob die Datenbank immer wieder überschrieben wird, schreib anstelle eines variablen Werts von "id" einfach mal eine feste Zahl (immer die gleiche). Wenn beim nächsten Starten der Anwendung der erste Aufruf wieder klappt, wird sie überschrieben.

    ---

    Kleiner Tipp am Rande: Wenn eine Klasse eine Dispose Methode hat (wie bspw. SqlCommand, SqlConnection, ...) solltest Du die auch aufrufen. Du rufst zwar bspw. Close auf, Dispose aber nicht. Letzteres ist die sinnvollere Variante.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Samstag, 26. April 2014 14:14
    Moderator
  • Hallo Julius,

    es dürfte weniger an der Verbindungszeichenfolge liegen - die sieht für eine LocalDB ziemlich richtig aus, siehe SqlClient-Unterstützung für LocalDB.

    Vielmehr ist die INSERT Anweisung verkehrt. Anscheinend hast Du einfach Bezüge auf Deine Steuerelemente in die VALUES Klausel geschrieben - das funktioniert niemals.

    Erstelle vielmehr eine Abfrage mit Parametern und weise ihnen die Werte aus den Steuerelementen zu, siehe Befehle und Parameter

    Gruß Elmar

    Samstag, 26. April 2014 15:32
    Beantworter
  • Erklärung fürs überschreiben:http://msdn.microsoft.com/de-de/library/ms246989.aspx

    Julius Störrle

    Samstag, 26. April 2014 15:35
  • @Elmar

    Auch Danke für den Hinweis aber darauf hatte mich Stefan schon aufmerksam gemacht ;)

    Mein Aktueller Code:

    Dim cmd As New SqlClient.SqlCommand
                    cmd.CommandType = System.Data.CommandType.Text
                    
                    cmd.CommandText = "INSERT INTO [material] (id, Bezeichnung,Kategorie, Owner,Lager,Transport,Location) Values ( @Param1, @Param2, @Param3, @Param4, @Param5, @Param6, @Param7)"
                    cmd.Parameters.AddWithValue("@Param1", id)
                    cmd.Parameters.AddWithValue("@Param2", IP_bezeichnung.Text)
                    cmd.Parameters.AddWithValue("@Param3", IP_kategorie.Text)
                    cmd.Parameters.AddWithValue("@Param4", IP_owner.Text)
                    cmd.Parameters.AddWithValue("@Param5", IP_placehome.Text)
                    cmd.Parameters.AddWithValue("@Param6", IP_transport.Text)
                    cmd.Parameters.AddWithValue("@Param7", IP_placenow.Text)
                    cmd.Connection = sqlConnection1
                    sqlConnection1.Open()
                    cmd.ExecuteNonQuery()
                    sqlConnection1.Dispose()

    Problem ist nur noch das er die Datenbank jedesmal überarbeitet.

    Wenn ich die Anwendung Veröffentliche: überschreibt er die dann immer noch oder liegt das am Debugging?


    Julius Störrle


    Samstag, 26. April 2014 15:51
  • Hallo Julius,

    wenn Du die Anwendung veröffentlichst, sollte das mit dem Überschreiben nicht mehr passieren.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Samstag, 26. April 2014 16:35
    Moderator
  • Ich habe einmal alles was mit Datenbank zu tun hatte ausm Projekt rausgeschmissen und neu erstellt jetzt funktioniert alles. :)

    Einen Dank an dich das du dir die Zeit genommen hast! Hat mir sehr weitergeholfen

    Gruß


    Julius Störrle

    Samstag, 26. April 2014 17:03