使用OLE将Date字段插入Clipper数据库

时间:2010-01-17 20:25:11

标签: odbc ole dbf clipper

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

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

我们目前看到两个问题:

  1. 使用我们现有的代码,我们无法更新或使用NTX索引文件(我相信)。我们希望能够做到这一点。您知道可以执行此操作的OLE或ODBC驱动程序吗?

  2. 只要我们不包含日期,我们就可以在限幅数据库文件(DBF)中插入一行。如果我们以任何格式包含日期,则会收到错误。

  3. 一些示例代码:

    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文件)。

    有什么想法吗?

3 个答案:

答案 0 :(得分: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驱动程序。

答案 1 :(得分: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 );

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

答案 2 :(得分:0)

无DSN连接:(注意驱动程序和FIL字符串已更改为Windows 7中调用的内容) 它使用Microsoft OLE DB Provider for ODBC Drivers(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";