确定Linq to SQL连接用户帐户

时间:2014-03-25 16:01:03

标签: c# linq linq-to-sql

我正在使用 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.List 1..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 重命名。如果业务层可执行文件目录中已存在配置文件,请打开该文件,复制数据层中的连接字符串信息进入它。现在业务层也可以使用!

1 个答案:

答案 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)

我希望其中一个想法可以帮助你。