Парадокс Вставка данных Операция должна использовать обновляемый запрос

Я пытаюсь записать в файл базы данных Paradox, используя С# и oledb в Windows 8. Я могу удалить таблицу, создать таблицу и написать первую строку, прежде чем я получаю сообщение об ошибке «операция должна использовать обновляемый запрос».

Я прошел через следующее, чтобы попытаться решить это: 1) Запуск от имени администратора 2) Обновление разрешений в приложении, чтобы убедиться, что у меня нет свойств только для чтения или архивирования в файле 3) Добавление текущих разрешений пользователя на чтение /записать/изменить каталоги, в которых находятся файлы БД 4) Изменение запроса несколько раз на случай, если я делаю что-то странное с запросом

Если бы я вообще не мог писать или вставлять, то вышеуказанные шаги имели бы смысл, но первоначальная вставка работает, а любые дополнительные вставки терпят неудачу.

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

public void OverwriteData(string fileName, DataTable dataToWrite)
{
    //split up the filename
    string path = Path.GetDirectoryName(fileName);
    string file = Path.GetFileName(fileName);

    //create the string for creating the table
    string strTempCreate = "";
    //string strTempInsert = "";
    foreach (DataColumn column in dataToWrite.Columns)
    {
        if (strTempCreate != "")
        {
            strTempCreate = strTempCreate + ", ";
        }
        strTempCreate = strTempCreate + "[" + column.ColumnName + "]" + " char(30)";

        /*if (strTempInsert != "")
        {
            strTempInsert = strTempInsert + ", ";
        }
        strTempInsert = strTempInsert + column.ColumnName;*/
    }
    string createTableStr = "CREATE TABLE " + file + " (" + strTempCreate + ")";
    string dropTableStr = "DROP TABLE " + file;
    //build the sql insert command
    //string insertSql = "insert into " + file + " values ";
    /*foreach (DataRow row in dataToWrite.Rows)
    {
        insertSql = insertSql + row.Field<string>;
    }*/


    string connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + @";Extended Properties=Paradox 5.x;";
    //DataTable results = new DataTable();
    using (OleDbConnection conn = new OleDbConnection(connectionString))
    {
        conn.Open();
        OleDbCommand dbCommand = new OleDbCommand();
        dbCommand.Connection = conn;
        dbCommand.CommandText = dropTableStr;
        try
        {
            dbCommand.ExecuteNonQuery();
        }
        catch { }

        dbCommand.CommandText = createTableStr;
        dbCommand.ExecuteNonQuery();

        //try to do the insert
        StringBuilder sb = new StringBuilder();

        //make sure that the database is not readonly
        FileAttributes attributes = File.GetAttributes(fileName);
        if ((attributes & FileAttributes.Archive) == FileAttributes.Archive)
        {
            attributes = attributes & ~FileAttributes.Archive;
            File.SetAttributes(fileName, attributes);
        }

        //then we want to try and connect to this database to put data into it
        string selectSQL = "Select * from " + file;
        using (var adapter = new OleDbDataAdapter(selectSQL, conn))
        {
            using (var builder = new OleDbCommandBuilder(adapter))
            {
                var destinationTable = new DataTable();
                adapter.Fill(destinationTable);
                destinationTable.Merge(dataToWrite,true,MissingSchemaAction.Ignore);
                destinationTable.AcceptChanges();
                foreach (DataRow row in destinationTable.Rows)
                {
                    row.SetAdded();
                }
                builder.QuotePrefix = "[";
                builder.QuoteSuffix = "]";
                builder.GetInsertCommand();
                adapter.Update(destinationTable);
            }
        }

       /*foreach (DataRow row in dataToWrite.Rows)
        {
            sb.Clear();
            sb.Append("insert into " + file + " values ('");
            IEnumerable<string> fields = row.ItemArray.Select(field => field.ToString());
            sb.Append(string.Join("','", fields));
            sb.Append("')");
            dbCommand.CommandText = sb.ToString();
            dbCommand.ExecuteNonQuery();
        }*/

        /*sb.Clear();
        sb.Append("insert into " + file);
        foreach (DataRow row in dataToWrite.Rows)
        {
            sb.Append(" values ('");
            IEnumerable<string> fields = row.ItemArray.Select(field => field.ToString());
            sb.Append(string.Join("','", fields));
            sb.Append("'),");
        }
        sb.Remove(sb.Length - 1, 1);
        sb.Append(";");
        dbCommand.CommandText = sb.ToString();
        dbCommand.ExecuteNonQuery();
        */

    }
}

person Steve    schedule 13.01.2014    source источник
comment
Это не похоже на ошибку Paradox. Похоже, он исходит от Jet или где-то посередине. Кроме того, неясно значение strTempCreate, и похоже, что вы пытаетесь что-то создать, а затем отбрасываете. Не уверен, что таблица существует, когда вы пытаетесь что-то положить в нее.   -  person Patrick Moloney    schedule 13.02.2014
comment
Вы когда-нибудь находили решение этой проблемы? Я в такой же ситуации.   -  person Kris    schedule 03.12.2015


Ответы (1)


Эта статья решила мою проблему: https://msdn.microsoft.com/en-us/library/ms715421(v=vs.85).aspx

Согласно Microsoft: таблица не может быть обновлена ​​драйвером Paradox при двух условиях:

  1. Когда в таблице не определен уникальный индекс. Это неверно для пустой таблицы, которая может быть обновлена ​​одной строкой, даже если для таблицы не определен уникальный индекс. Если в пустую таблицу, не имеющую уникального индекса, вставляется одна строка, приложение не может создать уникальный индекс или вставить дополнительные данные после вставки одной строки.
  2. Если ядро ​​базы данных Borland не реализовано.
person Kris    schedule 03.12.2015
comment
Что означает, что Borland Database Engine не реализован? - person Igor Krupitsky; 26.09.2017
comment
Прошло почти два года с тех пор, как я работал с Paradox и BDE. Это причинило мне много головной боли. IIRC вам необходимо установить совместимую версию Borland Database Engine в дополнение к драйверам OOTB Paradox, если вы хотите иметь доступ R/W к базам данных. Вы можете проверить, работают ли драйверы BDE, выполнив команду вставки SQL для таблицы с существующими данными и действительным уникальным индексом. Возможно, вам даже потребуется настроить строку подключения. - person Kris; 28.09.2017