我们正在尝试将数据插入到限幅数据库文件(带有NTX索引文件的DBF文件)中。
由于各种原因,我们无法更改数据库格式。
我们目前看到两个问题:
使用我们现有的代码,我们无法更新或使用NTX索引文件(我相信)。我们希望能够做到这一点。您知道可以执行此操作的OLE或ODBC驱动程序吗?
只要我们不包含日期,我们就可以在限幅数据库文件(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文件)。
有什么想法吗?
答案 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";