SqlCeConnection以什么格式期望其连接字符串arg?

时间:2014-05-02 23:43:59

标签: c# database-connection sql-server-ce connection-string windows-ce

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

相关代码是:

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");
    }
}

连接字符串arg传递给SqlCeConnection构造函数的问题是什么? “ DataSource = ”前导码是否不必要/有问题?回溯需要加倍还是分配给逐字字符串?或... ???

有关详细信息,请参阅this scintillating exchange

更新

Grant Winney的回答看起来很有希望,但今天尝试一下,我发现它在我的(Windows CE / CF)情况下无法编译。我跟随“SpecialFolder”的可能性是:

ApplicationsData
Favorites
Personal
Programs
StartMenu
Startup

这些都不符合“MyDocuments”吗?

更新2

扩大对ctacke评论的回应:

这是SqlCe异常嵌入MessageBox.Show()“debug”字符串的地方:

public static string GetFormTitle(string formName, string serialNo, string siteNo)
{
    MessageBox.Show(string.Format("GetFormTitle() reached. formName == {0}; serialNo == {1}; siteNo == {2}", formName, serialNo, siteNo)); // TODO: Remove after testing
    string titleBar = formName == "" ? "NRPS HHS" : formName;

我最终看到的是:

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

相关帖子/帖子是here

更新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,Requested version = 0,File name = My Documents \ HHSDB.SDF];

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

栈跟踪: System.Data.SqlServerCe.SqlCeConnection.ProcessResults(Int 32 hr)at System.Data.SqlServerCe.SqlCeConnection.Open(boolean silent)at System.Data.SqlServerCe.SqlCeConn ... [再看不到... ] *“

这让我印象深刻: DB版本= 0,请求版本= 0

但...... Hec Ramsey是什么?!?

更新5

这已成为一个新问题,我发布了here

更新6

那个是另一个,here

2 个答案:

答案 0 :(得分:2)

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

如果您不了解SDF的版本,可以随时look it up by reading a few bytes from the SDF file

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

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

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

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

答案 1 :(得分:1)

由于filename包含相对路径"\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的{​​{1}}。

来自MSDN

  

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