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

标签 c# asp.net razor visual-studio-2015 mdf

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

作为 C# 的中级水平和 HTML 等方面的中级水平,我想我应该使用 Razor 网页 来制作一个简单的网站。我希望创建一个数据库,其中包含每个页面的所有标题和描述的列表。然后我可以轻松地更改所有实例和对每个 html 文件的引用以保持 DRY。但是除了 SQL 表中的异常,我似乎什么也得不到。

我尝试使用 Visual Studio 2015:

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

    <connectionStrings>
        <add name="Database" connectionString="Data Source=|DataDirectory|\Database.mdf" providerName="System.Data.SqlClient" />
    </connectionStrings>
    
  4. 确保所有 WebMatrix dll 包都随 NuGet 安装。
  5. 创建 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>
    
  6. 在 Microsoft Edge 中运行

大约 10 秒后,该网站出现在本地主机上。但是表中有结果,只是输出中有一个异常(exception):

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 Server。在这种情况下,您刚刚指定了一个文件路径。您需要一个数据库服务器来实际提供该 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 Server 实例。

不幸的是,我现在没有一个带有附加 mdf 文件的运行示例,但我相信这样的东西会为你完成这项工作,我从 MSDN's article on connection strings 中抓取了这个字符串。

<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 名称和密码进行连接。

关于c# - 如何在 Visual Studio 中使用 Razor 网页设置数据库并连接到它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39321846/

相关文章:

c# - Blazor 组件 (Radzen) 中的 OnAfterRender OnAfterRenderAsync

asp.net - 为什么使用 HTTP 动词?

c# - 在 SelectedIndexChange 上传递一个值

asp.net - 压缩ASP.Net脚本资源

asp.net-mvc-3 - ASP.NET MVC 3、Razor View 和可移植区域

c# - Razor runco​​mpile 不允许我调试

c# - 在仅限 .NET-4 的系统上的 GAC 中使用面向 .NET-2.0 的 COM DLL

c# - 如何从 C# 设置文件夹 ACL

c# - 委托(delegate)的组成(功能陷阱)

c# - Nancy Razor 部分 View 不在 Release模式下呈现