我怎样才能在SQL Server CE数据库上发布“80004005存在文件共享冲突....”错误消息?

时间:2014-10-01 23:37:22

标签: c# sql-server-ce compact-framework windows-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的{{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.

更新2

这可能有问题(除了第一个设置是空白之外):

enter image description here

更新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的流氓实例一个快速而肮脏的实用程序,它循环运行进程,寻找它们,如果找到它们,杀死它们,但它们不在那里,所以实用程序真的“没有”(可能是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驻留在内存中的实例存在问题(如果发现的话,我没有显示消息框)......?

1 个答案:

答案 0 :(得分:2)

作为试图申请未使用的赏金......但是,不要觉得有义务代表我转移免费积分......

除了强行查杀可能的任务外,您是否在搜索答案时重新启动了系统?如果您的工具没有返回消息,那么重启肯定可以完成您使用kill实用程序尝试过的东西 - 或者iexplore.exe可能与它有关...缺少额外的消息框可能让您永远不知道 - 除非再次出现此问题。

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

有几种情况可能已经发生,当然很难通过赦免来确定;因此缺乏答案。不过,如果再次出现这个问题,我会感兴趣的。