2012-06-24 39 views
5

Rõ ràng, sử dụng AttachDbFilenameuser instance trong chuỗi kết nối của bạn là một cách không tốt để kết nối với DB. Tôi đang sử dụng máy chủ SQL thể hiện trên máy địa phương của tôi và tất cả dường như làm việc tốt. Nhưng cách thích hợp để kết nối với máy chủ SQL là gì?vấn đề với AttachDbFilename

Cảm ơn bạn đã giải thích.

Trả lời

11

Sử dụng User Instance có nghĩa là SQL Server đang tạo bản sao đặc biệt của tệp cơ sở dữ liệu đó để chương trình của bạn sử dụng. Nếu bạn có hai chương trình khác nhau sử dụng cùng một chuỗi kết nối đó, chúng sẽ nhận được hai bản sao hoàn toàn khác nhau của cơ sở dữ liệu. Điều này dẫn đến sự nhầm lẫn của vì mọi người sẽ kiểm tra cập nhật dữ liệu bằng chương trình của họ, sau đó kết nối với một bản sao khác của cơ sở dữ liệu trong Management Studio và phàn nàn rằng bản cập nhật của họ không hoạt động. Điều này sẽ gửi chúng thông qua một loạt các bước đuổi theo ngỗng hoang dã thiếu sót cố gắng khắc phục sự cố không đúng.

This article goes into more depth about how to use this feature, nhưng chú ý đến ghi chú đầu tiên: tính năng User Instance không được dùng nữa. Trong SQL Server 2012, các lựa chọn thay thế được ưu tiên là (theo thứ tự này, IMHO):

  1. Tạo hoặc đính kèm cơ sở dữ liệu của bạn vào thực tế SQL Server. Chuỗi kết nối của bạn sẽ chỉ cần xác định tên cá thể, tên cơ sở dữ liệu và thông tin xác thực. Sẽ không có sự trộn lẫn nào như Management Studio, Visual Studio và (các) chương trình của bạn sẽ kết nối với một bản sao của cơ sở dữ liệu.

  2. Sử dụng SqlLocalDb để phát triển địa phương. Tôi tin rằng tôi đã chỉ cho bạn bài viết này ngày hôm qua: "Getting Started with SQL Server 2012 Express LocalDB".

  3. Sử dụng SQL Server Compact. Tôi thích tùy chọn này ít nhất vì chức năng và cú pháp không giống nhau - do đó, nó không nhất thiết phải cung cấp cho bạn tất cả chức năng mà bạn sẽ muốn triển khai cuối cùng. Compact Edition is also deprecated, so there's that.

Dĩ nhiên nếu bạn đang sử dụng một phiên bản < SQL Server 2012, SqlLocalDb không phải là một lựa chọn - vì vậy bạn nên tạo ra một cơ sở dữ liệu thực tế và sử dụng rằng cách nhất quán. Tôi chỉ đề cập đến tùy chọn Compact để hoàn thành - tôi nghĩ rằng có thể gần như là một ý tưởng tồi tệ khi sử dụng AttachDbFileName.

EDIT: tôi đã viết blog về vấn đề này ở đây:

+0

ah ok, bây giờ tôi nhận được nó: Tôi đã xóa tham số UserInstance = true khỏi chuỗi kết nối và có vẻ như hoạt động tốt. Và những gì về tham số AttachDbFileName? Nguy hiểm với cái đó là gì? – frenchie

+0

Tại sao bạn chỉ muốn đính kèm cơ sở dữ liệu trong khi chương trình của bạn đang sử dụng nó? Nếu bạn đính kèm cơ sở dữ liệu * vào máy chủ SQL của bạn * thì bạn có thể truy cập nó thông qua Management Studio hoặc các chương trình khác bất cứ lúc nào. Bạn đang đạt được gì bằng cách chỉ gắn nó vào thời gian chạy trong khi bạn đang tích cực phát triển? Nếu đó là về sử dụng tài nguyên, bạn có thể tự dừng dịch vụ SQL Server. –

+0

Tôi không biết lệnh đang làm gì. Ngay bây giờ, tôi có điều này: Data Source =. \ SQLEXPRESS; AttachDbFilename = | DataDirectory | \ MySiteDB.mdf. Làm thế nào tôi nên viết lại nó để tôi tránh làm các tập tin đính kèm vào thời gian chạy và thay vì đi thẳng đến máy chủ SQL? Tôi đính kèm tệp DB vào máy chủ SQL bằng cách đính kèm nó trong phòng quản lý. Cái này tốt không? – frenchie

-1

Trong trường hợp ai đó có vấn đề.

Khi đính kèm cơ sở dữ liệu bằng chuỗi kết nối có chứa AttachDBFile với SQLEXPRESS, tôi nhận thấy kết nối này là độc quyền đối với ứng dụng ASP.NET đang sử dụng cơ sở dữ liệu. Kết nối đã chặn quyền truy cập vào tất cả các quy trình khác ở cấp tệp khi được thực hiện với System.Data.SqlClient làm nhà cung cấp.

Để đảm bảo kết nối được chia sẻ với các quá trình khác thay vì sử dụng cơ sở dữ liệu ghi rõ tên cơ sở dữ liệu trong chuỗi kết nối của bạn Ví dụ hoặc kết nối chuỗi:

Data Source=.\SQLEXPRESS;DataBase=PlaCliGen;User ID=XXX;password=ZZZ; Connect Timeout=30 

, nơi PlaCliGen là tên (hoặc tên logic) mà máy chủ SQLEXPRESS biết cơ sở dữ liệu.

Bằng cách kết nối với cơ sở dữ liệu với AttachDBFile, hãy cung cấp đường dẫn đến tệp .mdf (namely : replacing DataBase = PlacliGen by AttachDBFile = c:\vs\placligen\app_data\placligen.mdf) Tệp được kết nối độc quyền và không có quy trình nào khác có thể kết nối với cơ sở dữ liệu.