Проблема C#: Каков самый простой способ для меня загрузить.MDB файл, внести изменения в него и сохранить изменения назад в исходном файле?

Надеюсь, другие сочтут это полезным - я получил ответ от Google следующим образом:

Срок действия маркера сеанса API истекает, если кто-то оставляет карту открытой более 24 часов, поэтому это нормально увидеть низкий уровень этих ошибок. (Это предполагаемое поведение)

Никакой документации об этом нигде нет - так что, надеюсь, этот ответ поможет сэкономить время на исследования людей.

Может быть способ отловить ошибку и повторно авторизоваться в случае ее возникновения. Я обновлю здесь, если это возможно.

5
задан 11 revs, 3 users 100% 17 December 2009 в 05:05
поделиться

4 ответа

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

Там существуют определенно образцы, но Вы захотите.

  1. Создайте новый DataSet
  2. Drag-n-Drop от Вашего Дерева DataConnection в Проводнике Сервера
  3. Создайте новую форму
  4. Перетащите таблицу от Инструмента DataSources
  5. Окно на форме.
  6. вуаля

Обновление:

Прежде всего я не 100%, что я понимаю Вашу проблему. Если бы можно создать некоторый LinkTables между файлами доступа, которые были бы лучшими, то можно скопировать данные между файлами с помощью sql оператора как 'Клиентский ВЫБОР INSERT INTO FirstName, LastName ОТ File2. Клиенты. Если это не, и опция я думаю то, что вы оказывались перед необходимостью цикла DataTables и вставляю записи вручную с помощью операторов INSERT, подобных последнему редактированию. Что касается datagrid, необходимо будет, вероятно, отслеживать то, что изменяется путем слежения за развитием События RowChanged (не уверенный, если это - точное событие), даже делают вставить/обновить операторы, когда строка изменяется.

Обновление:

для цикличного выполнения таблицы данных, Вы сделали бы что-то вроде этого. не протестированный. Я просто обновил это снова для включения функции MakeValueDbReady. Это не тестируется или и я не уверен, имею ли я, обрабатывают все случаи или даже все случаи правильно. Необходимо будет действительно отладить sql оператор и удостовериться его генерация правильного значения. Каждая база данных дескрипторы является значениями по-другому. По крайней мере этот путь синтаксический анализ значения извлечен далеко. Я также понял, что вместо трудного кодирования TableName необходимо смочь получить его от свойства на DataTable

void CopyTable(DataTable table, string connectionStringB)
{
    var connectionB = new OleDbConnection(connectionStringB);
    foreach(DataRow row in table.Rows)
    {
        InsertRow(row, table.Columns, table.TableName, connectionB);
    }
}

public static void InsertRow(DataRow row, DataColumnCollection columns, string table, OleDbConnection connection)
{
    var columnNames = new List<string>();
    var values = new List<string>();

    // generate the column and value names from the datacolumns    
    for(int i =0;i<columns.Count; i++)
    {
        columnNames.Add("[" + columns[i].ColumnName + "]");
        // datatype mismatch should be fixed by this function
        values.Add(MakeValueDbReady(row[i], columns[i].DataType));
    }

    // create the sql
    string sql = string.Format("INSERT INTO {0} ({1}) VALUES ({2})",
            table,
            string.Join(", ", columnNames.ToArray()),
            string.Join(", ", values.ToArray())
        );

    // debug the accuracy of the sql here and even copy into 
    // a new Query in Access to test
    ExecuteNonQuery(sql, connection);
}

// as the name says we are going to check the datatype and format the value
// in the sql string based on the type that the database is expecting
public string MakeValueDbReady(object value, Type dataType)
{
    if (value == null)
        return null;

    if (dataType == typeof(string))
    {
        return "'" + value.ToString().Replace("'", "''") + "'"
    }
    else if (dataType == typeof(DateTime))
    {
        return "#" + ((DateTime)value).ToString + "#"
    }
    else if (dataType == typeof(bool))
    {
        return ((bool)value) ? "1" : "0";
    }

    return value.ToString();
}

public static void ExecuteNonQuery(string sql, OleDbConnection conn)
{
    if (conn == null)
        throw new ArgumentNullException("conn");

    ConnectionState prevState = ConnectionState.Closed;
    var command = new OleDbCommand(sql, conn);
    try
    {
        // the reason we are checking the prev state is for performance reasons
        // later you might want to open the connection once for the a batch
        // of say 500 rows  or even wrap your connection in a transaction.
        // we don't want to open and close 500 connections
        prevState = conn.State;
        if (prevState != ConnectionState.Open)
            conn.Open();

        command.ExecuteNonQuery();
    }
    finally
    {
        if (conn.State != ConnectionState.Closed
            && prevState != ConnectionState.Open)
            conn.Close();
    }
}
3
ответ дан 15 December 2019 в 01:12
поделиться

Существует на самом деле больше чем один формат файла с .mdb расширением. Так, если я предположу неправильный, то это будет неправильным ответом. Но, это походит на проблему Microsoft Access.

Вы не пишете непосредственно в файл MDB. Они зашифрованы и сжаты. Самый легкий способ изменить файл MDB состоит в том, чтобы загрузить его через Доступ и скопировать таблицы через предоставленные методы.

0
ответ дан 15 December 2019 в 01:12
поделиться

Для обновления исходного файла MDB с изменениями, внесенными в DataSet (не DataGrid, так как это - просто UI по DataSet) просто, используют DataAdapter. Команда Update.

Перемещать таблицы от 1 до другого немного более хитро. Если таблица не будет уже существовать в месте назначения, то необходимо будет создать ее с помощью оператора SQL CREATE. Затем DataAdapter. Заполните DataSet из источника. Цикл через каждую строку и набор это - состояние к RowAdded путем вызова DataRow. SetAdded. Затем пасуйте назад его к DataAdapter. Обновление от целевой базы данных.

Править: Код находится по следующему вопросу....

1
ответ дан 15 December 2019 в 01:12
поделиться

Как Вы соединяетесь с базой данных (.mdb файл)? Вы могли отправить некоторый пример кода? Если Вы соединяетесь с ним правильно, чем какие-либо операции SQL, Вы работаете против него, должен быть сохранен в базе данных автоматически.

Таким образом, после соединения с базой данных, можно выполнить SQL, который составит таблицы, вставит/обновит/получит данные и т.д. Попытка создать .mdb файл вручную не желательна.

Вот пример:

http://www.java2s.com/Code/CSharp/Database-ADO.net/Access.htm

0
ответ дан 15 December 2019 в 01:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: