Как я могу обойти сообщение "80004005" Нарушение общего доступа к файлу… "). Ошибка msg в базе данных SQL Server CE?
Я получаю ошибку
80004005 Произошло нарушение обмена файлами. Возможно, файл использует другой процесс.
при попытке открыть SqlCeConnection
,
Есть ли способ закрыть базу данных SQL Server CE программно, чтобы попытаться устранить эту проблему в зародыше? Что-то вроде (псевдокод):
SqlCeDatabase SQLCeDb = "\My Documents\HHSDB003.sdf";
if (SQLCeDb.IsOpen)
{
SQLCeDb.Close();
}
?
Или способ установить соединение так, чтобы ему было все равно, открыта ли база данных где-либо еще, например:
SqlCeConnection conn = new SqlCeConnection(@"Data Source=\My Documents\HHSDB003.sdf;File Mode = 'shared read'");
...или же:
SqlCeConnection conn = new SqlCeConnection(@"Data Source=\My Documents\HHSDB003.sdf;File Mode = 'read write'");
Я не могу проверить это в настоящее время, потому что я вернулся к получению
Не удается скопировать HHS.exe. Устройство перестало отвечать или было отключено.
когда я пытаюсь скопировать новую версию.exe на КПК.
Если есть что-то более неприятное, чтобы программировать против (и "против" - правильное слово здесь, я думаю), чем доисторические версии Windows CE / Compact Framework / .NET, я совсем не уверен, что хочу знать, что это такое,
ОБНОВИТЬ
В дополнение к моему разочарованию (сочетание путаницы и разочарования) я нашел следующее по адресу http://www.pocketpcfaq.com/faqs/activesync/exchange_errors.php:
0x80004005 N/A Synchronization failed due to a device software error. Contact your network administrator.
1. Obtain the latest Pocket PC End User Update from your service provider.
ОБНОВЛЕНИЕ 2
Возможно ли это проблематично (чем все, кроме первого параметра пусто):
ОБНОВЛЕНИЕ 3
С этим кодом:
private void menuItemTestSendingXML_Click(object sender, System.EventArgs e)
{
string connStr = "Data Source=My Documents\\HHSDB003.SDF";
SqlCeConnection conn = null;
try
{
try
{
conn = new SqlCeConnection(connStr);
conn.Open();
MessageBox.Show("it must have opened okay");
}
finally
{
conn.Close();
}
}
catch (Exception ex)
{
if (null == ex.InnerException)
{
MessageBox.Show("inner Ex is null");
}
MessageBox.Show(String.Format("msg is {0}", ex.Message));
}
}
... теперь я вижу, что "должно быть, все в порядке" (это хорошо, но... почему это сейчас работает, я понятия не имею, потому что код не изменился с тех пор, как я в последний раз его запускал, и он не удался. вне кода должно быть в игре.
Единственное, что я могу вспомнить, это то, что МОЖЕТ иметь отношение к этому изменению, так это то, что, подумав, что на портативном устройстве в памяти может быть мошеннический экземпляр либо.exe, либо его вспомогательной dll, я быстро написал: и - грязная утилита, которая просматривает запущенные процессы, ищет их и, если находит их, убивает их, но их там не было, поэтому утилита действительно ничего не делала (может быть, эффект Хоторна?).
Таким образом, похоже, что работа с этой комбинацией инструментов и технологий идет своим чередом: одна минута и все работает отлично, БАМ! Это больше не так. Тогда может произойти и обратное: без всякой видимой причины оно, похоже,"исцеляет себя".
В интересах "полного раскрытия" вот код утилиты:
// Got this from http://www.codeproject.com/Articles/36841/Compact-Framework-Process-class-that-supports-full
private void btnKillRogue_Click(object sender, EventArgs e)
{
ProcessInfo[] list = ProcessCE.GetProcesses();
foreach (ProcessInfo item in list)
{
MessageBox.Show("Process item: " + item.FullPath);
if (item.FullPath == @"\Windows\iexplore.exe") item.Kill(); //<= this was the example search; it probably could be a problem, so I'll use it, too
if (item.FullPath.EndsWith("HHS.exe"))
{
MessageBox.Show("about to kill hhs.exe");
item.Kill();
}
if (item.FullPath.EndsWith("HUtilCE.dll"))
{
MessageBox.Show("about to kill hutilce.dll");
item.Kill();
}
}
}
Может быть, в памяти был экземпляр iexplore.exe, который был проблематичным (я не показываю окно сообщения, если это то, что найдено)...?
1 ответ
В качестве попытки потребовать неиспользованную щедрость... однако, не чувствуйте себя обязанным передавать бесплатные баллы от моего имени...
Помимо принудительного уничтожения возможных задач, вы перезагружали систему в поисках ответа? Если ваш инструмент не вернул сообщение, вполне возможно, что перезагрузка сделала бы то же самое, что вы пытались сделать с помощью утилиты kill - или, возможно, iexplore.exe имел к этому какое-то отношение... отсутствие дополнительного Сообщение может оставить вас никогда не зная - если эта проблема не возникает снова.
Если перезагрузка не произошла, то, возможно, какая бы программа / dll не была сохранена в памяти каким-либо другим процессом, завершил свою задачу и выпустил ее удержание.
Есть несколько сценариев, которые могли бы произойти, это, безусловно, трудно определить с помощью отпущения грехов; отсюда и отсутствие ответов. Мне было бы интересно, если бы эта проблема возникла снова.