Domanda

Stiamo cercando di inserire i dati in un file di database tagliatore (file DBF con file di indice NTX).

Per una serie di ragioni, non possiamo cambiare il formato di database.

Al momento stiamo assistendo a due questioni:

  1. Con la nostra codice esistente, non siamo in grado di aggiornare o utilizzare il file di indice NTX (credo). Vorremmo essere in grado di fare questo. Sapete di un driver OLE o ODBC che può fare questo?

  2. Siamo in grado di inserire una riga nel file di database Clipper (DBF) finché non includiamo una data. Se includiamo una data, in qualsiasi formato, otteniamo un errore.

Alcuni codici di esempio:

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

e l'eccezione è qualcosa come:

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

Anche in questo caso, senza la colonna della data, funziona benissimo.

C'è un fornitore di meglio utilizzare per i file Clipper (il fornitore di grandi opere per altri file DBF).

Tutte le idee?

È stato utile?

Soluzione

Sembra che il problema è legato principalmente al driver / dBASE OLE DBF non è in grado di scrivere il formato nativo Clipper, che è una versione modificata di dBASE III.

Per scrivere al formato Clipper, questa stringa deve essere utilizzato:

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

Ciò permetterà uno a scrivere sul file, tra cui il formato della data.

Tuttavia, questo non utilizza i file di indice NTX (né aggiorna loro). Per questo, sembrerebbe che ci sarebbe bisogno di usare il Codebase (o simile) il driver Clipper.

Altri suggerimenti

In primo luogo, sembra che si sta tentando di aggiungere 'valori testo' per le colonne di data indipendentemente dal loro essere in un formato di data. Inoltre, se utilizzato in applicazioni web-based in cui si sarebbe utilizzando variabili, si sarebbe meglio usare query con parametri.

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

Si prosegue poi con la connessione, aprire, eseguire e vicino ...

connessione senza DSN: (Nota il conducente e la stringa FIL cambiato in quanto chiamato in Windows 7) E utilizzare Microsoft OLE DB per driver ODBC (MSDASQL). Il codice di utilizzare il provider di dati .NET Framework per ODBC (System.Data.Odbc), Non il provider dati .NET Framework per OLE DB (System.Data.OleDb). Tipo Clipper N-> OdbcType doppio

 "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";
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top