【发布时间】: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