当我将解决方案移动到另一个目录时,当我使用“AttachDbFileName”时,为什么会出现“数据库已存在”?

时间:2013-04-18 18:36:08

标签: c# .net sql-server

我有一个使用数据库TopScores.mdf的应用程序JigSaw,它不包含在项目中。我想要做的是让应用程序在应用程序的文件夹中找到数据库。因此,例如,如果我将.exe文件和数据库文件从调试文件夹移动到桌面,则应用程序应使用桌面数据库,而不是在调试文件夹中搜索它。

如果我让他们在调试文件夹中没有问题,并且建立了与数据库的连接,但是当我把它们放在桌面上时,我得到了这个:

  

您的应用程序中发生了未处理的异常。如果单击“继续”,应用程序将忽略此错误并尝试继续。数据库'D:\ Programing \ Projects Visual Studio 2010 \ JigSaw \ JigSaw \ bin \ Debug \ TopScores.mdf'已经存在。选择其他数据库名称。无法将文件'C:\ Users \ Addy \ Desktop \ Jigsaw \ TopScores.mdf'附加为数据库TopScores.mdf

我的连接字符串是:

string appPath = Path.GetDirectoryName(Application.ExecutablePath);
string connString = @"server  =.\sqlexpress; Database=TopScores.mdf; trusted_connection=TRUE; AttachDbFileName= "+@appPath+@"\TopScores.mdf";
conn = new SqlConnection(connString);

抱歉我的英语不好:(

3 个答案:

答案 0 :(得分:5)

这种情况正在发生,因为您在连接时未使用User Instance=true;。您实际上告诉SQL Server将数据库从您首次加载它的目录中附加到正在运行的SQL实例。

从正在运行的SQL实例手动分离数据库,将连接字符串更改为使用User Instance=true;,从Debug文件夹运行它,然后从Desktop运行它,并且你会看到成功。

答案 1 :(得分:3)

更改连接字符串中的设置" Database = TopScores.mdf"对于不同的东西,说:"数据库= TopScores_brand_new_connection"不要在任何文件/数据库服务器中创建/删除/重命名文件。仅在连接字符串中执行此操作。不要添加点,扩展等。

答案 2 :(得分:-1)

只需重命名.mdf文件...例如。从MNGMT.mdf到M_1(你想要的东西)。更改你的联系人字符串...希望所以它会帮助你..在我的情况下,它在其他电脑和我的电脑上正确执行..只需将你的.mdf文件复制到你的项目..

string dbPath = Path.GetDirectoryName(Application.ExecutablePath) + "\\M_1.mdf";
string myServer = Environment.MachineName;
DataTable servers = SqlDataSourceEnumerator.Instance.GetDataSources();
            for (int i = 0; i < servers.Rows.Count; i++)
            {
                if (myServer == servers.Rows[i]["ServerName"].ToString()) ///// used to get the servers in the local machine////
                {
                    if ((servers.Rows[i]["InstanceName"] as string) != null)
                        servername = (servers.Rows[i]["ServerName"] + "\\" + servers.Rows[i]["InstanceName"]);
                    else
                        servername = ""+servers.Rows[i]["ServerName"];
                }
            }
connetionString = "Data Source=" + servername + ";AttachDbFilename=" + dbPath + ";Integrated Security=True;Pooling=False;User Instance=True";