2010-01-17 76 views
0

我們試圖將數據插入到Clipper數據庫文件(帶有NTX索引文件的DBF文件)中。使用OLE將日期字段插入到Clipper數據庫中

由於各種原因,我們無法更改數據庫格式。

目前,我們正在看到兩個問題:

  1. 與我們現有的代碼,我們無法更新或利用NTX索引文件(我相信)。我們希望能夠做到這一點。你知道可以做到這一點的OLE或ODBC驅動程序嗎?

  2. 只要我們不包含日期,我們就可以在裁剪數據庫文件(DBF)中插入一行。如果我們以任何格式包含日期,我們會收到錯誤。

一些示例代碼:

OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + ";Extended Properties=dBASE IV"); 
string sql = "insert into TABLE (E, J, DATE, STARTTIME, ENDTIME) values ('1', '2', '2010-01-13' ,'08:12:12', '18:12:12')"; 

    OleDbCommand myCommand = new OleDbCommand(sql); 
    myCommand.Connection = con; 
    con.Open(); 
    myCommand.ExecuteNonQuery(); 
    myCommand.Connection.Close(); 

,異常是一樣的東西:

01/15/2010 12:50:31 {ERROR} ASITranslator.GUI.ASITranslatorGUI.insertSCH - Error in: Syntax error in INSERT INTO statement.-- StackTrace: at System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr) 
    at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult) 
    at System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult) 
    at System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult) 
    at System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method) 
    at System.Data.OleDb.OleDbCommand.ExecuteNonQuery() 

接下來,沒有日期欄,它工作正常。

是否有更好的提供者用於Clipper文件(該提供者適用於其他DBF文件)。

任何想法?

回答

1

看來,問題主要與OLE DBF/dBase驅動程序無法寫入到本地帆船格式,這是修改版本的dbase III。

要寫入快船的格式,這個字符串需要使用:

Provider=MSDASQL.1;Persist Security Info=False;Mode=ReadWrite;Extended Properties="CollatingSequence=ASCII;DBQ=C:\DATA\8110FULL;DefaultDir=C:\DATA\8110FULL;Deleted=1;Driver={Microsoft dBase Driver (*.dbf)};DriverId=21;FIL=dBase III;FILEDSN=C:\Program Files\Common Files\ODBC\Data Sources\test.dsn;MaxBufferSize=2048;MaxScanRows=8;PageTimeout=600;SafeTransactions=0;Statistics=0;Threads=3;UID=admin;UserCommitSync=Yes;";Initial Catalog=C:\DATA\8110FULL 

這將允許一個寫入文件,包括日期格式。

但是,這不會使用NTX索引文件(也不會更新它們)。爲此,我們似乎需要使用CodeBase(或類似的)Clipper驅動程序。

0

首先,看起來您正在嘗試爲日期列添加「文本值」,而不管它們是否處於日期格式。此外,如果在基於Web的應用程序中使用變量,最好使用參數化查詢。

String sql = "insert into YourTable (fld1, fld2, DateFld1, DateFld2) " 
    + "value (?, ?, ?, ?)"; 

OleDbCommand myCommand = new OleDbCommand(sql); 

OleDbParameter NewParm = new OleDbParameter("parmFld1", 1); 
NewParm.DbType = DbType.Int32; 
myCommand.Parameters.Add(NewParm); 

NewParm = new OleDbParameter("parmFld2", 2); 
NewParm.DbType = DbType.Int32; 
myCommand.Parameters.Add(NewParm); 

NewParm = new OleDbParameter("parmDate1", DateTime.Now); 
NewParm.DbType = DbType.DateTime; 
myCommand.Parameters.Add(NewParm); 

NewParm = new OleDbParameter("parmDate2", DateTime.Now); 
NewParm.DbType = DbType.DateTime; 
myCommand.Parameters.Add(NewParm); 

然後用您的連接繼續開放,執行和關閉...

0

無DSN連接:(注意驅動程序和FIL字符串已更改爲Windows 7中調用的內容) 它使用Microsoft OLE DB提供程序用於ODBC驅動程序(MSDASQL)。 該代碼使用.Net Framework數據提供程序用於ODBC(System.Data.Odbc), 不是用於OLEDB的.Net Framework數據提供程序(System.Data.OleDb)。 Clipper type N-> OdbcType Double

"Provider=MSDASQL.1;Persist Security Info=False;Mode=ReadWrite;Extended Properties=\"CollatingSequence=ASCII;DBQ=F:\\Folder;DefaultDir=F:\\Folder;Deleted=1;DRIVER=Microsoft Access dBASE Driver (*.dbf, *.ndx, *.mdx);DriverId=21;FIL=dBASE III;MaxBufferSize=2048;MaxScanRows=8;PageTimeout=600;SafeTransactions=0;Statistics=0;Threads=3;UID=admin;UserCommitSync=Yes;\";Initial Catalog=F:\\Folder"; 
+1

這是對user48208的答案作出的調整。 – Vincent 2010-06-05 00:59:41

相關問題