我正在使用Linq进行SQL&。NET 4.0连接到本地SQL 2008 Express服务器。我得到以下错误。
未处理的异常:系统。数据SqlClient。SqlException:登录失败。登录来自不受信任的域,无法与Windows身份验证一起使用。
为了对此进行调试,我想知道是否可以确定代码用于连接到SQL Express Server的用户帐户。
我的代码:这是使用控制台应用程序执行的第一行代码。
AMSCMDataContext db = new AMSCMDataContext();
var t = db.CMHomePageStatusLogs.ToList(); //Causes above Exception
Logger.Log(LogType.TRACE | LogType.CONSOLE, "Count: {0}", t.Count);
应用程序配置中的我的连接字符串:
<connectionStrings>
<add name="AMS_CM_DL.Properties.Settings.AMSCMDBConnectionString"
connectionString="Data Source=.SQLEXPRESS;Initial Catalog=AMSCMDB;Integrated Security=True"
providerName="System.Data.SqlClient" />
</connectionStrings>
背景:
我最初是在Windows7上开发此代码的。然后,我将代码移动到WindowsXP,而不重新编译它,但它现在连接到同一个数据库,该数据库也是WinXP机器的本地数据库。我作为控制台应用程序(在命令行上)和Windows 7和Windows XP上的管理员运行此程序。作为一名管理员,我可以验证我是否可以使用SQL Server Management Studio以及SQLCMD.exe成功连接到本地数据库。完整的异常是:
未处理的异常:系统。数据SqlClient。SqlException:登录失败。登录来自不受信任的域,无法与Windows身份验证一起使用。在系统中。数据SqlClient。SqlInternalConnection。OnError(SqlException异常,布尔breakConnection)在系统中。数据SqlClient。TdsParser。ThrowExceptionAndWarning()在系统中。数据SqlClient。TdsParser。Run(RunBehavior RunBehavior,SqlCommand cmdHandler,SqlDataReader数据流,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj)在系统中。数据SqlClient。Sql内部连接Tds。CompleteLogin(布尔enlistOK)在系统中。数据SqlClient。Sql内部连接Tds。尝试登录(服务器信息serverInfo,字符串newPassword,布尔ignoreSniOpenTimeout,TimeoutTimer-timeout,SqlConnection owningObject)在系统中。数据SqlClient。Sql内部连接Tds。LoginoFailover(服务器信息serverInfo,字符串newPassword,布尔重定向UserInstance,SqlConnection owningObject、SqlConnectionString connectionOptions、TimeoutTimer超时)在系统中。数据SqlClient。Sql内部连接Tds。OpenLoginList(SqlConnection owningObject,TimeoutTimer超时,SqlConnectionString connectionOptions,St环形newPassword,布尔重定向UserInstance)在系统中。数据SqlClient。Sql内部连接Tds。。ctor(DbConnectionPoolIdentity标识,SqlConnectionString连接选项,对象提供者信息,字符串newPassword、SqlConnection owningObject、布尔重定向的UserInstance)在系统中。数据SqlClient。SqlConnectionFactory。CreateConnection(DbConnectionOp选项,对象池GroupProviderInfo,DbConnectionPool池,DbConnectionowningConnection)在系统中。数据ProviderBase。DbConnectionFactory。创建池连接(DbConn部分owningConnection、DbConnectionPool池、DbConnectionOptions选项)在系统中。数据ProviderBase。DbConnectionPool。CreateObject(拥有DbConnection对象)在系统中。数据ProviderBase。DbConnectionPool。UserCreateRequest(DbConnection owningObject)在系统中。数据ProviderBase。DbConnectionPool。GetConnection(DbConnection owningObject)在系统中。数据ProviderBase。DbConnectionFactory。GetConnection(DbConnection owningConnection)在系统中。数据ProviderBase。DbConnectionClosed。OpenConnection(DbConnection outerConnection,DbConnectionFactory connectionFactory)在系统中。数据SqlClient。SqlConnection。打开()在系统中。数据林克。SqlClient。SqlConnectionManager。使用连接(IConnectionUser用户)在系统中。数据林克。SqlClient。SqlProvider.get_IsSqlCe()在系统中。数据林克。SqlClient。SqlProvider。InitializeProviderMode()在系统中。数据林克。SqlClient。SqlProvider。系统数据林克。提供商。I提供者.Execute(表达式查询)在系统中。数据林克。表
1.GetEnumerator() at System.Data.Linq.Table
1.系统.集合.通用.IEnumerable.GetEnumerator()在系统中。集合。通用的列出1..ctor(IEnumerable
1集合)在系统中。林克。可枚举。ToList[TSource](IEnumerable `1 source)在Handler。处理程序。C:\Users\UserName\docu中的Main(String[]args)ments\visual studio 2010\Projects\AMS_CM_ETC\Handler\Handler.cs:line 64
更新:
我想补充一点,我的Windows 7计算机与公司域相关联。另一方面,Windows XP计算机不在任何域下。我认为这不应该影响,是吗?尽管我在Win7机器上编译,并且在WinXP上运行,但我在代码中没有看到这个公司域被编码。
更新2:
我能够进行更多的调试。首先,我在WinXP机器上创建了一个简单的VS解决方案。我放了一个DBML(LINQ to SQL)文件,并将上述代码放在Program.cs
文件的Main
方法中。这起到了作用。
接下来,我想指出的是,虽然上面发布的代码是第一个在我的原始解决方案中执行的,但方案务层项目中执行的,而AMSCMDataContext
是在数据层项目定义的。然后,我将DataLayer项目制作成Console应用程序,并将上述代码放入DataLayer中一个类的Main
方法中。这是有效的。
所以总结一下:
如果我从更大的解决方案的业务层项目调用代码,我会得到上面的exception
,但如果我从同一解决方案的DataLayer项目(DBML文件所在)运行相同的代码,也会起作用。有人能告诉我们如何处理这个信任问题吗?
可能的解决方案:
很抱歉写了这么多,但对于那些想要总结的人来说:上面发布的三行C#代码在数据层中工作,但在BusinessLayer不工作,即您得到了上面提到的Exception
。这不是连接问题,因为数据层可以连接。
解决方案是首先进入数据层可执行目录,即/bin/Debug
或/bin/Release
,并找到可运行文件的配置文件,即其形式为ExeName.exe.config
。此文件包含连接字符串信息。接下来,进入BusinessLayer可执行目录,查看executable是否有Config文件。如果没有,则只需将数据层配置文件复制到此处,然后根据格式BusinessLayerExeName.exe.config
重命名。如果业务层可执行目录中已有配置文件,请打开该文件,将数据层中的连接字符串信息复制到其中。现在Business Layer也可以工作了!
你的问题有点模糊,但我有一些想法供你尝试。
查看dbml文件上的属性:也许您没有选择您认为要选择的连接字符串。在app.config中指定连接字符串并不意味着您的应用程序正在使用该字符串。右键单击dbml上的属性,然后查看正在使用的连接字符串。
App.config与web.config等:你确定你的app.config设置不会被使用dll的项目覆盖吗?我认为这与你的情况无关,但我想提一下。
调试它:在打开数据库连接时删除调试点。查看您试图建立的连接。
追踪它:在本地数据库(或其他数据库,如果您有足够的权限)上启动跟踪,然后启动应用程序。您应该看到连接进入,并且可以检查连接请求。
域与本地用户:如果您在这两种情况下都试图连接到本地数据库,我认为您的凭据不是问题所在。然而,如果你试图连接到一个属于域的命名数据库,你可能无法(轻松地)在win-xp机器上与本地用户连接。
数据库名称的差异:是否可能您在Win 7计算机上安装了完整版本的SQL Server(可能具有MSSQLSERVER等默认数据库实例名称),但在Win XP计算机上安装SQL Express(可能具有SQLEXPRESS的默认数据库实例名)。或者,您在Win7机器上有一个命名实例(MYAPPDB组成),但在本地机器上只有默认实例名称?
项目类型:此堆栈溢出问题报告称,从.NET Framework客户端配置文件更改为.NET Framework有助于解决听起来可能类似的情况。在控制台应用程序(.net)中引用DBML项目
我希望其中一个想法能帮助你。