Вставьте поле даты в базу данных Clipper, используя OLE - PullRequest
0 голосов
/ 17 января 2010

Мы пытаемся вставить данные в файл базы данных клиппера (файл DBF с файлом индекса NTX).

По разным причинам мы не можем изменить формат базы данных.

В настоящее время мы видим две проблемы:

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

Есть идеи?

Ответы [ 3 ]

1 голос
/ 20 января 2010

Кажется, что проблема в основном связана с драйвером 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 (и не обновляет их). Для этого может понадобиться использовать драйвер Clipper CodeBase (или аналогичный).

0 голосов
/ 05 июня 2010

Подключение без DSN: (Обратите внимание, что драйвер и строка FIL изменены на то, что вызывается в Windows 7). Используется поставщик Microsoft OLE DB для драйверов ODBC (MSDASQL).В коде используется поставщик данных .Net Framework для ODBC (System.Data.Odbc), а не поставщик данных .Net Framework для OLEDB (System.Data.OleDb).Тип машинки для стрижки 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";
0 голосов
/ 18 января 2010

Во-первых, кажется, вы пытаетесь добавить «Текстовые значения» для столбцов даты независимо от того, находятся ли они в формате даты. Кроме того, при использовании в веб-приложениях, где вы будете использовать переменные, лучше всего использовать параметризованные запросы.

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

Затем продолжите соединение, откройте, выполните и закройте ...

...