В C# создание DBF с использованием OLEDB для сбоев dBASE IV

Мой код ниже, каждый раз, когда я запускаю модульный тест (или фактическое приложение) для этого, он просто прекращает выполнение теста (несмотря на то, что приведенный ниже код завернут в попытку и точку останова в улове).

В результирующем файле есть поле для серьезности и сообщения, но нет других полей. Я видел этот запуск с перерывами, однако, я не могу заставить его работать снова.

//DBF Create Table
var currentLogTime = DateTime.UtcNow.ToString("yyMMddHH");
protected const string FORMAT_CONNECTION_STRING = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=dBASE IV";
var connectionString = String.Format(FORMAT_CONNECTION_STRING, DBFPath);
Connection = new OleDbConnection(connectionString);
Connection.Open();
using (var command = Connection.CreateCommand())
{
    command.CommandText =
        String.Format(
            "CREATE TABLE {0} ([SEVERITY] NUMERIC, [MESSAGE] MEMO, [STACKTRACE] MEMO, [OCCURRED] CHAR(50))",
            currentLogTime);
    try
    {
        command.ExecuteNonQuery();
    }
    catch(Exception ex)
    {

    }
}

person VulgarBinary    schedule 17.02.2016    source источник
comment
хорошо, какие ошибки вы получаете число onw .. также, где ваш код try{}catch{} вокруг command.ExecuteNonQuery пробовали ли вы заменить using (var command = Connection.CreateCommand(sqlCmd, conn)) на using (var command = new OleDbCommand()) установку command.CommandType = CommandType.Text; использовали ли вы отладчик для пошагового выполнения кода. .? также, почему бы вам не создать имя таблицы, которое имеет больше смысла, не основанное на каком-то отформатированном значении даты utc.   -  person MethodMan    schedule 18.02.2016
comment
Использование using (var command = new OleDbCommand()) не имеет значения. Да, я пытался пройти через это, и каждый раз, когда он попадает в command.ExecuteNonQuery();, визуальная студия прекращает отладку (на моем компьютере, а также на всех остальных в моем офисе). У меня есть попытка поймать более крупный фрагмент кода, в котором он содержится... Который никогда не срабатывает. Когда я F10 (перешагнуть), command.ExecuteNonQuery(); он каждый раз падает и прекращает отладку. Что касается имени таблицы, я установил его на что-то фиксированное, и это не имеет значения.   -  person VulgarBinary    schedule 18.02.2016
comment
Он создает файл DBF только с несколькими моими столбцами Путь правильный, он фактически создает файл DBF, в котором есть СЕРЬЕЗНОСТЬ и СООБЩЕНИЕ. Почему Visual Studio дает сбой, а не отлаживает. Почему не создаются дополнительные 2 поля STACKTRACE и OCCURRED? Я изменил имена столбцов, похоже, это ничего не меняет. Я изменил стиль подключения/команды... Без разницы.   -  person VulgarBinary    schedule 18.02.2016
comment
Обновлен вопрос, чтобы отразить самые последние изменения. Нет разницы. По-прежнему создает DBF только с первыми двумя полями, и визуальная студия прекращает отладку при переходе через command.ExecuteNonQuery().   -  person VulgarBinary    schedule 18.02.2016
comment
Никаких костей... Я получаю Syntax error in field definition. с тем, что вы предложили.   -  person VulgarBinary    schedule 18.02.2016
comment
Вы пытались указать ширину поля для ваших числовых и символьных полей   -  person Charles May    schedule 18.02.2016
comment
"CREATE TABLE {0} ([SEVERITY] NUMERIC(2), [DETAILS] MEMO, [STACKTRACE] MEMO, [OCCURRED] CHAR(50))" Те же симптомы. Нет разницы.   -  person VulgarBinary    schedule 18.02.2016
comment
какую версию FoxPro вы используете, попробуйте получить последнюю версию поставщика OLEDB отсюда — microsoft.com/en-us/download/details.aspx?id=14839   -  person MethodMan    schedule 18.02.2016
comment
если вас это утешит, я могу удалить расширенные свойства из строки подключения и указать ее на базу данных доступа, и ваш исходный код работает, создавая таблицу со всеми 4 полями.   -  person Charles May    schedule 18.02.2016


Ответы (3)


Вероятно, это связано с тем, что вы создаете таблицу только с числовыми данными даты. Вы не можете создать таблицу типа "ггММддЧЧ", которая может выглядеть как 16021715. Попробуйте создать таблицу с префиксом журнала, например...

String.Format("CREATE TABLE Log{0} (etc.....", parm);

поэтому имя таблицы на самом деле станет «Log16021715» и будет допустимым именем таблицы.

person DRapp    schedule 17.02.2016
comment
Изменение имени на: CREATE TABLE L16021721 ([SEVERITY] NUMERIC, [MESSAGE] MEMO, [STACKTRACE] MEMO, [OCCURRED] CHAR(50)) ничего не изменило. Проблема та же. - person VulgarBinary; 18.02.2016
comment
это должно работать для вас .. почему бы вам не попробовать это без использования функции string.Format Это должно работать CREATE TABLE L16021721 ([SEVERITY] NUMERIC, [MESSAGE] MEMO, [STACKTRACE] MEMO, [OCCURRED] CHAR(50)) - person MethodMan; 18.02.2016
comment
Как раз собирался прийти и сказать, что Message является зарезервированным ключевым словом в DBase в соответствии с этим - person Charles May; 18.02.2016
comment
Нет разницы. То же самое останавливает отладку, и в DBF есть только 2 столбца. - person VulgarBinary; 18.02.2016
comment
@DRapp - к сожалению, это должно изначально поддерживаться с помощью установки .NET 4.5.2. Это установленное программное обеспечение, таким образом, DBase (которое установлено по умолчанию). Я бы хотел, чтобы мне не приходилось работать в этих ограничениях, но это то, что есть... Спасибо за предложение. - person VulgarBinary; 01.03.2016

VisualFoxPro CreateTable

var currentLogTime = DateTime.UtcNow.ToString("yyMMddHH");
protected const string FORMAT_CONNECTION_STRING = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=dBASE IV";

var connectionString = String.Format(FORMAT_CONNECTION_STRING, DBFPath);
Source="yourFilePathToSourceFile";Extended Properties=dBase IV";
using (OleDbConnection connection = new OleDbConnection(connectionString))
using (OleDbCommand command = connection.CreateCommand())
{
    connection.Open();
    command.CommandText = String.Format("CREATE TABLE {0} (SEVERITY I, MESSAGE M, STACKTRACE M, OCCURRED C(50) NOCPTRANS"
    command.ExecuteNonQuery();
}
person MethodMan    schedule 17.02.2016
comment
Это dBASE IV, а не доступ. - person VulgarBinary; 18.02.2016

Похоже, что существует проблема с максимальной длиной пути, с которой сталкивается драйвер OleDB при создании файла DBT для полей MEMO. Сокращение пути исправляет проблему.

person VulgarBinary    schedule 17.02.2016