Transakcja z N-zapytań a zapytania zparametryzowane w pętli...

0

Cześć! Mam pewien problem.
W dużym skrócie pobieram przez WCF dane o sprzęcie komputerowym użytkownika. Mam porobione encje (m.in.) DyskTwardy,Procesor, Pamiec

ilość zapytań może się różnić w zależności od ilości dysków twardych, a przynajmniej ja to tak projektuje, np. tabela DyskTwardy w bazie wygląda tak: (idZgloszenia, Nazwa_dysku, Pojemnosc, NumerSeryjny). Więc jeżeli ktoś ma 2 dyski twarde, to automatycznie wykonają się 2 zapytania

Problem mam następujący...

tutaj metoda która tworzy zapytania dla dysków twardych (jako parametry przyjmuje idZglsozenia i Listę dysków twardych)

  public List<SqlCommand> PutHardDrives(int idZgloszenia, List<HardDrive> hdList)
        {
            var scList = new List<SqlCommand>();
            foreach (var hd in hdList)
            {
                var sc = new SqlCommand();
                sc.CommandText = "Insert into CompInfo_Hardrive Values (@idZgloszenia,@Model,@Size,@Serial)";
                sc.Parameters.AddWithValue("@idZgloszenia", idZgloszenia);
                sc.Parameters.AddWithValue("@Model", hd.Model);
                sc.Parameters.AddWithValue("@Size", hd.Hdsize);
                sc.Parameters.AddWithValue("@Serial", hd.SerialNumber);
                scList.Add(sc);
            }
            return scList;
        }

A tutaj kod który jest odpowiedzialny za transakcje (zbiera w kupe wszystkie zapytania i wykonuje transakcje, * bardziej szczegółowo: insertuje do bazy konkretne informacje do osobnych tabel, np. dane o dysku, o proscesorze, itd. wspólnym kluczem jest Id_zgloszenia *

 using (SqlConnection polaczenie = new SqlConnection(ConnectionString))
                {
                    polaczenie.Open();
                    using (SqlTransaction trans = polaczenie.BeginTransaction())
                    {
                    try
                        {
                            using (SqlCommand command = new SqlCommand("", polaczenie, trans))
                            {
                                command.CommandType = System.Data.CommandType.Text;

                                foreach (var commandQueries in ListOfQueriesForTrans)
                                {
                                    command.CommandText = commandQueries.CommandText;
                                    command.ExecuteNonQuery();
                                }
                            }

                            trans.Commit();
                        }
                    catch { trans.Rollback(); return false; } //nie udało się wykynać transakcji. nie trzeba rollbackować, bo dispose samo to zrobi, ale przynajmniej wiem co będzie cofane :)
                    }
                return true;
            } 

Wygląda ok, ale problem w tym, ze te parametry się nie dodają. WIdzę to w trakcie debugowania - przechodzi do catcha już po pierwzsym command.ExecuteNonQuery();
:( :(

Podpowie ktoś coś?

2

Proponuję złapany wyjątek przypisać do zmiennej (catch (Exception ex)) i pod debuggerem sprawdzić treść błędu...

0

no przecież przepisujesz tylko treść zapytania bez parametrów więc skąd mają one się tam znaleźć? Też je trzeba przepisać.
BTW dziwny sposób wybrałeś na realizację tego.

0

zrobiłem troszke inaczej i działa.
metody zwracaja mi zapytanie i sqlparamaters a w petelce je odbieram i przypisuje do konkretnego zapytania

abrakadaber czemu dziwny? jak to inaczej (lepiej) zrobić? Zrobiłem sobie klasę "zapytania" żeby mieć wszystkie w jednym miejscu, a w "mainie" (w głównej klasie usługi wcf) działanie - czyli zbierz w kupe zapytania (bo na poczatku nie wiadomo ile ich będzie) a potem trzaskaj transakcje.

0

Ja bym raczej szedł w pętli po tych utworzonych już SqlCommandach, każdemu przypisywał połączenie oraz transakcje, i wtedy je wykonywał.

Można też nie wynajdować kwadratowego koła na nowo i użyć ORMa, skoro i tak już masz encje w kodzie.

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