C# SqlCeConnection希望其连接字符串arg采用什么格式?

C# SqlCeConnection希望其连接字符串arg采用什么格式?,c#,database-connection,sql-server-ce,connection-string,windows-ce,C#,Database Connection,Sql Server Ce,Connection String,Windows Ce,我对SqlCeConnection.Open()的调用失败。我得到的异常消息非常通用:“System.Data.SqlserverCe.SqlCeException”(比pretty更通用) 相关代码为: private DBConnection() { try { string conStr = "Data Source = " + filename; string cmpStr = conStr + ".tmp"; if (Fi

我对SqlCeConnection.Open()的调用失败。我得到的异常消息非常通用:“System.Data.SqlserverCe.SqlCeException”(比pretty更通用)

相关代码为:

private DBConnection()
{
    try
    {
        string conStr = "Data Source = " + filename;
        string cmpStr = conStr + ".tmp";
        if (File.Exists(filename+".tmp"))
            File.Delete(filename+".tmp");

        engine = new SqlCeEngine(conStr);

        if (File.Exists(filename))
        {
        }
        else
        {
            engine.CreateDatabase();

            }
        engine.Dispose();

        objCon = new SqlCeConnection(conStr);                                                                           
            //MessageBox.Show(string.Format("conStr == {0}", conStr)); 
        objCon.Open(); // <= This is where all Dallas breaks loose; conStr is "DataSource = \My Documents\NRPSDB.SDF" (which file *does* exist on the device)
    }
    catch(Exception ex)
    {
        NRPS.ExceptionHandler(ex, "DBConnection.DBConnection");
    }
}
这些都与“MyDocuments”不对应,是吗

更新2 对ctacke评论的进一步回应如下:

以下是将SqlCe异常嵌入MessageBox.Show()“debug”字符串中的位置:

我最后看到的是:

“已到达GetFormTitle()。formName==NRPS:System.Data.SqlServerCe.SqlCeException;serialNo==;siteNo==;”

一个相关的帖子/线程是

更新3 bizarro自定义异常处理程序尝试显示异常详细信息,如下所示:

public static void ExceptionHandler(Exception ex, string location)
{
    try
    {
        MessageBox.Show("Exception: " + ex.Message + "\n\nLocation: " + location, GetFormTitle("NRPS: " + ex.GetType().FullName,"",""));
    }
    catch(Exception exc)
    {
        MessageBox.Show("Exception Handler generated an exception!\n" + exc.Message + "\n\nCalling Location: " + location, GetFormTitle("NRPS: " + exc.GetType().FullName,"",""));
    }
}
更新4 现在我们可能有进展了。我注释掉了自定义异常处理程序中调用GetFormTitle()的现有行,并将其替换为以下内容:

MessageBox.Show(string.Format("location: {0}; Exception: {1}; Inner Exception: {2}; TypeFullName: {3}; StackTrace: {4}" + location, ex.Message, ex.InnerException, ex.GetType().FullName, ex.StackTrace));
这就是我现在看到的:

位置:DBConnection.DBConnection:

异常:数据库版本不兼容。如果这是兼容的文件,请运行修复。有关其他情况,请参阅文档。[DB Version=0,请求的版本=0,文件名=My Documents\HHSDB.SDF]

内部异常:TypeFullName:System.Data.SqlServerCe.SqlCeException

堆栈跟踪: 位于System.Data.SqlServerCe.SqlCeConnection.ProcessResults(Int 32 hr)处的System.Data.SqlServerCe.SqlCeConnection.Open(布尔静默)处的System.Data.SqlServerCe.SqlCeConn…[无法再看到更多…]*”

这就是我印象深刻的地方: DB版本=0,请求的版本=0

但是…什么是Hec拉姆齐

更新5
这已经变成了一个新问题,我发布了这个问题

更新6
由于
文件名
包含相对路径
“\My Documents\NRPSDB.SDF”
,因此程序可能从运行应用程序的目录开始查找该路径,而该目录很可能是错误的。比如:

\bin\debug\My Documents\NRPSDB.SDF

请尝试将其放置在您的方法中,并查看是否能够找到该文件:

string conStr = string.Concat("Data Source = ",
   Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
                "NRPSDB.SDF"));
如果它能够找到它,那么无论从何处调用该方法,都必须使用它,以便
filename
包含正确的绝对路径


关于您正在使用Win CE的更新,相当于
SpecialFolder.MyDocuments
的是
SpecialFolder.Personal

发件人:

私人的。用作文档公共存储库的目录。此成员相当于MyDocuments


如错误文本所示,问题在于SDF文件是由SQL Compact版本创建的,该版本与应用程序引用的SQL Compact版本不匹配。我不会关注报告的版本号,只是它知道存在不匹配的事实

如果你不知道SDF的版本,你总是可以的

SQL Compact数据库文件不是100%可传输的。您绝对不能从较新的版本获取SDF,并使用较旧的运行时集加载它

如果数据库是使用3.1创建的,则可以通过调用将其升级到3.5

您不能以编程方式从1.0或2.0升级到任何更新版本。必须使用较旧的SQL Compact库与数据库交互,或者必须针对较新的运行时重新创建数据库


如果数据库是在PC上创建的,第一次使用将强制执行完整的重新索引,因为索引在设备上的格式不同。如果数据库中有大量数据,通常最好确保您部署到设备上的内容实际上是最后一次在设备上打开的,以防止用户等待重新索引。

否,它肯定位于运行它的手持设备上的“\My Documents\NRPSDB.SDF”中。不过(星期一)我会试试你的建议——谢谢!这不是一条相对的路径。它以斜线开始,使其成为绝对值。当它在设备上运行时,它不会在
…\bin\debug…
中查找。我们没有足够的信息让我知道错误,尽管我有一些怀疑Grant的“Environment.SpecialFolder.Personal”提示确实有效,比如引用“我的文档”文件夹;这就是为什么我把它作为问题的答案。但它仍然在崩溃,更新2证明了这一点。你得到的实际异常是什么?如果使用该设置的
CreateDatabase()
调用成功,则表明它是一个有效的连接字符串,并且您还有其他问题。这非常奇怪:MessageBox.Show()中嵌入了一个异常。具体来说,它是:“[my verbiage]System.Data.SqlServerCe.SqlCeException;[more of my verbiage]”SqlCeException通常也包含一个InnerException。上面的错误文本表明messagebox调用中存在错误,这使我认为您得到的异常与上面发布的代码不符。请将代码放入异常处理程序中。让它输出异常。不要试着在别的地方做,因为那只会给小麦增加谷壳。进行此操作时,请确保DB文件未标记为只读,并且未设置密码。您可以使用密码创建它(例如,从PC复制时)。这是一个空数据库吗?它是在哪里创建的?如果SDF文件是在桌面或其他设备上创建的,如果SQL CE版本不同,您可能会遇到问题。“错误文本表明,问题是SDF文件是由SQL Compact版本创建的,该版本与应用程序引用的SQL Compact版本不匹配。”这对我来说似乎很奇怪,因为数据库文件是由一个单独的安装应用程序以编程方式创建的(我在设备上运行该应用程序,然后在“我的文档”文件夹中创建SDF文件)。事实上,我只是看了看,发现两个SDF文件的日期是4/30
MessageBox.Show(string.Format("location: {0}; Exception: {1}; Inner Exception: {2}; TypeFullName: {3}; StackTrace: {4}" + location, ex.Message, ex.InnerException, ex.GetType().FullName, ex.StackTrace));
string conStr = string.Concat("Data Source = ",
   Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
                "NRPSDB.SDF"));