c# - 确定Linq to SQL连接用户帐户

标签 c# linq linq-to-sql

我正在使用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.G
  etEnumerator()
     在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/

相关文章:

c# - 如何将大文本文件拆分为较小的文件?

c# - C# 4.0 以后应该有哪些特性来鼓励从 Java 转换?

sql-server - 从 LINQ to SQL 迁移到 DocumentDB 的好方法是什么?

c# - 动态构建 LINQ-To-Entities Where 子句

c# - 如何使用存储过程在 LINQ to SQL 中使用事务?

c# - COM Word --> 获取所有内容控件

c# - VS 2015 ASP.NET vNext 中的 Ajax.BeginForm 丢失了吗?

vb.net - Linq 到 Sql : Multiple left outer joins

c# - 奇怪的对象空引用异常

c# - LINQ 表达式返回 null