0

Ich habe kürzlich ein Projekt von Access auf MS SQLServer verschoben, aber das bedeutet natürlich, dass ich etwas Code in meinen SQL-Anweisungen ändern muss.Zugriff auf die SQL Server-Syntaxumschaltung

Ich habe diese Subroutine, wo ich alle Datensätze bekomme, wo das Feld DateRenew innerhalb von 30 Tagen ist ... Wie konvertiere ich das in SQL? Im Moment bekomme ich folgende Fehlermeldung

Eine nicht behandelte Ausnahme des Typs ‚System.Data.OleDb.OleDbException‘ in MaintenanceControl.exe aufgetreten

Zusätzliche Informationen: Falsche Syntax in der Nähe von ‚#‘.

Private Sub btn30Days_Click(sender As Object, e As EventArgs) Handles btn30Days.Click 

    Dim td As String 
    Dim sd As String 
    sd = Format(Today.AddDays(31), "MM/dd/yyyy") 
    td = Format(Today, "MM/dd/yyyy") 

    Try 
     sql = "SELECT * FROM dbo.tblContracts WHERE DateRenew BETWEEN #" & sd & "# AND #" & td & "#;" 
     conAd = New OleDb.OleDbDataAdapter(sql, con) 
     conset = New DataSet 
     conAd.Fill(conset) 
     ugModules.DataSource = conset 

    Catch ex As Exception 
     errorLog(ex.Message, ex.StackTrace) 
     MsgBox("Failed to retrieve contract information from database, refer to error log") 
    End Try 

End Sub 
+0

Wenn Sie Ihr Programm zu SqlServer wechseln möchten, warum immer noch OleDb verwenden? Es gibt die Klassen in SqlClient, die für Sql Server spezifisch sind. Die Daten in SqlServer sind jedoch nicht mit # vorangestellt/postfixed. In jedem Fall sollten Sie keine Stringverkettungen mehr verwenden, sondern Parameter verwenden, so dass Sie keine Unterschiede mehr zwischen sql-server und access analysieren müssen oder Steve

+1

Sehen Sie sich * Parameter an * anstatt Verkettung von Strings, um Ihre Abfragen zu erstellen - es würde hier helfen, weil Sie dann vermeiden, "DateTime" -Werte zu nehmen, sie in Strings konvertieren und dann den Server zwingen, sie wieder in "DateTime" -Werte zu konvertieren - solche Ketten von Konvertierungen können * Einführung * Formatierungsprobleme, die nicht existieren würden, wenn Sie die richtigen Typen überall verwenden, welche Parametrisierung erlaubt (Sie lernen auch SQL-Injection zur gleichen Zeit zu vermeiden) –

+0

http://stackoverflow.com/questions/12048152/oledb-parameterized -Query –

Antwort

0

Leichter und weniger fehleranfällig ist die direkte Verwendung der Datumsfunktionen von SQL Server.

sql = "SELECT * FROM dbo.tblContracts WHERE DateRenew BETWEEN 
     CONVERT(DATE, GETDATE()) AND DATEADD(DAY, 31, CONVERT(DATE, GETDATE()))" 

(Zeilenumbruch zur besseren Lesbarkeit)

Wenn es keine Rolle spielt, dass GETDATE() die aktuelle Zeit enthält, können Sie die CONVERT(DATE, ...) Teile auslassen.

+0

Das funktionierte perfekt, danke Andre! – David

-1
Dim td As String 
Dim sd As String 
sd = Format(Today.AddDays(31), "yyyyMMdd") 
td = Format(Today, "yyyyMMdd") 

Try 
    sql = "SELECT * FROM dbo.tblContracts WHERE DateRenew BETWEEN ''" & sd & "'' AND ''" & td & "'';" 
    conAd = New OleDb.OleDbDataAdapter(sql, con) 
    conset = New DataSet 
    conAd.Fill(conset) 
    ugModules.DataSource = conset 

Catch ex As Exception 
    errorLog(ex.Message, ex.StackTrace) 
    MsgBox("Failed to retrieve contract information from database, refer to error log") 
End Try 

YYYYMMDD ist ein Datumsformat für SQL (iso) die # durch '(Apostroph) in SQL in VB Sie eingeben müssen' ersetzt wird als '' als Escape-Sequenz - das ist ein einfaches Angebot als ZWEI consequitve SINGLE-Anführungszeichen

+0

Hallo Andreas, danke für die Antwort Mit diesem Code bekomme ich dann eine Fehlermeldung mit dem Titel 'Falsche Syntax in der Nähe von '20160825'.' (Offensichtlich eines der Daten), ist dies wegen der Tatsache, dass es zwischen jedem Teil des Datums mit einem' - 'gespeichert wird? – David

+1

Nicht sicher, ob man innerhalb eines doppelt zitierten Strings ('' ') ein einzelnes ''' entschlüsseln muss. –

+0

Ich weiß, was es ist, geben Sie die einfachen Anführungszeichen als ein einziges Anführungszeichen in VB ein sql = "SELECT * FROM dbo. tblContracts WHERE DateRenew ZWISCHEN '' & sd & '' UND '' & td & "'"; - Ich redete Müll im Grunde – Cato