【问题标题】:Publish ASP.NET project with .mdf database使用 .mdf 数据库发布 ASP.NET 项目
【发布时间】:2014-04-30 08:18:38
【问题描述】:

我有一个 ASP.NET 项目,它使用存储在 App_Data 文件夹中的本地 .mdf 数据库。我通常将网站本地发布到我的桌面,然后获取所有文件并将它们上传到 asp.net 服务器。

上传成功后,由于某些原因无法访问数据库。

我已经在我的 web.config 中包含了数据库的连接字符串

    <connectionStrings> 
    <clear />
      <add name="LocalSqlServer" connectionString="Data Source=(LocalDB)\v11.0;AttachDBFilename=|DataDirectory|database.mdf;database=database;Integrated Security=True;User Instance=False;Context Connection=False;" providerName="System.Data.SqlClient"/>  
      </connectionStrings>

我没有看到一些在线解决方案声明将 LocalDB)\v11.0 更改为 .\SQLEXPRESS;在连接字符串中,但这不起作用。

请告知如何正确上传项目中的数据库并设置对它的正确访问权限。

当我尝试打开数据库连接时,我收到以下错误消息

System.Security.SecurityException:请求失败。在 System.Security.CodeAccessSecurityEngine.Check(Object demand, StackCrawlMark& stackMark, Boolean isPermSet) 在 System.Security.CodeAccessSecurityEngine.Check(PermissionSet permSet, StackCrawlMark& stackMark) 在 System.Security.PermissionSet.Demand() 在 System.Data.LocalDBAPI.DemandLocalDBPermissions() 在 System.Data.LocalDBAPI.CreateLocalDBInstance(String 实例) 在 System.Data.SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternalConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Boolean encrypt, Boolean trustServerCert,在 System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin (ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean ignoreSniOpenTimeout, TimeoutTimer timeout, Boolean withFailover) 在 System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(ServerInfo serverInfo, String newPassword、SecureString newSecurePassword、Boolean redirectedUserInstance、SqlConnectionString connectionOptions、SqlCredential credential、TimeoutTimer timeout)在 System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(TimeoutTimer 超时、SqlConnectionString connectionOptions、SqlCredential credential、String newPa ssword, SecureString newSecurePassword, Boolean redirectedUserInstance) 在 System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions) 在 System.Data.SqlClient System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool pool, DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions) at System.Data.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions) .ProviderBase.DbConnectionPool.CreateObject(DbConnectionOptions userOptions) 在 System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnectionOptions userOptions) 在 System.Data System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject,TaskCompletionSource1 retry, DbConnectionOptions userOptions, DbConnectionInternal&amp; connection) at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource1 重试,DbConnectionOptions userOptions,DbConnectionInternal connection) at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource1 retry, DbConnectionOptions userOptions) at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource1 retry) at System.Data.SqlClient.SqlConnection.Open() at Database.establishConnection() 失败的操作是: Demand 第一个失败的权限类型是:System.Security.PermissionSet 失败的程序集的区域是:MyComputer

【问题讨论】:

  • “无法访问数据库”是什么意思?有错误信息吗?
  • 错误信息如上。
  • 我知道使用 SQL Server 您需要授予对 ASPNET 用户帐户的访问权限。你能用 Access 做同样的事情吗?我对访问不熟悉,但是一旦部署您的 Windows 帐户就不再与集成安全性一起使用。它需要是 ASPNET 用户帐户。
  • 嗨,马特,不明白你在说什么!
  • 您在连接字符串中设置了Integrated Security=True,这意味着您的Web 应用程序需要在可以访问数据库的同一帐户下运行。如果这是共享主机,则可能不是这种情况,因为 Web 服务器不会使用您的帐户凭据运行。您需要调查您的主机提供的数据库选项,并利用他们的产品之一。

标签: c# asp.net database visual-studio-2010


【解决方案1】:

为什么不将数据库发布为脚本而不是 .mdf,它比使用 .mdf 更稳定!

使用SQL管理工作室image

