2012-06-24 27 views
5

Najwyraźniej używanie AttachDbFilename i user instance w łańcuchu połączenia jest złym sposobem na połączenie z bazą danych. Używam programu SQL Server Express na moim komputerze lokalnym i wszystko działa dobrze. Ale jaki jest właściwy sposób łączenia się z serwerem SQL?Jaki jest problem z AttachDbFilename

Dzięki za wyjaśnienie.

Odpowiedz

11

Używanie User Instance oznacza, że ​​SQL Server tworzy specjalną kopię tego pliku bazy danych do użytku przez twój program. Jeśli masz dwa różne programy używające tego samego ciągu połączenia, otrzymają one dwie całkowicie różne kopie bazy danych. Prowadzi to do zamieszania, ponieważ ludzie będą testować aktualizację danych za pomocą swojego programu, następnie łączą się z inną kopią swojej bazy danych w Management Studio i narzekają, że ich aktualizacja nie działa. To wysyła ich przez wadliwą serię kroków na dzikich gęś próbujących rozwiązać problem.

This article goes into more depth about how to use this feature, ale uwaga na pierwszą uwagę: Funkcja User Instance została wycofana. W SQL Server 2012, preferowane są alternatywne (w tej kolejności, IMHO):

  1. Tworzenie lub dołączyć bazę danych do rzeczywistego wystąpienia programu SQL Server. Twój ciąg połączenia będzie po prostu musiał podać nazwę instancji, nazwę bazy danych i dane uwierzytelniające. Nie będzie miksu, ponieważ program Management Studio, Visual Studio i twoje programy będą się łączyć z pojedynczą kopią bazy danych.

  2. Użyj SqlLocalDb do rozwoju lokalnego. Wierzę, że wskazałem ci wczoraj ten artykuł: "Getting Started with SQL Server 2012 Express LocalDB."

  3. Użyj SQL Server Compact. Najbardziej podoba mi się ta opcja, ponieważ funkcjonalność i składnia nie są takie same - więc niekoniecznie zapewni ci pełną funkcjonalność, którą ostatecznie chcesz wdrożyć. Compact Edition is also deprecated, so there's that.

Oczywiście jeśli używasz wersji < SQL Server 2012, SqlLocalDb nie jest opcją - tak powinno być stworzenie prawdziwej bazy danych i przy użyciu tego konsekwentnie. Podaję tylko opcję Compact dla kompletności - myślę, że może to być prawie tak zły pomysł jak używanie AttachDbFileName.

EDIT: Mam blogu na ten temat tutaj:

+0

ah ok, teraz rozumiem: usunąłem parametr UserInstance = true z ciągu połączenia i wygląda na to, że działa dobrze. A co z parametrem AttachDbFileName? Jakie jest niebezpieczeństwo z tym? – frenchie

+0

Dlaczego chcesz dołączyć bazę danych tylko wtedy, gdy program jej używa? Jeśli podłączysz bazę danych * do serwera SQL Server *, możesz uzyskać do niego dostęp za pośrednictwem Management Studio lub innych programów w dowolnym momencie. Co zyskujesz, dołączając go tylko w czasie wykonywania, gdy aktywnie się rozwijasz? Jeśli chodzi o użycie zasobów, możesz ręcznie zatrzymać usługę SQL Server. –

+0

Nie byłem pewien, co robi to polecenie. W tej chwili mam to: Data Source =. \ SQLEXPRESS; AttachDbFilename = | DataDirectory | \ MySiteDB.mdf. Jak powinienem przepisać go, aby uniknąć wykonywania przywiązania do środowiska wykonawczego, a zamiast tego przejść bezpośrednio do serwera SQL? Załączam plik DB do serwera SQL, dołączając go do Management studio. Czy to jest dobre? – frenchie

-1

W przypadku ktoś miał problem.

Przy zakładaniu bazy danych z ciągu połączenia zawierającego AttachDBFile z SQLEXPRESS, zauważyłem to połączenie było wyłącznie dla aplikacji ASP.NET, który został z wykorzystaniem bazy danych. Połączenie zablokowało dostęp do wszystkich innych procesów na poziomie pliku, gdy zostało wykonane z System.Data.SqlClient jako dostawca.

W celu zapewnienia połączenia być współdzielone z innymi procesami zamiast korzystania z bazy danych, aby określić nazwę bazy danych w ciągu połączenia przykład lub połączenia ciąg:

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

, gdzie PlaCliGen jest nazwą (lub nazwa logiczna), dzięki której serwer SQLEXPRESS zna bazę danych.

Po połączeniu z bazą danych za pomocą AttachDBFile podając ścieżkę do pliku .mdf (namely : replacing DataBase = PlacliGen by AttachDBFile = c:\vs\placligen\app_data\placligen.mdf) plik został podłączony wyłącznie i żaden inny proces nie mógł połączyć się z bazą danych.