背景
我有一个Windows窗体应用程序(.NET 3.5)。数据库连接字符串存储在app.config
部分的appSettings
文件中,名称为“connectionString”。
<appSettings>
<add key="connectionString" value="Data Source=REDACTED;Initial Catalog=REDACTED; UID=REDACTED; pwd=REDACTED;" />
</appSettings>
使用以下代码在数据库查询代码中访问:
dbConnString = ConfigurationSettings.AppSettings["connectionString"];
设置
因为我遇到了问题,所以我用MessageBox.Show()
语句填充了应用程序的启动和适用部分,每个语句都提供了有关我在程序中的位置以及变量值的相关信息。
我有一个创建和MSI文件的安装程序项目。我把那个文件复制到客户端的机器上然后安装它(如果已经安装了应用程序,我先卸载它)。
问题
我看到一些非常奇怪的行为......
Data Source=REDACTED;Initial Catalog=REDACTED; UID=REDACTED; pwd=REDACTED;
)并将应用程序连接到数据库而不会出现问题。请注意,连接字符串使用的是SQL Server身份验证(而不是Windows身份验证)。Data Source=REDACTED;Integrated Security=SSPI;Initial Catalog=REDACTED
。请注意,这是使用Windows身份验证尝试连接到数据库。app.config
文件,应用程序仍会运行(呵呵???怎么样??)但有一些区别:connectionString
,并且出现错误`对象引用未设置为对象的实例。'connectionString
文件中更改了连接字符串(app.config
)的名称。所以我把它命名为connectionStringDude
。现在,当我以上述两种方式运行它时,“管理员运行”版本再次起作用,但是另一个版本无法通过该名称找到连接字符串,并且应用程序获得一个`对象引用未设置为实例一个对象。'。所以在我看来,应用程序可能会使用一些层次结构来查找连接字符串connectionString
。如果框架在app.config中找不到连接字符串,它会检查machine.config,依此类推,直到它找到或不找到它。
我正试图弄清楚我的头发。为什么连接字符串CHANGE仅基于“以管理员身份运行”?
而且要清楚,相同的代码行:
dbConnString = ConfigurationSettings.AppSettings["connectionString"];
在dbConnString中返回一个完全不同的值,具体取决于我是否以管理员身份运行。
答案 0 :(得分:1)
使用Process Monitor查看Windows从哪里加载应用程序设置。
.NET应用程序中的配置设置保存在单独的app.exe.config
文件中。你可能在某个地方有一个迷路文件。
使用UAC文件虚拟化,该文件可能位于:
C:\Users\Richard\AppData\Local\VirtualStore\Program Files(x86)\RichardWare\SuperCoolapp.exe.config
使用进程监视器来监视应用程序的所有文件访问,尤其是*.config
个文件。