在 Visual Studio 中如何使用 Razor 网页设置数据库并连接到它?

How do you setup a database and connect to it using Razor web pages in Visual Studio?

我看了又看,但无法找到可行的解决方案。

作为 C# 的中级水平和 HTML 之类的东西,我想我会玩弄 Razor Web Pages 并制作一个简单的网站。我希望创建一个数据库,其中包含每个页面的所有标题和描述的列表。然后我可以轻松更改所有实例和对每个 html 文件的引用以保持 DRY。但是除了 SQL table.

的例外情况,我似乎什么也得不到

我尝试使用 Visual Studio 2015:

  1. 用简单的 table
  2. 创建 Database.mdf
  3. 使用服务器资源管理器连接到数据库
  4. 将 connectionString 添加到 Web.config

    <connectionStrings>
        <add name="Database" connectionString="Data Source=|DataDirectory|\Database.mdf" providerName="System.Data.SqlClient" />
    </connectionStrings>
    
  5. 确保所有 WebMatrix dll 包都随 NuGet 安装。
  6. 创建default.cshtml

    @using WebMatrix.Data
    @using System.Data.SqlClient
    <Html><body> etc...
    @{
        var db = Database.Open("Database");
        try
            {
                db.Query("SELECT * FROM Table");
            }
            catch (SqlException odbcEx)
            {
                System.Diagnostics.Debug.WriteLine("It is an Exception: " + odbcEx);
            }
      }
    </body><Html>
    
  7. Microsoft Edge 中的
  8. 运行

大约 10 秒后,该网站出现在本地主机上。但是 table 有结果,只是输出中有一个例外:

It is an Exception: System.Data.SqlClient.SqlException (0x80131904): A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: SQL Network Interfaces, error: 26 - Error Locating Server/Instance Specified)
   at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData, DbConnectionPool pool, String accessToken, Boolean applyTransientFaultHandling)
   at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions)
   at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool pool, DbConnection owningObject, DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions)
   at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection)
   at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection)
   at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection)
   at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection)
   at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection)
   at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
   at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
   at System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry)
   at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
   at System.Data.SqlClient.SqlConnection.Open()
   at WebMatrix.Data.Database.EnsureConnectionOpen()
   at WebMatrix.Data.Database.<QueryInternal>d__0.MoveNext()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at WebMatrix.Data.Database.Query(String commandText, Object[] parameters)
   at ASP._Page_Default_cshtml.Execute() in c:\Users\Person\OneDrive\Documents\Website\Default.cshtml:line 29

我在网上搜索了一下,发现由于 WebMatrix 已经过时,Visual Studio 的解决方案并不多。据我所知,目前 Razor 似乎并未得到广泛使用。

我尝试将 connectionStrings 更改为一些不同的东西,但没有成功。我怎样才能让它工作?

修复:

我认为问题出在您的连接字符串上。连接字符串 需要指定 SQL 服务器。在这种情况下,您刚刚指定了一个文件路径。您需要一个数据库服务器来实际提供该 mdf 文件。

This SO question 应该向您展示如何从现有服务器资源管理器连接获取连接字符串:

Then you can see the connection string in the properties of the connected server (choose the connection and press F4 or Alt+Enter or choose Properties on the right click menu).

解释:

这里解释了为什么您当前的连接字符串可能无法按您预期的方式工作:

很可能当您通过服务器资源管理器“连接”到您的 mdf 文件时,它正在使用 LocalDb。 LocalDb 是一种随需应变的服务,随 Visual Studio 一起提供,允许您轻松开发应用程序,就像您尝试做的那样,而无需 运行 Sql 服务器的完整实例。

不幸的是,我现在没有 运行 示例和附加的 mdf 文件,但我相信这样的东西可以为您完成工作,我从 [=17= 中获取了这个字符串]

<add name="ConnectionStringName"
    providerName="System.Data.SqlClient"
    connectionString="Data Source=(LocalDB)\v11.0;AttachDbFileName=|DataDirectory|\DatabaseFileName.mdf;InitialCatalog=DatabaseName;Integrated Security=True;MultipleActiveResultSets=True" />

这里有几个重要的部分:

  1. Data Source=(LocalDB)\v11.0 - 这指定要使用的按需启动 localdb 实例。请注意,此字符串中的版本 v11.0 因安装而异,您应该为您的字符串找到正确的版本。 (你应该可以在下面更容易地找到它)
  2. AttachDbFilename=|DataDirectory|\DatabaseFilename.mdf - 这告诉 LocalDb 加载该数据库文件。或者,localdb 将数据库文件保存在您的用户主目录或某处的 AppData 目录中。
  3. Integrated Security=true - 连接字符串需要身份验证方案。两个可能的选项是 Integrated Security,它使用您的 windows 凭据来尝试访问您的数据库,这适用于许多事情,LocalDb 就是其中之一。另一种选择是使用 sql 身份验证和 sql 名称和密码进行连接。