Надеюсь, другие сочтут это полезным - я получил ответ от Google следующим образом:
Срок действия маркера сеанса API истекает, если кто-то оставляет карту открытой более 24 часов, поэтому это нормально увидеть низкий уровень этих ошибок. (Это предполагаемое поведение)
blockquote>Никакой документации об этом нигде нет - так что, надеюсь, этот ответ поможет сэкономить время на исследования людей.
Может быть способ отловить ошибку и повторно авторизоваться в случае ее возникновения. Я обновлю здесь, если это возможно.
Я не уверен, как далеко Вы добрались, но если Вы ищущий быструю операцию перетаскивания, Вы могли бы хотеть посмотреть на создание набора данных со строгим контролем типов, который соединяется, и использование функций перетаскивать-отбрасывания Окна инструментов DataSources в Visual Studio.
Там существуют определенно образцы, но Вы захотите.
Обновление:
Прежде всего я не 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();
}
}
Существует на самом деле больше чем один формат файла с .mdb расширением. Так, если я предположу неправильный, то это будет неправильным ответом. Но, это походит на проблему Microsoft Access.
Вы не пишете непосредственно в файл MDB. Они зашифрованы и сжаты. Самый легкий способ изменить файл MDB состоит в том, чтобы загрузить его через Доступ и скопировать таблицы через предоставленные методы.
Для обновления исходного файла MDB с изменениями, внесенными в DataSet (не DataGrid, так как это - просто UI по DataSet) просто, используют DataAdapter. Команда Update.
Перемещать таблицы от 1 до другого немного более хитро. Если таблица не будет уже существовать в месте назначения, то необходимо будет создать ее с помощью оператора SQL CREATE. Затем DataAdapter. Заполните DataSet из источника. Цикл через каждую строку и набор это - состояние к RowAdded путем вызова DataRow. SetAdded. Затем пасуйте назад его к DataAdapter. Обновление от целевой базы данных.
Как Вы соединяетесь с базой данных (.mdb файл)? Вы могли отправить некоторый пример кода? Если Вы соединяетесь с ним правильно, чем какие-либо операции SQL, Вы работаете против него, должен быть сохранен в базе данных автоматически.
Таким образом, после соединения с базой данных, можно выполнить SQL, который составит таблицы, вставит/обновит/получит данные и т.д. Попытка создать .mdb файл вручную не желательна.
Вот пример:
http://www.java2s.com/Code/CSharp/Database-ADO.net/Access.htm