none
Der &-Operator ist für die Typen "String" und "System.Guid" nicht definiert RRS feed

  • Frage

  • Hallo zusammen,

    habe folgendes Problem. Ich lese aus einer Datenbank die UniqueID und speichere den in einer Variable. Nun möchte ich diese Variable beim SQL-INSERT-Befehl nutzen um die UniqueID zum Speichern weiterer Daten zu nutzen.

    Folgende Fehlermeldung: "Der &-Operator ist für die Typen "String" und "System.Guid" nicht definiert"

    Kann mir hier jemand weiterhelfen?

    Mfg R.K.

    Mittwoch, 5. März 2014 09:04

Antworten

  • System.Guid

    Hallo,

    das sieht mir mehr nach einer .NET Fehlermeldung aus den nach einer vom SQL Server aus. Wo bekommst Du die Meldung.


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    • Als Antwort markiert Robbo1984 Mittwoch, 5. März 2014 14:30
    Mittwoch, 5. März 2014 09:43
  • Hi,

    Du solltest keine Stringverkettung für SQL Statements verwenden, sondern mit Parametern arbeiten. Ein Beispiel findest Du hier:

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

    Falls Du doch unbedingt bei Stringverkettung bleiben willst, musst Du für deinen Guid noch .ToString() anhängen.

    Also bspw.:

    Dim SqlStatement As String
        SqlStatement = "INSERT INTO ... " & Guid.NewGuid().ToString() & " ..."
    


    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

    • Als Antwort markiert Robbo1984 Mittwoch, 5. März 2014 14:30
    Mittwoch, 5. März 2014 10:08
    Moderator
  • Antwort steht doch schon im Thread!?


    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

    • Als Antwort markiert Robbo1984 Mittwoch, 5. März 2014 14:30
    Mittwoch, 5. März 2014 12:46
    Moderator
  • Hi,

    bitte nicht einfach an einigen Stellen irgendwas einbauen, was Du nicht verstehst.

    Entweder komplett auf Parameter umstellen oder eben gar keine verwenden. Ein Mischmasch wie hier bringt dir nichts.

    Nimm den Originalcode und bau an der Stelle, an der vorher

    ", " & MyGuid & " " & _

    stand, einfach mal:

    ", '" & MyGuid.ToString() & "' " & _

    ein.

    Ich persönlich würde auch das UPDATE und das INSERT Statement trennen und separat ausführen, bzw. zumindest mit ; innerhalb des Strings voneinander abgrenzen.


    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

    • Als Antwort markiert Robbo1984 Mittwoch, 5. März 2014 14:29
    Mittwoch, 5. März 2014 14:13
    Moderator

Alle Antworten

  • Ein Code-Ausschnitt wäre sicherlich praktisch.

    So kann man nur sagen, das dort offenbar eine Verkettung über den & Operator versucht wird, und das geht halt nicht, wie die Fehlermeldung ja besagt ;-).

    Danach würde ich also mal suchen, und das entsprechend ändern.


    Andreas Wolter (Blog | Twitter)
    MCM - Microsoft Certified Master SQL Server 2008
    MCSM - Microsoft Certified Solutions Master Data Platform, SQL Server 2012
    www.andreas-wolter.com | www.SarpedonQualityLab.com


    Mittwoch, 5. März 2014 09:21
  • System.Guid

    Hallo,

    das sieht mir mehr nach einer .NET Fehlermeldung aus den nach einer vom SQL Server aus. Wo bekommst Du die Meldung.


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    • Als Antwort markiert Robbo1984 Mittwoch, 5. März 2014 14:30
    Mittwoch, 5. März 2014 09:43
  • Hi,

    Du solltest keine Stringverkettung für SQL Statements verwenden, sondern mit Parametern arbeiten. Ein Beispiel findest Du hier:

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

    Falls Du doch unbedingt bei Stringverkettung bleiben willst, musst Du für deinen Guid noch .ToString() anhängen.

    Also bspw.:

    Dim SqlStatement As String
        SqlStatement = "INSERT INTO ... " & Guid.NewGuid().ToString() & " ..."
    


    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

    • Als Antwort markiert Robbo1984 Mittwoch, 5. März 2014 14:30
    Mittwoch, 5. März 2014 10:08
    Moderator
  • Mittwoch, 5. März 2014 12:21
  • na also. genau wie ich sagte..

    Verwende doch bitte parametrisierte Statements. Das schützt Dich auch schon ein gutes Stück weit vor SQLInjection.

    Hier mal 2 Beispiele:

    http://social.msdn.microsoft.com/Forums/en-US/6bdf8b71-1cf1-41c0-848c-4fca2c9e1ea2/faq-how-do-i-make-a-parameterized-query-in-the-database-with-vbnet

    http://blogs.technet.com/b/neilcar/archive/2008/05/21/sql-injection-mitigation-using-parameterized-queries.aspx


    Andreas Wolter (Blog | Twitter)
    MCM - Microsoft Certified Master SQL Server 2008
    MCSM - Microsoft Certified Solutions Master Data Platform, SQL Server 2012
    www.andreas-wolter.com | www.SarpedonQualityLab.com

    Mittwoch, 5. März 2014 12:30
  • Antwort steht doch schon im Thread!?


    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

    • Als Antwort markiert Robbo1984 Mittwoch, 5. März 2014 14:30
    Mittwoch, 5. März 2014 12:46
    Moderator
  • Nun erscheint folgender Fehler:


    Mittwoch, 5. März 2014 12:57
  • Hi,

    dann hast Du fälschlicherweise OleDbCommand, OleDbParameter, ... und eben nicht SqlCommand, SqlParameter, ... verwendet.

    Für SQL Server solltest Du aber letzteres nehmen. Stell daher mal deinen Code entsprechend um.


    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

    Mittwoch, 5. März 2014 13:02
    Moderator
  • Antwort steht doch schon im Thread!?


    stimmt

    ich hab mich einfach auf den Code bezogen, und nicht nochmal nachgeschaut, was davor schon geschrieben wurde

    nun haben wir halt ein Beispiel mehr ;)


    Andreas Wolter (Blog | Twitter)
    MCM - Microsoft Certified Master SQL Server 2008
    MCSM - Microsoft Certified Solutions Master Data Platform, SQL Server 2012
    www.andreas-wolter.com | www.SarpedonQualityLab.com

    Mittwoch, 5. März 2014 13:08
  • Es kommt immer ein neuer Fehler....


    Mittwoch, 5. März 2014 13:09
  • Antwort steht doch schon im Thread!?


    stimmt

    Hallo Andreas,

    ich meinte doch gar nicht dich, sondern den TE :) Ok, ich hätte seinen Screenshot zitieren können (wollte ich aber nicht^^)

    Er hat einen Screenshot ohne jeglichen weiteren Kommentar gepostet, obwohl er schon mehrere Antworten erhalten hat. Auf die ist er aber gar nicht eingegangen.


    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


    Mittwoch, 5. März 2014 13:13
    Moderator
  • Gibt es denn keine Möglichkeit, dass ich alles bei OleDb lasse. Das Programm ist schon riesig und wenn ich es überall änder, hält mich dieses Stunden auf...
    Mittwoch, 5. März 2014 13:42
  • Egal was ich mache, es funktioniert nicht..... Hier nochmal der Code vom ganzen Sub.... Bitte um Hilfe....

     Private Sub SurfaceButton3_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles SurfaceButton3.Click
            Dim MyGuid As Guid
            MyGuid = New Guid(UniqueID)
            Dim cnn As OleDbConnection
            Dim cmd As New OleDbCommand
    
            cnn = Application.cnn
            If cnn.State = System.Data.ConnectionState.Open Then
                Dim newWundart = CBWundart.Text
                Dim newKoerperstelle = CBKoerperstelle.Text
                Dim newGrad = CBGrad.Text
                Dim newErstaufnahme = SurfaceTextBox1.Text
                Dim newAbgeheilt = SurfaceTextBox2.Text
                Dim newEntstehungsort = CBOrt.Text
    
                cmd.Connection = cnn
                With cmd.Parameters
                    .Add(New OleDbParameter("@ID", MyGuid))
                End With
                cmd.CommandText = "UPDATE    [pvs_vivat_TABLET].[dbo].[Wunden] " & _
                "SET " & _
                "[Wundart] = '" & CBWundart.Text & "' " & _
    [Koerperstelle] = '" & CBKoerperstelle.Text & "' " & _
    ",[ErstaufnahmeDatum] = '" & SurfaceTextBox1.Text & "' "
    
                If SurfaceTextBox2.Text <> "" Then
                    cmd.CommandText = cmd.CommandText & ",[AbgeheiltAmDatum] = '" & SurfaceTextBox2.Text & "' "
                Else
                    cmd.CommandText = cmd.CommandText & ",[AbgeheiltAmDatum] = null "
                End If
    
                cmd.CommandText = cmd.CommandText & ",[Wundgrad] = '" & CBGrad.Text.Substring(0, 1) & "' " & _
                                                ",[Kommentar] = '" & SurfaceTextBox3.Text & "' " & _
                                                ",[Enstehungsort] = '" & CBOrt.Text & "' " & _
                                                ",[GeaendertProgramm] = 'pvs_Mobile'" & _
                                                ",[GeaendertDurch] = '" & Benutzername & "' " & _
                                                ",[GeaendertAm] = current_timestamp " & _
                                        "WHERE LfdNummer = " & mlngLfdNrWunde & " " & _
                                                "" & _
                                        "INSERT INTO [pvs_vivat_TABLET].[dbo].[_SyncDB] " & _
                                                "([Tabellenname] " & _
                                                ",[InterneKey] " & _
                                                ",[ErstelltAmDatum] " & _
                                                ",[ExterneKey]) " & _
                                        "VALUES( " & _
                                                "'Wunden' " & _
                                                ",@ID " & _
                                                ",CURRENT_TIMESTAMP " & _
                                                ",NEWID() )"
    
    
                cmd.ExecuteNonQuery()
    
    
            End If
            Me.Close()
        End Sub


    Mittwoch, 5. März 2014 14:04
  • Hi,

    bitte nicht einfach an einigen Stellen irgendwas einbauen, was Du nicht verstehst.

    Entweder komplett auf Parameter umstellen oder eben gar keine verwenden. Ein Mischmasch wie hier bringt dir nichts.

    Nimm den Originalcode und bau an der Stelle, an der vorher

    ", " & MyGuid & " " & _

    stand, einfach mal:

    ", '" & MyGuid.ToString() & "' " & _

    ein.

    Ich persönlich würde auch das UPDATE und das INSERT Statement trennen und separat ausführen, bzw. zumindest mit ; innerhalb des Strings voneinander abgrenzen.


    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

    • Als Antwort markiert Robbo1984 Mittwoch, 5. März 2014 14:29
    Mittwoch, 5. März 2014 14:13
    Moderator
  • Habe ich schon probiert.... Folgender Fehler.... Auch wenn ich die Klammern nach .toString setze folgt ein fehler...

    Mittwoch, 5. März 2014 14:25
  • Es funktioniert. Ich habe die '' - Zeichen übersehen.... Kaum zu glauben. Und damit hält man sich 3 Std auf....

    Danke für eure Hilfe!!!

    Mittwoch, 5. März 2014 14:29