0

我们正在尝试将数据插入到裁剪器数据库文件(带有 NTX 索引文件的 DBF 文件)中。

由于各种原因,我们无法更改数据库格式。

我们目前看到两个问题:

  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()

同样,没有 DATE 列,它工作正常。

是否有更好的提供程序用于 Clipper 文件(该提供程序适用于其他 DBF 文件)。

有任何想法吗?

4

3 回答 3

1

似乎这个问题主要与 OLE DBF / dbase 驱动程序无法写入 Clipper 本机格式有关,这是 dbase III 的修改版本。

要写入 Clipper 格式,需要使用此字符串:

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

这将允许写入文件,包括 DATE 格式。

但是,这不使用 NTX 索引文件(也不更新它们)。为此,我们似乎需要使用 CodeBase(或类似的)Clipper 驱动程序。

于 2010-01-20T14:27:44.333 回答
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 );

然后继续你的连接,打开,执行和关闭......

于 2010-01-18T14:32:43.227 回答
0

DSN-less 连接:(注意驱动程序和 FIL 字符串更改为 Windows 7 中调用的内容)它使用 Microsoft OLE DB Provider for ODBC Drivers (MSDASQL)。该代码使用 .Net Framework Data Provider for ODBC (System.Data.Odbc),而不是 .Net Framework Data Provider for OLEDB (System.Data.OleDb)。Clipper 类型 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";
于 2010-06-05T00:54:52.020 回答