2010-01-17 75 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

相关问题