我正在使用 Linq to SQL & .NET 4.0 以建立与本地 SQL 2008 Express Server 的连接。我收到以下错误。
未处理的异常:System.Data.SqlClient.SqlException:登录失败。登录 来自不受信任的域,不能与Windows身份验证一起使用。
为了调试这个,我想知道我是否可以确定我的代码用来连接 SQL Express服务器的用户帐户。
我的代码: 这是使用控制台应用程序执行的第一行代码。
AMSCMDataContext db = new AMSCMDataContext();
var t = db.CMHomePageStatusLogs.ToList(); //Causes above Exception
Logger.Log(LogType.TRACE | LogType.CONSOLE, "Count: {0}", t.Count);
App Config 中的连接字符串:
<connectionStrings>
<add name="AMS_CM_DL.Properties.Settings.AMSCMDBConnectionString"
connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=AMSCMDB;Integrated Security=True"
providerName="System.Data.SqlClient" />
</connectionStrings>
背景:
我最初是在 Windows 7 上开发此代码的。然后我将代码移动到 Windows XP - 无需重新编译,但它现在连接到同一个数据库,再次本地到 WinXP 机器。我将此作为控制台应用 (在命令行上)以及 Windows 7 上的管理和< strong> Windows XP 。作为管理员,我可以使用 SQL Server Management Studio 以及 SQLCMD.exe 验证我是否可以成功连接到本地数据库。完整的例外是:
未处理的异常:System.Data.SqlClient.SqlException:登录失败。登录 来自不受信任的域,不能与Windows身份验证一起使用。 在System.Data.SqlClient.SqlInternalConnection.OnError(SqlException异常 ,Boolean breakConnection) 在System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() 在System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior,SqlCommand cm) dHandler,SqlDataReader dataStream,BulkCopySimpleResultSet bulkCopyHandler,Tds ParserStateObject stateObj) 在System.Data.SqlClient.SqlInternalConnectionTds.CompleteLogin(布尔enlis TOK) 在System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo,String newPassword,Boolean ignoreSniOpenTimeout,TimeoutTimer timeo ut,SqlConnection owningObject) 在System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(ServerInfo serverInfo,String newPassword,Boolean redirectedUserInstance,SqlConnection ow ningObject,SqlConnectionString connectionOptions,TimeoutTimer超时) 在System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(SqlConnecti on owningObject,TimeoutTimer timeout,SqlConnectionString connectionOptions,St ring newPassword,Boolean redirectedUserInstance) 在System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdent ity identity,SqlConnectionString connectionOptions,Object providerInfo,String newPassword,SqlConnection owningObject,Boolean redirectedUserInstance) 在System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOp tions选项,Object poolGroupProviderInfo,DbConnectionPool池,DbConnection owningConnection) 在System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConn) ection owningConnection,DbConnectionPool池,DbConnectionOptions选项) 在System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection拥有 宾语) 在System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection o wningObject) 在System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection ownin GObject的) 在System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection ow ningConnection) 在System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection ou terConnection,DbConnectionFactory connectionFactory) 在System.Data.SqlClient.SqlConnection.Open() 在System.Data.Linq.SqlClient.SqlConnectionManager.UseConnection(IConnectionU ser用户) 在System.Data.Linq.SqlClient.SqlProvider.get_IsSqlCe() 在System.Data.Linq.SqlClient.SqlProvider.InitializeProviderMode() 在System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider .Execute(表达式查询) at System.Data.Linq.Table
1.GetEnumerator() at System.Data.Linq.Table
1.System.Collections.Generic.IEnumerable.G etEnumerator() 在System.Collections.Generic.List1..ctor(IEnumerable
1个集合) 在System.Linq.Enumerable.ToList [TSource](IEnumerable`1 source) 在C:\ Users \ UserName \ docu中的Handler.Handler.Main(String [] args) ments \ visual studio 2010 \ Projects \ AMS_CM_ETC \ Handler \ Handler.cs:第64行
更新
我想补充一点,我的 Windows 7 计算机与公司域相关联。另一方面, Windows XP 计算机不属于任何域。我不认为这会影响,不是吗?虽然我在 Win 7 机器上编译并且我在 Win XP 上运行,但我没有看到这个公司域在代码中的任何位置编码。
更新2:
我能够进行更多调试。首先,我在 Win XP 计算机上创建了一个简单的 VS解决方案。我放置了 DBML (LINQ to SQL)文件,并将上述代码放在Main
文件的Program.cs
方法中。这很有效。
接下来,我想指出,虽然上面发布的代码是我原来的解决方案中首先执行的代码,但解决方案要复杂得多。实际上,上述代码是从我的业务层项目执行的,而AMSCMDataContext
是在 DataLayer项目中定义的。然后,我将 DataLayer项目设为控制台应用程序,并将上述代码放入 DataLayer Main方法中>。这很有效。
总结一下:
如果我从较大的解决方案的业务层项目中调用代码,我会得到上述exception
,但如果我从 DataLayer运行它,则相同的代码将起作用项目相同的解决方案(DBML文件所在的位置)。有人可以说明如何处理这个信任问题吗?
可能的解决方案:
我很抱歉写了这么多,但对于那些想要摘要的人:上面发布的三行C#代码在数据层中工作,但不在业务层中工作即您获得上述Exception
。这不是连接问题,因为数据层可以连接。
解决方案是首先进入数据层可执行目录,即/bin/Debug
或/bin/Release
,然后找到的配置文件 >可执行即它的格式为ExeName.exe.config
。此文件包含连接字符串信息。接下来,进入业务层可执行文件目录,查看是否有可执行文件的配置文件。如果不是,则只需在此处复制数据层配置文件,然后根据格式BusinessLayerExeName.exe.config
重命名。如果业务层可执行文件目录中已存在配置文件,请打开该文件,复制数据层中的连接字符串信息进入它。现在业务层也可以使用!
答案 0 :(得分:1)
你的问题有点模糊,但我有一些想法供你试用。
查看dbml文件中的属性: 也许您没有选择您认为正在选择的连接字符串。在app.config中指定连接字符串并不意味着您的应用程序正在使用该字符串。右键单击dbml上的属性,然后查看正在使用的连接字符串。
App.config vs web.config等: 您确定使用dll的项目不会覆盖您的app.config设置吗?我认为这与你的情况无关,但我想我会提到。
调试它: 删除数据库连接开头的调试点。看看你想要建立什么样的联系。
跟踪它: 如果您具有足够的权限,请在本地(或其他数据库)上启动跟踪,然后启动您的应用程序。您应该看到连接进来并可以检查连接请求。
域名与本地用户: 如果您在两种情况下都尝试连接到本地数据库,我认为您的凭据不是您的问题。但是,如果您尝试连接到属于域的命名数据库,则可能无法(在您的win xp计算机上)轻松地与本地用户进行此操作。
数据库名称的差异: 是否有可能在Win 7机器上安装了完整版本的SQL Server(可能有一个默认的数据库实例名称,如MSSQLSERVER),但在Win XP机器上安装了SQL Express(可能有一个默认的数据库实例名称为SQLEXPRESS) 。或者您可能在Win7计算机上有一个命名实例(MYAPPDB可以生成一个),但在本地计算机上只有默认实例名称?
项目类型: 此堆栈溢出问题报告说,从.NET Framework客户端配置文件更改为.NET Framework有助于听起来像一个潜在的类似情况。 Referencing DBML project in Console App (.net)
我希望其中一个想法可以帮助你。