1

与 2 名开发人员一起处理 Windows 窗体应用程序项目。|DataDirectory|通过 tfs 共享源代码,由于每台 PC 的数据目录不同,已将数据目录路径替换为关键字。( C:\Users\username\Documents\Visual Studio 20XX\Projects\solution folder\solution folder)

已在连接字符串中使用此相对路径作为

class ConnectionManager
{
        public static SqlConnection dbcon()
        {
            string connectionString = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\systemdb.mdf;Integrated Security=True";
            SqlConnection con = new SqlConnection(connectionString);
            con.Open();
            return con;
        }
}

问题是当 C# 应用程序将数据发送到 SQL Server 数据库时,它显示数据已添加到数据库中,但实际上数据库没有更新。

发现连接字符串与.mdf位于根文件夹中的文件与.mdf位于bin\debug. SELECT使用|DataDirectory|. INSERT 查询在使用时不起作用|DataDirectory|,但在使用实际目录路径而不是|DataDirectory|.

如何解决这个问题呢?要求是:

  1. 从 tfs 获取最新版本后,每次都不需要修改目录路径,需要|DataDirectory|始终保持不变。

  2. 连接字符串不应与.mdf根文件夹和文件夹中的文件发生冲突bin\debug

4

1 回答 1

0

整个AttachDbFileName=方法是有缺陷的——充其量!在 Visual Studio 中运行您的应用程序时,它将围绕.mdf文件进行复制(从您的App_Data目录到输出目录 - 通常.\bin\debug是您的应用程序运行的位置),并且很可能,您的INSERT工作正常 - 但您只是看错了 . mdf文件到底!

如果您想坚持使用这种方法,请尝试在myConnection.Close()调用上设置断点 - 然后.mdf使用 SQL Server Mgmt Studio Express 检查文件 - 我几乎可以肯定您的数据在那里。

我认为真正的解决方案是

  1. 安装 SQL Server Express(反正你已经完成了)

  2. 安装 SQL Server Management Studio Express

  3. 在SSMS Express中创建您的数据库,给它一个逻辑名称(例如systemdb

  4. 使用它的逻辑数据库名称(在服务器上创建它时给出)连接到它——不要乱用物理数据库文件和用户实例。在这种情况下,您的连接字符串将类似于:

    Data Source=.\\SQLEXPRESS;Database=systemdb;Integrated Security=True
    

    其他一切都和以前完全一样......

另请参阅 Aaron Bertrand 的优秀博文 踢坏习惯:使用 AttachDbFileName了解更多背景信息。

于 2016-05-02T04:20:26.067 回答