SQL连接字符串问题

5
我有一个数据库(紧凑的SQL Server),保存在一个*.sdf文件中。 我将一个紧凑的框架项目转换成了一个常规的PC项目,但是出现了以下异常:"the file name is not valid. check the file name for the database"。尽管代码和*.sdf文件都没有改变。
奇怪的是,在我的电脑上,原始连接字符串中添加了子字符串"file:\",这可能是异常抛出的原因。当我在调试模式下去掉"file:\"子字符串后,在运行时就不会抛出异常。
为什么会添加这个子字符串?它从哪里来?如何解决这个问题?
最近我发现,这可能与缺少app.config文件有关。但这并不能解释为什么原始连接字符串存在,并且只有添加了子字符串。
请帮忙解决这个问题,谢谢!

SDF文件是本地的吗?在子文件夹中吗?它在哪里?你能举个例子说明你的连接字符串是什么样的吗? - curtisk
是的,它是本地的。 它位于 "C:\solutionname\projectname\bin\debug\sdfname.sdf"。 连接字符串为:"file:\C:\solutionname\projectname\bin\debug\sdfname.sdf"。 - George
2个回答

1
我不明白你为什么需要 "file://"。它应该可以正常工作,没有那个也没问题。确实看起来有点奇怪,你用的是 file:\ 而不是 file://。

也许我没有解释清楚... “file:\”前缀是自动添加的 - 我没有添加它。这就是为什么异常被抛出(不是由我,而是由框架)。 我不知道为什么会发生这种情况。 我希望找到该前缀的起源并了解为什么会发生这种情况,但现在我甚至可以在运行时直接删除它,然后调用引发异常的函数。不幸的是,连接字符串是私有的,因此我无法访问它。 - George
你确实表达得很清楚,只是我没有仔细阅读。你的连接字符串应该是:"Data Source=c:\db.sdf"。 - Bryan

0

由于Windows CE没有“当前目录”,实现通常会将当前运行的程序集位置作为要查找的目录。在桌面上,Assembly.GetExecutingAssembly().GetName().CodeBase返回的字符串包括该方案前缀。


什么是Assembly.GetexecutingAssembly().GetName().CodeBase?我该如何解决这个问题? - George
如果您输入"sdfname.sdf",那么打开该文件的进程将必须解析它为"c:\somefolder\sdfname.sdf"。在Windows机器上,开发人员通常假设该文件在当前文件夹中,但由于Windows CE设备没有"当前文件夹",因此CE开发人员通常使用程序集的路径。 - C.Evenhuis
在Windows CE上,此函数返回一个路径,您可以直接使用它来打开文件,而在完整的框架中会添加一个方案前缀(file:\\)。我不知道相对路径转绝对路径的过程发生在哪里,如果是在第三方库中,您可以查看是否有完整框架版本可供使用,而不是CF版本。 - C.Evenhuis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接