2011-10-15 44 views
5

Tôi gặp vấn đề và học được điều gì đó cùng một lúc ....Cơ sở dữ liệu đã tồn tại. Chọn tên khác bằng cách sử dụng CreateDatabase()

Tôi đã tạo một DBML từ cơ sở dữ liệu máy chủ hiện có.

Từ DBML, tôi muốn tạo cơ sở dữ liệu cục bộ (tệp .mdf). Tôi đã tạo cơ sở dữ liệu using DataContext.CreateDatabase("C:\xxxx.mdf"). Sau đó, tôi quyết định xóa nó (thủ công, đó là một điều xấu rõ ràng) bởi vì khi tôi cố gắng tạo lại cơ sở dữ liệu với cùng tên (eventhough các tập tin được xóa), tôi nhận được lỗi Cơ sở dữ liệu đã tồn tại. Chọn một tên khác bằng cách sử dụng CreateDatabase()

Tôi đã thử xem qua sổ đăng ký, không may mắn ... Tôi đã thử tìm kiếm toàn bộ ổ cứng cho tệp .. không may mắn.

Sau khi googling, tôi thấy rằng bạn xóa một cơ sở dữ liệu đã được tạo ra với CreateDatabase() với DeleteDatabase() .... Sau đó, bạn có thể tạo lại cơ sở dữ liệu.

Vấn đề là bây giờ tôi vẫn không thể tạo lại cơ sở dữ liệu cũ vì hệ thống cho rằng tên đã tồn tại.

Có cách nào để thoát khỏi những reminents của file databse cũ "không tồn tại"

+0

khi bạn xóa nó bằng tay cậu xóa cả MDF và LDF? Ngoài ra, bạn nhận được lỗi nào khi bạn gọi hàm DeleteDatabase() ngay bây giờ? –

+0

Khi tôi thử DeleteDatabase(), tôi nhận được điều này: ** System.Data.SqlClient.SqlException: Một nỗ lực để đính kèm một cơ sở dữ liệu tự động đặt tên cho tệp C: \ xxxx.mdf không thành công. Cơ sở dữ liệu có cùng tên tồn tại hoặc không thể mở tệp được chỉ định hoặc nó nằm trên chia sẻ UNC .. ** –

Trả lời

7

Bạn cần phải mở master cơ sở dữ liệu thông qua server explorer trong Visual Studio (Add New Connection + Chọn master cơ sở dữ liệu) sau đó thêm New query, nhập Drop Database xxxx và thực hiện. Bạn cũng có thể sử dụng Sql Server Management Studio.

+1

Tôi cũng gặp phải vấn đề tương tự. Bạn có thể làm những gì bạn đề xuất theo chương trình không? – remi

+0

Trong trường hợp ai đó đang tự hỏi điều tương tự, có, bạn có thể làm điều này theo chương trình. Chỉ cần kết nối với cơ sở dữ liệu trong mã của bạn, sau đó gửi câu lệnh SQL thích hợp để thực thi ('drop database xxxx'). – Daniel

3

Một giải pháp (thông qua here) là sử dụng SSEUtil để tách các db hiện:

try 
{ 
    // open a connection to the database for test 
} 
catch (SystemException ex) // Change exception type based on your underlying data provider 
{ 
    if (ex.Message.ToLower().Contains("already exists. choose a different database name")) 
    { 
     var match = Regex.Match(ex.Message, "database '(.*)' already exists.", 
      RegexOptions.IgnoreCase); 

     if (match.Success) 
     { 
      String dbFileName = match.Groups[1].Value; 
      Process p = new Process(); 
      p.StartInfo.UseShellExecute = true; 
      p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
      p.StartInfo.FileName = String.Format("{0}/Tools/SSEUtil.exe", 
       Environment.CurrentDirectory); 
      p.StartInfo.WorkingDirectory = Environment.CurrentDirectory; 
      p.StartInfo.Arguments = String.Format("-d \"{0}\"", dbFileName); 

      p.Start(); 
     } 
    } 
} 
+0

+1 Tôi đã gặp phải vấn đề này khi lập trình triển khai cơ sở dữ liệu SQL Server với các lớp LINQ to SQL. Không chắc chắn lý do tại sao cơ sở dữ liệu vẫn được đính kèm sau khi ứng dụng tồn tại, tuy nhiên công cụ này quản lý để tách cơ sở dữ liệu. Nếu bất cứ ai có ý tưởng làm thế nào để ngăn chặn vấn đề này ở nơi đầu tiên và do đó loại bỏ sự cần thiết cho giải pháp này nó sẽ là tuyệt vời. Cảm ơn các giải pháp bằng cách này. –

-1

Tôi cũng thực sự có vấn đề này như vậy. Trước đây, tôi đã xóa (cắt) cơ sở dữ liệu trong mysqlserver2012 và sao chép nó vào thư mục ứng dụng của tôi. Sau khi tôi thực hiện ứng dụng của mình, tôi nhận được lỗi này và giải quyết lỗi bằng cách xóa phần Initial Catalog của Chuỗi kết nối của tôi.

chuỗi kết nối cuối cùng của bạn nên tìm một cái gì đó như thế này:

Data Source=<your server name>;AttachDbFileName=database path\databaseName.mdf;Integrated Security=True" + ";User Instance=True" + ";Context Connection=False;

Các vấn đề liên quan