我正在使用Linq到SQL&.NET 4.0建立到本地SQL 2008 Express Server的连接。我收到以下错误。
未处理的异常:System.Data.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);
我在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-无需重新编译,但现在它连接到相同的DB,该数据库还是WinXP计算机的本地文件。我正在以控制台应用程序(在命令行上)和Windows 7和Windows XP上的Admin身份运行它。作为管理员,我可以验证我是否可以使用SQL Server Management Studio以及SQLCMD.exe成功连接到本地数据库。完整的例外是:
未处理的异常:System.Data.SqlClient.SqlException:登录失败。登录名
来自不受信任的域,不能与Windows身份验证一起使用。
在System.Data.SqlClient.SqlInternalConnection.OnError(SqlException异常
,布尔值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(Boolean enlis
确定)
在System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo
serverInfo,字符串newPassword,布尔值ignoreSniOpenTimeout,TimeoutTimer timeo
ut,SqlConnection owningObject)
在System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(ServerInfo
serverInfo,字符串newPassword,布尔值redirectedUserInstance,SqlConnection ow
ningObject,SqlConnectionString connectionOptions,TimeoutTimer超时)
在System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(SqlConnecti
关于owningObject,TimeoutTimer超时,SqlConnectionString connectionOptions,St
响铃newPassword,布尔型redirectedUserInstance)
在System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdent
身份,SqlConnectionString connectionOptions,对象providerInfo,字符串
newPassword,SqlConnection owningObject,布尔型redirectedUserInstance)
在System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOp
选项,对象poolGroupProviderInfo,DbConnectionPool池,DbConnection
owningConnection)
在System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConn
选择owningConnection,DbConnectionPool池,DbConnectionOptions选项)
在System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection拥有
宾语)
在System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection o
wningObject)
在System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection拥有
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
服务使用者)
在System.Data.Linq.SqlClient.SqlProvider.get_IsSqlCe()
在System.Data.Linq.SqlClient.SqlProvider.InitializeProviderMode()
在System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider中
.Execute(表达查询)
在System.Data.Linq.Table
1.GetEnumerator()
at System.Data.Linq.Table
1.System.Collections.Generic.IEnumerable.GetEnumerator()
在System.Collections.Generic.List
1..ctor(IEnumerable
1集合中)在System.Linq.Enumerable.ToList [TSource](IEnumerable`1源)处
在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
,但是如果从同一解决方案(其中是DBML文件)的DataLayer项目中运行代码,则可以使用相同的代码。有人可以阐明如何处理此信任问题吗?可能的解决方案:
非常抱歉,但对于那些想要摘要的人来说:上面发布的三行C#代码可在数据层中使用,而不能在业务层中使用,即您得到上面提到的
Exception
。这不是连接问题,因为数据层可以连接。解决方案是首先进入数据层可执行目录,即
/bin/Debug
或/bin/Release
并找到可执行文件的配置文件,即其格式为ExeName.exe.config
。该文件具有连接字符串信息。接下来,进入业务层可执行文件目录,并查看是否有可执行文件的配置文件。如果否,则只需在此处复制数据层配置文件,然后根据格式BusinessLayerExeName.exe.config
重命名。如果业务层可执行文件目录中已经存在配置文件,请打开该文件,将连接字符串信息从数据层复制到其中。现在,业务层也可以工作!
最佳答案
您的问题有点模糊,但是我有一些想法供您尝试。
查看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,在听起来可能类似的情况下有所帮助。 Referencing DBML project in Console App (.net)
我希望这些想法之一对您有所帮助。
关于c# - 确定Linq to SQL连接用户帐户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22639956/