【问题标题】:Cannot connect to LocalDB无法连接到 LocalDB
【发布时间】:2016-08-10 18:34:23
【问题描述】:

我正在尝试运行一个 IIS 托管的应用程序(以电影数据库的形式)来自学如何设计一个 3 层架构程序:MVC 应用程序、WCF 服务、SQL Server DB。由于我没有完整 SQL Server 的许可证密钥,我决定使用 LocalDB 并使用 WCF 服务来包装我的存储过程。这是我第一次使用 LocalDB,在连接到我的实例 v13.0 时遇到问题。

我的问题:

在我的一生中,我无法让我在 VS 中的项目连接到 LocalDB 实例。我不断收到以下错误:

与 SQL Server 建立连接时出现与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。 (提供者:SQL 网络接口,错误:50 - 发生本地数据库运行时错误。指定的 LocalDB 实例不存在。

我的连接字符串(来自 Web.config):

<connectionStrings>
    <add name="MovieDB" connectionString="Data Source=(localdb)\v13.0;Initial Catalog=MovieDB;Integrated Security=True;AttachDbFilename=|DataDirectory|\MovieDB.mdf" />
</connectionStrings>

使用 sqlcmd 连接它并运行查询运行良好:

Visual Studio SQL Server 对象资源管理器可以正常连接:

连接字符串,当它到达有问题的行时被 Visual Studio 转义,所以我知道连接字符串没有被错误地转义:

"Data Source=(localdb)\\v13.0;Initial Catalog=MovieDB;Integrated Security=True;AttachDbFilename=|DataDirectory|\\MovieDB.mdf"

我尝试按照本指南(Part 1Part 2)进行操作,但图像至少在 2016 年 4 月 18 日已损坏,因此我无法完全理解我应该做什么。我只能得到上述错误,因为我将应用程序池标识更改为 LocalSystem:

当应用程序池在 ApplicationPoolIdentity 身份下运行时,我收到此错误:

与 SQL Server 建立连接时出现与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。 (提供者:SQL 网络接口,错误:50 - 发生本地数据库运行时错误。无法获取本地应用程序数据路径。很可能未加载用户配置文件。如果在 IIS 下执行 LocalDB,请确保为当前用户。

我什至修改了 C:\windows\system32\inetsrv\config\applicationHost.config 文件来强制加载配置文件。还是什么都没有。

<applicationPools>
    <add name="DefaultAppPool" />
    <add name="Classic .NET AppPool" managedRuntimeVersion="v2.0" managedPipelineMode="Classic" />
    <add name=".NET v2.0 Classic" managedRuntimeVersion="v2.0" managedPipelineMode="Classic" />
    <add name=".NET v2.0" managedRuntimeVersion="v2.0" />
    <add name=".NET v4.5 Classic" managedRuntimeVersion="v4.0" managedPipelineMode="Classic" />
    <add name=".NET v4.5" managedRuntimeVersion="v4.0">
        <!-- I added this, before it was an empty node -->
        <processModel identityType="ApplicationPoolIdentity" loadUserProfile="true" setProfileEnvironment="true" />
    </add>
    <applicationPoolDefaults managedRuntimeVersion="v4.0">
        <!-- This was already here -->
        <processModel identityType="ApplicationPoolIdentity" loadUserProfile="true" setProfileEnvironment="false" />
    </applicationPoolDefaults>
</applicationPools>

我的应用程序在“.NET 4.5”应用程序池下运行

我的代码:

页面加载并调用此服务以获取数据库中的电影列表:

[ServiceContract]
public interface IMovieDBService
{
    // ...

    [OperationContract]
    List<Movie> GetMovies(int actorID);

    // ...
}

public class MovieDBService : IMovieDBService
{
    // ...

    public List<Movie> GetMovies(int actorID = 0)
    {
        var output = new List<Movie>();
        using (var connection = DBTools.GetConnection(MovieDBConnectionName)) // Does not get past here; MovieDBConnection = "MovieDB"
        {
            var parameters = new List<SqlParameter>
            {
                new SqlParameter("@actorID", actorID)
            };

            using (var reader = connection.ExecuteStoredProcedure("GetMovies", parameters))
            {
                while (reader.Read())
                {
                    output.Add(new Movie
                    {
                        ID = reader.GetInt32("ID"),
                        Title = reader.GetString("Title"),
                        Year = reader.GetInt16("Year"),
                        Genre = GetGenre(reader.GetInt32("GenreID"))
                    });
                }
            }
        }

        return output;
    }

    // ...
}

我的 DBTools 项目中的问题方法:

public static SqlConnection GetConnection(string connectionName)
    {
        var connection = new SqlConnection();
        var connectionString = ConfigurationManager.ConnectionStrings[connectionName];
        if (connectionString != null)
        {
            connection.ConnectionString = connectionString.ConnectionString;
            connection.Open(); // breaks here

            return connection;
        }

        return null;
    }

我只能假设问题与身份验证有关,或者 IIS 托管的应用程序正在尝试连接到 LocalDB 用户进程,但我尝试按照其他问题的说明进行操作但没有成功(可能因为没有理解真正的问题)。我很茫然……

【问题讨论】:

  • LocalDB 用于开发,并且特定于尝试运行它的用户。在 ASP.NET 环境中切换 SQL Express 可能会更好。
  • @Chris Bowe 嘿,克里斯。我有同样的错误。我想知道你是怎么解决的?
  • 我最终放弃了尝试使用 LocalDB。我只是在本地使用 SQL Server 和新创建的数据库,并让 EF 在新站点中首次注册时创建用户表。

标签: c# sql-server wcf iis localdb


【解决方案1】:

试试这个:在您的 applicationhost 文件中尝试将 processModel identityType 更改为 SpecificUser 并包括用户名和密码。或将您的应用程序池标识更改为有权访问数据库的用户。当您以应用程序池身份运行时,根据您作为本地系统运行的屏幕截图 - 这是一个预定义的本地帐户,而 sqlcmd 以您登录的用户身份运行。

【讨论】:

  • 我不得不将我的更改为“LocalSystem”。
【解决方案2】:

您是否检查过 web.config 中的 entityFramework 标签?

参数值应该是您的实例名称。 连接到该本地数据库实例的示例是:

【讨论】:

    【解决方案3】:

    问题是您的 IIS 应用程序池帐户看不到 localdb 实例,因为只有创建该实例的帐户才能访问它,这很可能是您的个人用户帐户。您可以通过运行以下命令与您机器上的其他用户(例如 IIS 应用程序池帐户)共享它:

    sqllocaldb share v13.0 v13.0_shared
    

    我们共享v13.0 实例并将共享实例命名为v13.0_shared。然后您将连接字符串的Data Source 部分更改为:

    Data Source=(localdb)\.\v13.0_shared
    

    注意实例名称前的 .\。这表明您正在寻找连接到共享实例。

    现在您的所有 IIS 应用程序池都将能够连接到 localdb 实例,而无需为每个应用程序池配置权限。

    【讨论】:

      猜你喜欢
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 2017-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      相关资源
      最近更新 更多