2017-03-28 81 views
-1

我面臨這種轉換失敗。我想在日曆中選取所有選定的日期,並在選定的日期顯示活動。我能夠獲得選定的日期,但是當我嘗試將開始日期=選定日期時。它在下面的錯誤失敗。從字符串中轉換日期和/或時間時轉換失敗。在sql

附加信息:從字符串中轉換日期和/或時間時轉換失敗。

strSQL = " SELECT CalendarID, Company,Header, convert(date,enddate,103)StartDate, convert(varchar,enddate,103) enddate, (starthour + ' : ' + startmin + ' : ' + startday) starttime, (endhour + ' : '+ endmin+ ' : '+ endday) endtime " & _ 
        "FROM tablename where StartDate ='" & calendar1.SelectedDate.ToShortDateString() & "'" 

我必須試着改變代碼到這一點,但也具有同樣的錯誤

Dim selecteddates As Date 
     selecteddates = calendar1.SelectedDate.ToShortDateString() 

strSQL = " SELECT CalendarID, Company,Header, convert(date,enddate,103)StartDate, convert(date,enddate,103) enddate, (starthour + ' : ' + startmin + ' : ' + startday) starttime, (endhour + ' : '+ endmin+ ' : '+ endday) endtime " & _ 
        "FROM tablename where StartDate =CAST('" & selecteddates & "' AS DATE) " 
+4

這是一種糟糕的編碼方式。不要在sql查詢中進行連接。它很脆弱。我建議你使用參數化查詢 – Sankar

+4

爲了增加Sankar的話,通過切換到使用參數,你也可以在這裏受益,因爲ADO.Net已經知道如何將.NET的'DateTime'轉換爲SQL Server的'datetime'(或'datetime2 '等)數據類型,因此您不必將日期呈現爲*字符串*,因此您可以消除格式問題。 –

回答

1

正確答案(S)的評論已經給出。我只是在此處添加示例代碼以使其更加清晰:

Dim strSQL As String = <sql>SELECT CalendarID, Company,Header, 
      convert(date,enddate,103) StartDate, convert(varchar,enddate,103) enddate, 
      (starthour + ' : ' + startmin + ' : ' + startday) starttime, 
      (endhour + ' : '+ endmin+ ' : '+ endday) endtime 
      FROM mytablename 
      where StartDate >= @dtStart and StartDate < @dtEnd 
      </sql> 

Dim tbl As New DataTable() 
Using con As New SqlConnection("server=.\SQLExpress;Database=MyDatabase;Trusted_Connection=yes") 
    Using cmd = New SqlCommand(strSQL, con) 
     cmd.Parameters.Add("@dtStart", SqlDbType.DateTime).Value = calendar1.SelectedDate.Date 
     cmd.Parameters.Add("@dtEnd", SqlDbType.DateTime).Value = calendar1.SelectedDate.Date.AddDays(1) 
     con.Open() 
     tbl.Load(cmd.ExecuteReader()) 
     con.Close() 
    End Using 
End Using 
相關問題