0

クリッパー データベース ファイル (NTX インデックス ファイルを含む DBF ファイル) にデータを挿入しようとしています。

さまざまな理由により、データベースの形式を変更することはできません。

現在、次の 2 つの問題が発生しています。

  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 ドライバーが、dbase III の修正バージョンである Clipper ネイティブ フォーマットに書き込めないことに関連しているようです。

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 レス接続: (ドライバーと FIL 文字列が Windows 7 で呼び出されたものに変更されていることに注意してください) Microsoft OLE DB Provider for ODBC Drivers (MSDASQL) を使用します。このコードでは、OLEDB 用の .Net Framework Data Provider (System.Data.OleDb) ではなく、.Net Framework Data Provider for ODBC (System.Data.Odbc) を使用しています。クリッパー型 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 に答える