0

我最近將一個項目從Access創建到MS SQLServer,當然這意味着我需要更改一些SQL語句中的代碼。訪問SQL Server語法轉換

我有這個子程序,我得到的所有記錄,其中字段DateRenew是在30天內...如何將其轉換爲SQL?目前,我得到了以下錯誤消息

類型「System.Data.OleDb.OleDbException」未處理的異常發生在MaintenanceControl.exe

其他信息:附近有語法錯誤「#」。

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

如果您想將您的程序切換到SqlServer,爲什麼仍然使用OleDb? SqlClient中的類是特定於Sql Server的類。然而,SqlServer中的日期並沒有前綴/後綴#和任何情況下,你應該停止使用字符串連接,但使用參數,所以沒有更多的麻煩解決sql服務器或訪問之間的差異或<把你的數據庫名稱在這裏> – Steve

+1

看看使用*參數*而不是串聯字符串來創建你的查詢 - 它會幫助你,因爲你避免使用'DateTime'值,將它們轉換爲字符串,然後強制服務器將它們轉換回'DateTime'值 - 這樣的轉換鏈可以*引入*格式化問題,如果您始終使用適當的類型,哪些參數化允許(您還可以學習避免同時注入SQL注入),則不存在格式問題 –

+0

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

回答

0

更容易和更容易出錯的是直接使用SQL Server的日期函數。

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

(爲便於閱讀,換行)

如果不要緊,GETDATE()包括當前時間,你可以離開了CONVERT(DATE, ...)部分。

+0

這個工作完美,謝謝安德烈! – 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是 '在VB(單引號),在SQL 您需要輸入' 的SQL(ISO) 日期格式#被替換爲 '' 作爲轉義序列 - 即輸入一個單引號作爲兩個後綴單引號

+0

嗨安德魯,謝謝你的迴應,之後使用這個代碼,然後我會得到一個錯誤,說'錯誤的語法附近'20160825'.'(顯然是其中一個日期),這是因爲它在每個日期部分之間用' - '來保存嗎? – David

+1

不知道是否需要在雙引號字符串('「')內部轉義單個'''。 –

+0

我知道它是什麼,你在VB中輸入單引號作爲一個單引號sql =」SELECT * FROM dbo。 tblContracts WHERE DateRenew BETWEEN'「&sd&」'AND'「&td & "'"; - 我在說垃圾基本上 – Cato