2014-09-24 71 views
1

我試圖檢索兩列; App_ID &來自sql server數據庫的表su_Appointments的App_Slot使用vb,並且我有兩個條件Date和Time; App_Date &查詢的App_Time,現在當我運行查詢時,它會拋出一個錯誤:「2014」附近的語法錯誤。查詢是如下 我要APP_ID存儲到變量AP_ID在visual basic中有兩個條件的sql select語句

CODE

Using Query As New SqlCommand("Select App_ID From su_Appointments Where (App_Date = ' and App_Time = ')" & DT & TM, sqlcon) 
    sqlcon.Open() 
    Dim dr As SqlDataReader = Query.ExecuteReader() 
    While dr.Read() 
    AP_ID = dr(0) 
    End While 
End Using 
sqlcon.Close() 

回答

2

那麼,你的語法是有效的錯誤

的SELECT語句需要

SELECT <fieldA>, <FieldB>, .... 
FROM <Table> 
WHERE <FieldX> = <Condition1> AND <FieldZ> = <Condition2> 

但是,從這個基本錯誤的一部分,你需要開始使用參數化查詢方法

Using sqlcon = new SqlConnection(.....connectionstring...) 
    Dim cmdText = "Select App_ID From su_Appointments Where App_Date [email protected] and App_Time = @tm" 
    Using Query = New SqlCommand(cmdText, sqlcon) 
     sqlcon.Open() 
     Query.Parameters.AddWithValue("@dt", DT) 
     Query.Parameters.AddWithValue("@tm", TM) 
     Using dr =Query.ExecuteReader() 
      While dr.Read() 
      AP_ID = dr(0) 
      End While 
     End Using 
    End Using 
End Using 

通過參數化查詢,您將獲得許多好處。沒有可能性Sql Injection Attacks,你的命令的文本更清晰易懂,參數被代碼本身正確引用,因此你不需要檢查你的字符串中的單引號,或者正確格式化日期和十進制數字。

最終,您可能會遇到不同的問題。如果您的列App_DateApp_Time是datetime類型,那麼您需要傳遞適當類型的參數,而不僅僅是字符串。相反,如果這些字段的類型爲nvarchar(或某種其他類型的文本類型),那麼您將傳遞字符串,但在這些字段中存儲和正確查詢時會遇到問題。

+0

非常感謝史蒂夫它工作得很好,我發現參數化的方法更加可控。非常感謝你兄弟! – 2014-09-25 15:57:09

+0

很高興能有所幫助。我發現你是這個網站的新用戶,所以我建議閱讀[如何接受答案](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-工作) – Steve 2014-09-25 16:12:03