0

私は最近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 -query –

答えて

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

こんにちはAndrew、代わりにこのコードを使用すると、 '20160825'の近くに誤った構文が表示されるというエラーが表示されます(日付のうちの1つ)。これは、日付の各部分の間に ' - 'を付けて保存されるためですか? – David

+1

二重引用符で囲まれた文字列( '" ')の中で単一の' ''をエスケープする必要があるかどうかわからない –

+0

VBのsql =" SELECT * FROM dbo "に一重引用符を1つの一重引用符として入力します。 tblContracts WHERE DateRenew BETWEEN '"&sd&"' AND '"&td & "'"; - 私は基本的にゴミのことを話していました – Cato

関連する問題