2014-04-22 45 views
3
「無法轉換變量類型」錯誤使用完全相同的查詢

確切的錯誤我得到是SQL查詢工作在工作臺而是要德爾福

無法轉換類型的變種(的UnicodeString)到類型(日期)。

我用於日期的變量是一個字符串,我必須在其周圍放置引號,否則它將返回空值,但是當我將引號放在它的周圍時,出現此錯誤。

這是我的SQL查詢代碼和變量TodaysDate。 (此代碼是不能複製粘貼,由於它是在不同的機器上沒有上網功能,所以請忽略任何可能導致編譯錯誤)

if MidStr(DateToStr(Date),2,1) ='/' then 
     TodaysDate := MidStr(DateToStr(Date),6,4) + '-' + '0' + 
     MidStr(DateToStr(Date),1,1) + '-' + MidStr(DateToStr(Date),3,2) 
    else 
     TodaysDate := MidStr(DateToStr(Date),7,4) + '-' 
     + MidStr(DateToStr(Date),1,2) + '-' + MidStr(DateToStr(Date),4,2); 

    ADOQuery1.SQL.Clear; 
    ADOQuery1.SQL.Add('SELECT tbl.emailAddress, tbljob.Time FROM '+ 
    'dbwindowwash.tblclient, dbwindowwash.tbljob, dbwindowash.tbljobclientworker '+ 
    'WHERE tbljobclientworker.jobID = tbljob.jobID AND '+ 
    'tbljobclientworker.clientID = tblclient.clientID AND tbljob.Date = ' + 
    QuotedStr(TodaysDate)); 
    ADOQuery1.Open 

    // More Code using the email addresses and time 

複製和粘貼直接進入工作臺此查詢給了我所有我想要的數據,但在德爾福給我和錯誤,並沒有QuotedStr()它在Delphi和Workbench都返回null。

我在我的程序中有一個類似的查詢,它使用日期作爲字符串與QuotedStr(),它工作正常,所以我完全不知道這是什麼問題。

+0

Delphi出現無法執行Workbench所做的從字符串到日期的隱式轉換。您必須使用適當的Delphi投射來投射quotedStr。它可能在別處工作的原因是因爲你可能正在使用字符串數據;而這裏是一個日期。例如:http://www.delphibasics.co.uk/RTL.asp?Name=StrToDateTime'StrToDateTime('23/02/2075 12:34:56');'或類似於:http:// stackoverflow。 com/questions/11782114/how-i-can-convert-str-date-datetime – xQbert

+7

使用參數 - 不僅可以擺脫轉換/格式問題,還可以防止sql注入 –

+0

您有足夠的代表添加評論。您不必添加答覆即可回覆任何內容。更新/編輯你的問題,如果你有更多的細節或添加評論 –

回答

6

同意SirRufo在這裏的評論。 「我該如何做到這一點?」的正確答案是「不要那樣做,那是錯誤的做法。」

如果你堅持價值直接進入這樣的查詢,黑客可以找到一種方法來place things into your query that get interpreted as SQL commands.這被稱爲SQL注入,它已經負責了數十億美元的價值在過去的幾十年中破壞的。 (不誇張。)

做到這一點是清晰地從數據中分離你的SQL代碼,通過使用參數,像這樣正確的做法:

ADOQuery1.SQL.Clear; 

//: before an identifier specifies a parameter 
ADOQuery1.SQL.Add('SELECT tbl.emailAddress, tbljob.Time FROM '+ 
    'dbwindowwash.tblclient, dbwindowwash.tbljob, dbwindowash.tbljobclientworker '+ 
    'WHERE tbljobclientworker.jobID = tbljob.jobID AND '+ 
    'tbljobclientworker.clientID = tblclient.clientID AND tbljob.Date = :date'; 

//parse the query and find parameter declarations 
ADOQuery1.Prepare; 

//set a value for the parameter 
ADOQuery1.ParamByName['date'].AsDateTime := TodaysDate; 

ADOQuery1.Open 

如何設置的確切語法一個參數的值可能會因數據集類型而異,但這應該會給你一個基本的想法。

+0

Lol對不起現在只接受你的答案,忘記做回來的時候我問了這個問題,不過最後還是謝謝你回答,並且是第一個教我關於SQL注入的人,導致我在其他項目中出現過。 – TwoRice

+0

@ user3562014:很高興能幫到你。 SQL是其中一種不幸的語言,它做錯事情簡單而直觀,正確地做出正確的事情需要更多的工作,再加上教育,甚至可以首先了解這個問題。越多的人知道SQL注入以及如何避免它,越好。 :) –

0

如果您希望某個日期在SQL查詢中正常工作,請不要自行兜圈,而應使用以下格式:yyyymmdd。

例如2014年4月3日就變成了:20140403.

你用的FormatDateTime做到這一點很容易,你的情況:

TodaysDate := FormatDateTime('yyyymmdd', Date) 

這個日期記法是符合ISO標準的,你不必去想本地設置了。

相關問題