[C# i MsSQL] Problem z połączeniami (multi)

0

Witam
Piszę aplikacje opartą o bazę danych MsSQL.
Chciałbym łączyć się z bazą z wielu różnych miejsc - jak np. aplikacji, działającej non-stop, stron www (które mogą być wywoływane przez użytkowników) a także innych programów wywołujących się co jakiś czas.
Teraz pytanie, jak tego dokonać?
Połączenie z bazą danych z poziomu strony - nie jest problemem, ale tylko wtedy gdy baza jest Online. Gry korzystam z C#, baza z kolei musi być offline (inaczej mam Login Failed (!), a używam dobrych danych, jestem tego pewny. Co więcej, błąd pojawia się tylko przy TableAdapterach, tj. gdy w opcji DataSource wybieram Object i dalej "Microsoft SQL Server Database File". Wybieram plik bazy (.mdf), do którego nie moge się połączyc bo "jest uzywany przez inny proces" (znów tego nie rozumiem). Jeśli np. w PHP mam opcję mssql_connect która łączy się z serwerem, a potem select_db która wybiera bazę, dlaczego nie mogę tego zrobić tableadapterami? (Metody Fill i Get są bardzo pomocne).
Co dziwne, poniższy kod:

SqlConnection c = new SqlConnection();
            SqlConnectionStringBuilder cs = new SqlConnectionStringBuilder();
            cs.DataSource = ".\\SERWER";
            cs.IntegratedSecurity = true;
            cs.InitialCatalog = "NazwaBazy";
            c.ConnectionString = cs.ToString();
            c.Open();

działa bez zarzutów, a TableAdapter (który, myślałem, działa na podobnej zasadzie) już nie bardzo (Login Failed, jak wspomniałem). TableAdapter tez korzysta z Windows <ort>Autentification </ort>(Integrated Security). Co jest nie tak?
Jak można rozwiązać ten problem?
Dzięki z góry.

0
  1. Staraj sie operowac na transakcjach,
  2. Jesli chcesz cos odczytac to otwieraj tabele tylko w trybie read only (we wszystkich aplikacjach), trybu read-write uzywaj tylko gdy to konieczne.
0

To mi się na niewiele zda.
PHP wyrzuca mi error, gdy włączona jest aplikacja exe mająca połączenie z bazą danych
Operating system error 32: "32(Proces nie może uzyskać dostępu do pliku, ponieważ jest on używany przez inny proces.)"

0

a czy sam mssql nie ma jakichs opcji zwiazanych z pula polaczen, ktore moze jednoczesnie obsluzyc ?? Troche strzelam, bo nie mialem takiego przypadku do tej pory, a w weekend nie chce kodowac

0

Nie wiem, czy dobrze rozumiem...

Problemowy napisał(a)

Co więcej, błąd pojawia się tylko przy TableAdapterach, tj. gdy w opcji DataSource wybieram Object i dalej "Microsoft SQL Server Database File".

To chcesz się połączyć z plikiem, czy z serwerem?

Problemowy napisał(a)

Wybieram plik bazy (.mdf), do którego nie moge się połączyc bo "jest uzywany przez inny proces" (znów tego nie rozumiem).

A tym tajemniczym procesem nie jest czasem serwer? Tak na logikę...

0

Nie, serwer nie korzysta ze wszystkich plików baz danych, on je prawdopodbnie otwiera, gdy potrzebne jest połączenie (inaczej to byloby zupelnie nieopłacalne).
Co do pierwszego pytania - łączę się z serwerem, nie z plikiem. Ale jak mogę połączyc się TableAdapterem właśnie z serwerem i bazą danych? O to mi chodzi od samego początku.
Dzięki z góry.

0

Nie, serwer nie korzysta ze wszystkich plików baz danych, on je prawdopodbnie otwiera, gdy potrzebne jest połączenie (inaczej to byloby zupelnie nieopłacalne).

Spróbuj skopiować pliki z bazami danych. Da się? Nie.
I to jest właśnie logiczne - skoro to jest SERWER, to ma dawać dostęp do baz danych zawsze, gdy pracuje. Bez względu na to, czy w danym momencie ktoś chce z nich skorzystać, czy nie.

Co do pierwszego pytania - łączę się z serwerem, nie z plikiem.

Co więcej, błąd pojawia się tylko przy TableAdapterach, tj. gdy w opcji DataSource wybieram Object i dalej "Microsoft SQL Server Database File".

Z tego co ja rozumiem, to jednak z plikiem.

Ale jak mogę połączyc się TableAdapterem właśnie z serwerem i bazą danych?

Data -> Add New Data Source -> wybierasz Database, a nie Object -> Next -> wybierasz istniejące połączenie, albo robisz nowe (wybierając serwer i bazę) -> Next -> Next -> wybierasz obiekty, z którymi chcesz się połączyć -> Finish
Więcej info tutaj:
http://msdn.microsoft.com/en-us/library/fxk9yw1t(VS.80).aspx
http://msdn.microsoft.com/en-us/library/s4yys16a(VS.80).aspx

0

Dziękuję za pomoc, ale:
To create a data connection to a SQL Server database

In the Choose Data Source dialog box, select Microsoft SQL Server, and then click OK
to z MSDN.
A teraz:
user image
Niestety nie mam takiej opcji (Sql Server Express i VS C# Express).
Może coś po prostu omijam, przepraszam, ale naprawde nie umiem sobie poradzic z tym ;p.

0

To jak nie idzie w ten sposób, to zrób pośrednika, np fabryke obiektów, hibernate, webservice lub <ort>przezuc </ort>sie na server sql a nie pojedynczy plik, np Oracle, MySQL, Postgre

0
Problemowy napisał(a)

Niestety nie mam takiej opcji (Sql Server Express i VS C# Express).

A no tak - ograniczenie wersji Express - nie ma tu takich wizardów.

Zrób to sobie ręcznie - będzie szybciej, mniej kodu i jeszcze lepiej będziesz nad tym panował.

DataTable dt = new DataTable();
SqlDataAdapter da = new SqlDataAdapter();
SqlConnection conn = new SqlConnection(@"Data Source=SERWER\SQLEXPRESS;Initial Catalog=Nazwa_Bazy;Integrated Security=True");
da.SelectCommand = new SqlCommand("SELECT * FROM Tabela", conn);
da.Fill(dt);
dataGridView1.DataSource = dt.DefaultView;

To jest kod wypełniający DataGridView danymi z tabeli. Analogicznie robi się resztę operacji, poczytaj :)
0

A gdy będe chciał pobrac jeden wiersz z bazy? Metoda Fill będzie strasznie obciążała cały proces dodatkowo duplikując wiersze.

0

Chyba nie bardziej, niż te wizardowe adaptery...

Jak chcesz sobie czytać po wierszu, to używaj SQLDataReader.

0

Fill() również używa SqlDataReader czytając zwrócone wiersze do końca - w takiej sytuacji wiadomo chyba co będzie szybsze.

Poza tym, ktoś już podał dobrą odpowiedź - nie operuj na pliku z bazą. Wstaw sobie connectionString ręcznie, i działaj przez mssql server, który ma system MARS obsługujący wiele połączeń na raz.

Co do pytania o jeden wiersz: kwestia zmodyfikowania SQL query.

1 użytkowników online, w tym zalogowanych: 0, gości: 1