我收到错误
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的{{3}}找到以下内容后,我发现了一些混乱和沮丧的混乱局面:
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.
这可能有问题(除了第一个设置是空白之外):
使用此代码:
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的流氓实例一个快速而肮脏的实用程序,它循环运行进程,寻找它们,如果找到它们,杀死它们,但它们不在那里,所以实用程序真的“没有”(可能是Hawthorne效应?)。
这就是使用这种工具和技术组合的方式,但是:一切都运行良好一分钟,下一个,BAM!它不再是。然后反过来也可能发生:因为没有明显的理由它似乎“自愈”。
为了“完全披露”,这里是实用代码:
// 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驻留在内存中的实例存在问题(如果发现的话,我没有显示消息框)......?
答案 0 :(得分:2)
作为试图申请未使用的赏金......但是,不要觉得有义务代表我转移免费积分......
除了强行查杀可能的任务外,您是否在搜索答案时重新启动了系统?如果您的工具没有返回消息,那么重启肯定可以完成您使用kill实用程序尝试过的东西 - 或者iexplore.exe可能与它有关...缺少额外的消息框可能让您永远不知道 - 除非再次出现此问题。
如果没有重新启动,那么可能由某个其他进程在内存中保存的任何程序/ dll结束了它的任务并释放它。
有几种情况可能已经发生,当然很难通过赦免来确定;因此缺乏答案。不过,如果再次出现这个问题,我会感兴趣的。