/ / Dodaj wszystkie kolumny z bazy danych automatycznie do zapytania INSERT INTO - c #, mysql, wpf

Dodaj wszystkie kolumny z bazy danych automatycznie do zapytania INSERT INTO - c #, mysql, wpf

Mam okno WPF, w którym mogę dodać klienta do bazy danych. Etykiety i pola tekstowe są programowo dodawane przez liczbę kolumn w tabeli bazy danych.

Teraz, jeśli umieszczę jakiś tekst w polach tekstowych, chcę zapisać wszystkie te teksty w bazie danych.

Mój kod do tej pory to:

try {
for (int i = 0; i < textboxes.Count; i++)
{
var value = textboxes[i];
var column = labels[i];
MySqlCommand cmd = connection.CreateCommand();
cmd.CommandText = "INSERT INTO firmenkunden ("+column.Name+") VALUES (""+value.Text+"")";
cmd.ExecuteNonQuery();
}
MessageBox.Show("Der Firmenkunde wurde erfolgreich erstellt.");
this.Close();
}
catch (MySqlException ex) {
MessageBox.Show(ex.Message);
}

Ale to nie działa. Wygląda teraz tak: wprowadź opis obrazu tutaj

Czy ktoś ma pomysł, jak to zrobić?

Odpowiedzi:

0 dla odpowiedzi № 1

Głównym problemem, jaki masz, jest to, że wykonujesz wiele wstawek, możesz to rozwiązać za pomocą pętli, aby zbudować jedną INSERT dowództwo.

string queryText = "INSERT INTO firmenkunden (";

for (int i = 0; i < textboxes.Count; i++)
{
var column = labels[i];
if (i < textboxes.Count - 1)
queryText += column.Name + ",";
else
queryText += column.Name;
}

queryText += ") VALUES (";

for (int i = 0; i < textboxes.Count; i++)
{
var value = textboxes[i];
if (i < textboxes.Count - 1)
queryText += """ + value.Text + "",";
else
queryText += """ + value.Text + "")";
}

MySqlCommand cmd = connection.CreateCommand();
cmd.CommandText = queryText;
cmd.ExecuteNonQuery();

Istnieje również wiele innych sposobów budowania łańcucha. Poleciłbym spędzić trochę czasu na czytaniu na łączeniu łańcuchów, użyłbym StringBuilder w stosunku do tego, co podałem. Ciąg zapewnia także szereg metod statycznych, które mogą być przydatne.

Wszystko to mówi, że są lepsze sposobyto, twoja implementacja i powyższa implementacja nie są najlepszą praktyką. Możesz zbadać Linq na SQL lub nawet lepiej Entity Framework. Istnieją również inne opcje, ale nie są one dostępne. Jeśli chcesz kontynuować budowanie swoich poleceń, będziesz chciał przynajmniej spojrzeć na sparametryzowany SQL.


3 dla odpowiedzi № 2

Problem polega na tym, jak tworzysz zapytanie do wykonania w bazie danych. Zobacz, dla każdej kolumny, w której wykonujesz Wstaw, ale musisz wysłać wszystkie kolumny do polecenia, więc spróbuj to zrobić:

   var columns = new System.Text.StringBuilder();
var values = new System.Text.StringBuilder();
MySqlCommand cmd = connection.CreateCommand();
for (int i = 0; i < textboxes.Count; i++)
{
var value = textboxes[i];
var column = labels[i];
cmd.Parameters.AddWithValue("@" + column.Name, value.Text);
string complement = (i == 0 ? string.Empty : ",");
columns.Append(complement + column.Name);
values.Append(complement + "@" + column.Name);
}
cmd.CommandText = "INSERT INTO firmenkunden (" + columns.ToString() + ") VALUES (" + values.ToString() + ")";

Inną rzeczą, którą musisz zrobić, to preferować użycie MySqlParameters zamiast konkatowania wartości w zapytaniach. Tutaj wyjaśnić, dlaczego i tutaj jak możesz tego użyć.

Mam nadzieję, że to pomoże.


0 dla odpowiedzi № 3

Generujesz jedno zapytanie na pole tekstowe. Musisz dodać wszystkie kolumny i wartości do jednego zapytania.

Coś takiego powinno działać (niesprawdzone), ale w zależności od typu danych niektóre pola mogą wymagać zmiany znaczenia i / lub innej obsługi cytatów.

 List<String> columns = new List<String>();
List<String> values = new List<String>();

for (int i = 0; i < textboxes.Count; i++)
{
var value = textboxes[i];
var column = labels[i];

columns.add(column);
values.add(value);
}

MySqlCommand cmd = connection.CreateCommand();
cmd.CommandText = "INSERT INTO firmenkunden (`"+String.Join("`,`", columns)+"`) VALUES (""+String.Join(""", values)+"")";
cmd.ExecuteNonQuery();