发布期间未复制数据库文件,因此安装的应用程序抛出异常



我正在开发一个包含基于服务的基于数据的c# windows窗体应用程序。当我测试我的应用程序时,它的数据库工作正常,但在发布和安装程序后,当程序试图打开sqlconnection时,出现此错误:

System.Data.SqlClient。SqlException (0x80131904):试图附加一个自动命名的数据库文件C:UsersBehnamAppDataLocalApps2.0Data 5 xvovxv1.3vg M5T04ZK7.QBJ tahl . . tion_45c3791d6509222d_0001.0000_be1c7cc05811ecf0 AppData TahlilGar.mdf数据失败了。存在同名的数据库,或者指定的文件不存在

这是我的连接字符串:

<add name="BA" connectionString="Data Source=(LocalDB)v11.0;AttachDbFilename=|DataDirectory|AppDataTahlilGar.mdf;
Integrated Security=True;"providerName="System.Data.SqlClient" />

我也试过:User Instance= True;,但结果是:

连接用户时不允许使用用户实例登录标志SQL Server的实例。连接将被关闭。

如何解决这个问题?


编辑:我检查了提到的路径,没有我的。mdf文件。所以我从我的项目中复制了它,之后它工作得很好。现在为什么我的MDF文件不复制时发布和安装在预期的路径。

当使用click一次发布windows窗体应用程序时,我们可以包括或排除文件以及您的项目。MSDN链接解释如何添加文件

https://msdn.microsoft.com/en-us/library/kzy0fky2.aspx

注意:只有当数据库被添加到项目

时,它才会出现在应用程序文件对话框中

您的连接字符串提到SQL Server Express实例已在开发机器中使用:

<add name="BA" connectionString="Data Source=(LocalDB)v11.0;AttachDbFilename=|DataDirectory|AppDataTahlilGar.mdf; Integrated Security=True;"providerName="System.Data.SqlClient" />

假设您的部署机器使用完整版本的SQL Server实例,从代码自动生成数据库在部署上下文中不起作用,因为User Instance特性仅在Express版本中支持。

下面是解决问题的步骤:

  1. 修改你的连接字符串,删除用户实例部分(删除User Instance=True,如果有的话)

  2. 手动运行aspnet_regsql.exe在部署机上附加和注册数据库/MDF文件(如果你还没有这样做)

  3. 如果您已经将数据库迁移到部署机中的SQL Server实例,请确保您应该更改数据源路径并添加初始目录(即您的DB名称),如:

    <add name="BA" connectionString="Data Source=SERVERNAME;Initial Catalog=TahlilGar;Persist Security Info=True;User ID=DBUserID;Password=DBPassword;Integrated Security=True;"providerName="System.Data.SqlClient" />
    

AttachDbFilename=|DataDirectory|AppDataTahlilGar.mdf部分工作时,数据库已经存在于本地机器和用户帐户当前使用的实例授予适当的权限来附加您的MDF文件。

Adam Tuliper补充说明:

运行IIS的帐户可能存在问题在无法访问该文件的情况下。

为网络服务分配完全权限给该文件夹帐户。

你可以暂时试试'everyone',看看是否能解决问题。然后从这里往回算。

也要确保它没有被其他web服务器(进程)使用资源管理器/sysinternals可以告诉你)。

引用:

尝试为.mdf文件附加自动命名数据库失败

此版本的SQL Server不支持用户实例登录标志。连接将被关闭

最新更新