0

2 つの変数を日付にキャストしようとしています。

1 つ (最初のコード) をキャストするために SQL を機能させることができますが、2 つの変数をキャストしようとするとエラーが発生し続けます (以下の 2 つの試行を参照)。

キャストダブルとキャストツー変数を検索しましたが、ダブルはダブルタイプになり、変数には同じ問題があります。2 つの変数をキャストするためにどの作業を検索する必要があるか、またはどのような「結合」が必要か。

  • ワンキャスト(ワーキング)

    cmd.CommandText = "SELECT datestart, DateEnd, runco​​mpleted FROM [tblweeklyreports] where Cast(datestart as date) between '" & vDateStart & "' and '" & vDateStart & "'"

-2 キャスト (動作しない)

 sSQL = "SELECT datestart, DateEnd, runcompleted FROM [tblweeklyreports] where Cast(moduledatestart as date, moduledatecomplete as date) between '" & vDateStart & "' and '" & vDateEnd & "'"

 sSQL = "SELECT datestart, DateEnd, runcompleted FROM [tblweeklyreports] where Cast(moduledatestart as date),(moduledatecomplete as date) between '" & vDateStart & "' and '" & vDateEnd & "'"

それは前に出てくる必要があります(必要なのはリンクだけですが、正しい言葉遣いを探すことができないようです!)

------------------- 議論による修正版 --------------

Dim cn As SqlConnection = New SqlConnection()
        Dim cmd As SqlCommand = New SqlCommand()
        Dim dr As SqlDataReader
        Dim vRunCompleted As String = ""
        Dim vDateStartExist As String = ""
        cn.ConnectionString = ConfigurationManager.ConnectionStrings("mySQLConnectionString").ConnectionString
        cmd.Connection = cn
        'Open the connection to the database
        cn.Open()

Dim vDateStartDate As Date = vDateStart Dim vDateEndDate As Date = vDateEnd

        cmd.CommandText = "SELECT * FROM [tblresults] where moduledatestart between @from and @to"
        cmd.Parameters.AddWithValue("@from", vDateStart)
        cmd.Parameters.AddWithValue("@to", vDateEnd)

        Dim str As New StringBuilder
        Dim vdrOkay As String
        str.Append(Chr(34) & " Employee Id" & Chr(34) & "," & "Forename" & "," & Chr(34) & "Surname" & Chr(34) & "," & "Control 1" & "," & Chr(34) & "Control 2" & Chr(34) & "," & "Full code" & "," & "Class Name" & "," & "Year" & ",")
        str.Append(Chr(34) & " Number" & Chr(34) & "," & "Class Start Date" & "," & Chr(34) & "Class End Date" & Chr(34) & "," & "Course Type" & "," & Chr(34) & "Provider Type" & Chr(34) & "," & "Provider" & "," & "Venue" & "," & "Evaluation" & "," & "Duration Hrs" & ",")
        str.Replace(",", vbNewLine, str.Length - 1, 1) ' go to next line

        dr = cmd.ExecuteReader()

        If (dr.HasRows = True) Then

            Label1.Text = "running"

            While (dr.Read())

                vdrOkay = Trim(StrConv(dr("EmployeeID"), VbStrConv.Uppercase))
                str.Append("=" & Chr(34) & vdrOkay & Chr(34) & ",")

 End While

            Dim vFileName As String = Replace(vDateStart, "/", "_") & "_" & Replace(vDateEnd, "/", "_")
            My.Computer.FileSystem.WriteAllText(("C:\sites\Examples\WeeklyReport\" & "ELearning_Report_" & vFileName & ".csv"), str.ToString, False)

        Else
 Label1.Text = "did not run"
        End If
4

1 に答える 1

4

パラメーター化されたクエリを使用する推奨される方法を使用した場合、何もキャストする必要はありません。これには、SQL インジェクションを回避するという優れた追加効果もあります。

あなたの場合、これは次のようになります。

cmd.CommandText = "SELECT datestart, DateEnd, runcompleted FROM [tblweeklyreports] where datestart between @from and @to"
cmd.Parameters.AddWithValue("@from", vDateStart)
cmd.Parameters.AddWithValue("@to", vDateEnd)

問題は、WHERE句を作成する方法にあります。試みているように、一度に 2 つのフィールドを比較することはできません。次のように書く必要があります。

SELECT 
    datestart, 
    DateEnd, 
    runcompleted 
FROM [tblweeklyreports] 
where 
    moduledatestart between @from and @to and
    moduledatecomplete between @from and @to

次に、上記のように SQL パラメータを使用します。

于 2013-10-16T13:27:57.143 に答える