2012-01-20 66 views
3

我想將日期發佈到SQL Server 2008 R2數據庫中的dateTime列,但我遇到了很多問題,我不知道是什麼原因。Delphi更新SQL Server 2008 R2中的DateTime列

首先,我使用這段代碼,但我得到了錯誤:無法將字符串轉換爲日期。

ADOOF.SQL.Text:='UPDATE OFTab SET CA='''+ CA.Text + ''', demandeClient=''' + DateTimeToStr(demandeClient.DateTime) + ''' WHERE ID='''+ ADOOF.FieldByName('ID') + ''''; 
ADOOF.ExecSQL; 

第二,我已經使用參數:

ADOOF.SQL.Text:='UPDATE OFTab SET CA='''+ CA.Text + ''', demandeClient=:demande_client WHERE ID='''+ ADOOF.FieldByName('ID') + ''''; 
ADOOF.Parameters.ParamByName('demande_client').Value:= demandeClient.Date; 
ADOOF.ExecSQL; 

但我得到的錯誤:參數(demande_client)未找到。

我用Google搜索這個問題,我發現了一個建議,由Embarcadero公司說,該參數應用前人的精力調用ADOQuery這樣之前創建:

ADOOF.SQL.Text:='UPDATE OFTab SET CA='''+ CA.Text + ''', demandeClient=:demande_client WHERE ID='''+ ADOOF.FieldByName('ID') + ''''; 
ADOOF.Parameters.ParseSQL(ADOOF.SQL.Text, True);  
ADOOF.Parameters.ParamByName('demande_client').Value:= demandeClient.Date; 
ADOOF.ExecSQL; 

精細我刪除的連接堅持安全信息,但總是同樣的問題。 請提出任何建議。

信息:我正在使用Microsoft SQL Server的MICROSOFT OLE DB提供程序。

+0

如果你不想要組件,但原始的SQL執行,你可以看看[我們的開源類](http://blog.synopse.info/post/2011/06/27/SynOleDB%3A-OpenSource-Unit-for-direct-access-to-any-database-via-OleDB),它們針對SQL Server直接訪問進行了優化(沒有任何驅動程序或依賴於ADO,DB.pas單元等) )。它像'Connection.ExecuteNoResult('UPDATE OFTAB SET CA =?,demandeClient =?WHERE ID =?',[CA.Text,demandeClient.DateTime,ADOOF.FieldByName('ID')])'直接處理'TDateTime'參數' 。 –

回答

5

在你的第一個例子中使用的

FormatDateTime('YYYYMMDD hhmmss',demandeClient.DateTime) 

代替

DateTimeToStr(demandeClient.DateTime) 

這是因爲DateTimeToStr沒有formatsettings使用本地化的機器設置和數據庫只是可能或可能不喜歡的格式。使用FormatDateTime也可以消除歧義:考慮01/02/03,對於一些世界上的人來說,這是2003年1月2日,但對於其他人2003年2月1日,甚至有些人會說2001年,2月3日。 YYYYMMDD是通用的。 20030201總是第一2003年2月。

+0

我不使用日期格式化,因爲我不知道本地系統和服務器日期格式。 –

+1

這就是爲什麼在將日期放入數據庫時​​應始終使用YYYYMMDD格式,這是ISO標準。你不需要知道任何本地設置就可以工作。 –

+0

如果僅使用日期,則FormatDateTime('YYYYMMDD',TDate)也適用。 –

2

它可以取決於你如何連接到你的數據庫(驅動程序)。
你可以試着明確你正在使用一個日期:

ADOOF.Parameters.ParamByName('demande_client').DataType:= ftDateTime; 
ADOOF.Parameters.ParamByName('demande_client').AsDateTime:= demandeClient.Date; 
+1

+1不確定如果在使用特定的'As ...'方法時需要設置DataType。 –

+0

這是沒有必要的。 –

1
  1. 我會強烈建議使用SQL Native Client的11,當你使用SQL Server 2008 R2工作。 SQL Server 2000 OLEDB提供程序不支持新的SQL Server 2008數據類型(包括DATE,TIME,DATETIME2DATETIMEOFFSET)。
  2. 你的第二個代碼示例應該可以工作。檢查你是否有TADOQueryParamCheck =真。
+0

我不能使用SQL Native Client,因爲這是一個遠程連接到服務器的網絡應用程序。爲此,我正在使用SQL Server OLEDB提供程序。 –

+1

爲什麼你不能?您必須安裝SQLNC並在連接字符串中指定它。這將是正確的... –