【讨论】:

    【解决方案2】:

    SQLExpress 是 SQL Server 限制版(2008R2 之后存储容量为 10GB,R2 之前版本为 2-4GB)

    而且由于它是服务器用于满足您需要设置密码、用户、角色等的安全要求。除了这些要求之外,对于 ASP.NET 或通常在 WWW 解决方案上,许多主机提供商不支持自动附加您的数据库他们的数据库服务器的解决方案..

    所以当您选择在您的 Web 项目中使用 SQLExpress 时,

    您可以将创建脚本(创建数据库、表、安全要求、存储过程、视图等等)复制到服务器端并在服务器端运行这些脚本 - 就像 thealghabban 建议的那样 -

    或从服务器端手动创建所有需求(供应商有这些实现的设置页面)

    或向您的提供商询问他们是否允许附加,以决定您的方式

    {

    通过附加代码,就像您已经尝试在您的连接中一样 字符串 - 带有 AttachDBFileName 语句 - 您需要添加到您的 连接字符串“UserInstance”语句并将其设置为“true” 不假!

    由于连接字符串中不推荐使用“UserInstance”语句, 可能是您的主机提供商不允许使用此声明。 因此,至少对于这种弃用,您需要询问您的提供商

    }

    如果你仍然想在这里使用 SQLExpress,你就是一个 WWW 连接字符串的例子:

    Server=SQLServerNameorIPAddressofYourHostProvider\SQLServerInstanceNameofYourHostProvider;Database=yourDatabaseName;User Id=yourUserName;Password=yourPassword;
    

    如果我们假设我们的 Hosting Provider 是 Stackoverflow,那么我们的连接字符串可能是这样的:

    // 那里证明了stackoverflow.com 提供商在publicservers 子域和该子域MSSQL2008R2 目录下提供数据库服务器

    Server=publicservers.stackoverflow.com/MSSQL2008R2\stackExpress;Database=myDB;User Id=theUser;
    Password=WhateverPassword;
    

    Local V11 几乎是一个新的解决方案(如果自 2011 年第四季度以来我没有错),它像 SQLCE(.sdf 扩展数据库文件)一样嵌入,或者作为旧的时尚访问数据库或其他嵌入式解决方案,但具有很好的存储容量的改进(访问最大 2 gb,.sdf db 文件最大 1 gb):它是 SQL Server Express => 10GB。

    要使用 Local DB,如果您的 VS 版本不是 +2012,您需要复制所需的 Dll,您可以在 ProgramFiles 目录下或在操作系统中安装 LocalDB 的位置找到这些 Dll。在与 VS 一起安装的 VS2012 和 2013 本地数据库中。但无论如何,请检查您项目的 bin 文件中是否有 Local Express 的本地复制 dll..

    对于 Local DB,它的运行时要求是您的目标框架应至少为 v 4.0.2.. 还要检查这一点..

    【讨论】:

      【解决方案3】:

      发现类似问题http://www.codeproject.com/Questions/677651/How-to-publish-mdf-database-file-into-a-asp-net-we 它有一个解决方案,希望对您有所帮助。

      【讨论】:

        【解决方案4】:

        你可以试试这个。

           string constr=@"DataSource=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\yourdatabase.mdf;Integrated Security=True;User Instance=True;";
           public SqlConnection myConnection = new SqlConnection(constr);
        

        或者试试这个

        <connectionStrings>
        
        <add name="myConnection" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\yourdatabse.mdf;Integrated Security=True;User Instance=True" providerName="System.Data.SqlClient"/>
        
        </connectionStrings>
        

        希望能帮到你!!

        【讨论】:

          【解决方案5】:

          您当前的数据源 (LocalDB)\v11.0 是一个特殊的、孤立的 SQLServer 2012 实例,它的名称很奇怪,它被命名为 V11.0。 (localDb) 与您计算机上的 SqlExpresss 或任何其他 SqlServer 的实例不同。但是,它们都可以存在于同一系统上而不会发生冲突,即使 SqlServer 的版本号不同。 当您安装 SQLExpress 或常规 SS 或更改任何功能时,您可以选择启用 LocalDb。您也可以将其作为单独的软件包从 MS 下载。 可能出现的问题是版本不匹配。我已经看到使用 (LocalDb)\MSSQLLocalDB 作为通用名称而不是版本号的建议。 对于 SqlExpress,名称字符串可能类似于 JPLWIN7\SQLEXPRESS 其中 JPLWIN7 是我自己的 Windows 机器或 192.168.1.13\sqlexpress 在您本地局域网上的机器上等

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多