Pergunta

Estamos tentando inserir dados em um arquivo de banco de dados Clipper (arquivo dbf com o arquivo de índice NTX).

Por vários motivos, não podemos alterar o formato do banco de dados.

Atualmente, estamos vendo dois problemas:

  1. Com nosso código existente, não podemos atualizar ou utilizar o arquivo de índice NTX (acredito). Gostaríamos de poder fazer isso. Você conhece um driver OLE ou ODBC que pode fazer isso?

  2. Podemos inserir uma linha no arquivo de banco de dados Clipper (DBF), desde que não incluamos uma data. Se incluirmos uma data, em qualquer formato, obtemos um erro.

Algum código de exemplo:

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 a exceção é algo como:

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

Novamente, sem a coluna de data, funciona bem.

Existe um provedor melhor para usar para arquivos Clipper (que o provedor funciona muito bem para outros arquivos DBF).

Alguma ideia?

Foi útil?

Solução

Parece que o problema está relacionado principalmente ao driver OLE DBF / DBASE não pode escrever no formato nativo do Clipper, que é uma versão modificada do DBASE III.

Para escrever no formato Clipper, essa string precisa ser usada:

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

Isso permitirá gravar no arquivo, incluindo o formato de data.

No entanto, isso não usa os arquivos de índice NTX (nem os atualiza). Para isso, parece que precisaríamos usar a base de código (ou similar) Driver Clipper.

Outras dicas

Primeiro, parece que você está tentando adicionar 'valores de texto' para as colunas de data, independentemente de elas estarem em um formato de data. Além disso, se usado em aplicativos baseados na Web, onde você usaria variáveis, seria melhor usar consultas parametrizadas.

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

Em seguida, continue com sua conexão, abra, execute e feche ...

Conexão sem DSN: (Observe o driver e o FIL String alterados para o que chamou no Windows 7) Ele usa o provedor Microsoft OLE DB para drivers ODBC (MSDASQL). O código usa o provedor de dados do .NET Framework para ODBC (System.data.odbc), não o provedor de dados do .NET Framework para OLEDB (System.data.oledb). Clipper tipo n-> odbctype duplo

 "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";
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top