Insert do bazy danych - split string

0

Jak prawidłowo zrealizować insert do SQL. Chodzi o to że mam tabelę składającą się z 7 kolumn do której chciałbym robić inserty. Problemem jest to że stringi jakie chcę insertować nie zawsze posiadają dane do każdej z kolumn. Czyli stringi wyglądają mniej więcej tak:
string pierwszy_wpis = "a1;b1;c1;d1;e1;f1;g1"
string drugi_wpis = "a2;b2;c2;d2"
string trzeci_wpis = "a3;b3;c3"

Robię INSERT za pomocą napisanej wcześniej metody InsertToSql()
Wpisy (stringi) są dzielone za pomocą SPLIT z separatorem ';' na części. Zastanawiam się jak poprawnie sprawdzić ile jest stringów w liście tak żeby zamiast brakujących wstawić nulle do INSERTa.

PRZYKŁAD:

string [] wpis_div = drugi_wpis.Split(';')
SqlCommand cmd = new SqlCommand(query, Conn);           
           
            cmd.Parameters.Add("@kol1", SqlDbType.NVarChar).Value =wpis_div [0];
            cmd.Parameters.Add("@kol2", SqlDbType.NVarChar).Value =wpis_div [1];
            cmd.Parameters.Add("@kol3", SqlDbType.NVarChar).Value =wpis_div [2];
            cmd.Parameters.Add("@kol4", SqlDbType.NVarChar).Value =wpis_div [3];
            cmd.Parameters.Add("@kol5", SqlDbType.NVarChar).Value =wpis_div [4]; -- na tym się wywali
            cmd.Parameters.Add("@kol6", SqlDbType.NVarChar).Value =wpis_div [5];
            cmd.Parameters.Add("@kol7", SqlDbType.NVarChar).Value =wpis_div [6];

czyli za każdym razem muszę sprawdzić czy jest istnieje taki STRING na liście i wtedy parametr przyjmuję wartość tego stringa, jeśli nie istnieje to przyjmuje wartość NULL

2

Podszedłbym do problemu w inny sposób i utworzyłbym sobie model reprezentujący to co chcesz dodać. Następnie napisałbym parser, który utworzyłby obiekt z danego zestawu. Po wszystkim zrobiłbym insert który nie wywalałby się na indeksach.

0

a nie wpadłeś na pomysł z iterowaniem po wpis_div i dynamicznym tworzeniu parametru $"@kol{i+1}"

0

Właśnie wpadłem na pomysł z użyciem ListaStringów.ElementAtOrDefault() jeszcze nie wiem jak mi to zadziała. Jak nie ogarnę to pomyślę nad waszymi wskazówkami. Z góry dzięki

0
aksimoN napisał(a):

Jak prawidłowo zrealizować insert do SQL. Chodzi o to że mam tabelę składającą się z 7 kolumn do której chciałbym robić inserty. Problemem jest to że stringi jakie chcę insertować nie zawsze posiadają dane do każdej z kolumn. Czyli stringi wyglądają mniej więcej tak:
...
czyli za każdym razem muszę sprawdzić czy jest istnieje taki STRING na liście i wtedy parametr przyjmuję wartość tego stringa, jeśli nie istnieje to przyjmuje wartość NULL

Każdy dobry projekt się zaczyna od dobrego określenia. Zawsze brakuje tylko ostatnich? Bo w/w słowa nie są tak jednoznaczne.

czyli za każdym razem muszę sprawdzić czy jest istnieje taki STRING na liście

A niby jak w przypadku ogólnym?

var napisał(a):

Podszedłbym do problemu w inny sposób i utworzyłbym sobie model reprezentujący to co chcesz dodać. Następnie napisałbym parser, który utworzyłby obiekt z danego zestawu. Po wszystkim zrobiłbym insert który nie wywalałby się na indeksach.

Przynajmniej Dictionary

0

Nie wiem jak widzicie poprawność takiego rozwiązania ale skorzystałem z ElementAtOrDefault() żeby nie wywalał przy próbie znalezienia elementu na liście stringów.
Następnie zrobilem IFa na IsNullOrEmpty żeby jeśli znajdzie pusty element to wstawiał do SQLa DBNull.Value.

PS. Czy da się w ElementAtOrDefault() ustawić jakiś konkretny Default bo nie udało mi się tego zrobić?

0

Wymyślone rozwiązanie z własną wartością defaultową jest możliwe tylko po napisaniu własnej metody:
[(https://stackoverflow.com/questions/491224/linq-how-to-define-a-default-type-for-use-with-elementatordefault-operator/491236#491236)]

static T ElementAtOrDefault<T>(this IList<T> list, int index, T @default)
{
return index >= 0 && index < list.Count ? list[index] : @default;
}

1

Mam wrażenie, ze dużo piany o nic.O modne słówko ElementAtOrDefault widziane w notacji funkcyjnej
Toż to 50 letnim operatorem ? da się zrobić - może dla niektórych mniej elegancko.
W funkcyjnych elementach nie jestem biegły, ale chyba dlatego nie chce to wyjść zupełnie ortodoksyjnie, że zamiata pod dywan stan (czy lepsze słowo kontekst): szerokość insertu

Nie przeprowadza Cię w czasy, a na pewno przyjdą, gdzie brakuje środkowych wartości.
Zrób słownik (we wszystkich innych językach zwany Map) <nazwaKolumny,wartość>, tym słownikiem się baw funkcyjnie. Będzie o wiele bardziej perspektywicznie.

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