【问题标题】:How can I circument the "80004005 There is a file sharing violation...." err msg on a SQL Server CE database?如何绕过 SQL Server CE 数据库上的“80004005 存在文件共享冲突....”错误消息?
【发布时间】:2014-10-01 23:37:22
【问题描述】:

我遇到错误

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 的流氓实例,我写道一个快速而肮脏的实用程序,它遍历正在运行的进程,寻找它们,如果找到它们,就杀死它们,但它们不存在,所以该实用程序真的“什么也没做”(也许是霍桑效应?)。

不过,这似乎就是使用这种工具和技术组合的方式:前一分钟一切正常,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 实例存在问题(如果找到的话,我不会显示消息框)...?

【问题讨论】:

  • 你考虑过改用 SQLite 吗?在 .NET Compact 2013 中,甚至 MS 也放弃了对 SQL CE 的支持,转而支持 SQLite。见这里:msdn.microsoft.com/en-us/library/ee486593.aspx
  • 我很想改用更现代的东西,但现在,我必须坚持“久经考验”你对“真实”的定义可能会有所不同,但这不是我的决定。
  • 为什么没有人提供答案 - 我宁愿给某人赏金也不愿让它溜到以太中......

标签: c# sql-server-ce compact-framework windows-ce


【解决方案1】:

作为索取未使用赏金的尝试...但是,不要觉得有义务代表我传递免费积分...

除了强制终止可能的任务之外,您是否在寻找答案的过程中重新启动了系统?如果您的工具没有返回消息,那么重新启动肯定会完成您使用 kill 实用程序尝试过的事情 - 或者 iexplore.exe 可能与它有关......缺少额外的消息框可能会让您永远不知道 - 除非此问题再次发生。

如果没有发生重新启动,那么可能是某个其他进程在内存中保存的任何程序/dll 结束了它的任务并释放了它。

可能发生了几种情况,肯定很难断定;因此缺乏答案。不过,如果这个问题再次发生,我会很感兴趣。

【讨论】:

  • 是的,我确实尝试过热启动和冷启动,但都不起作用。我倾向于认为它是 iexplorer;我希望我也为它添加了一个 MessageBox.Show() ;它甚至在那里有点意外 - 它是我找到的原始代码的残留物。一定有一个原因,(iexplore.exe)是(好奇?)猫想要杀死的进程。引用公主新娘(我不会这样做),我不认为这个词(“赦免”)意味着你认为它的意思,但我会原谅你使用它,因为很容易看出如何这是一个错误的同源词。
  • 对一个没有任何期望的帖子做出了很棒的回应。谢谢你的笑声……我非常喜欢查找同源词;出色的词语选择和使用。
猜你喜欢
  • 2013-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-09
  • 2011-05-22
  • 1970-01-01
相关资源
最近更新 更多