Dodawanie wartości dziesiętnych do lokalnej bazy danych

0

Witam, tak jak w temacie mam problem z dodaniem wartości dziesiętnych do bazy. Połączenie i dodawanie wartości całkowitych działa, w bazie ustawione rekordy liczbowe na typ Float. Problem: gdy próbuje dodać do bazy np. fat = 2,1 to wyskakuje błąd "error converting data type varchar to float" . Jest jakiś sposób aby to zadziałało ?
Kod:

 private void button1_Click(object sender, EventArgs e)
        {
            try
            { 

                if (name.Text != "" & protein.Text != "" & carbs.Text != "" & fat.Text != "" & kcal.Text != "")
                {
                    cn.Open();
                    cmd.CommandText = "INSERT INTO products (prod_name, protein, carbs, fat, kcal) values ( N'" + name.Text + "','" + Convert.ToDouble(protein.Text) + "','" + Convert.ToDouble(carbs.Text) + "','" + Convert.ToDouble(fat.Text) + "','" + Convert.ToDouble(kcal.Text) + "')";
                    cmd.ExecuteNonQuery();
                    cmd.Clone();
                    MessageBox.Show("Pomyślne dodanie produktu!", "Message", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    cn.Close();
                    name.Text = "";
                    protein.Text = "";
                    carbs.Text = "";
                    fat.Text = "";
                    kcal.Text = "";
                    loadlist();
            
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                
                cn.Close();
            }
            
        }
1

Zapewne wstawiasz dane z przecinkiem, podczas gdy baza oczekuje kropki jako separatora części dziesiętnych.

0

Jak wpiszę z "kropką" to wyskakuje, że "nieprawidłowy format ciągu wyjściowego"

0

Wyrzuć sobie string zapytania SQL do konsoli to zobaczysz gdzie jest problem.
Pewnie masz problem z tym, że liczbę zmiennoprzecinkową próbujesz zapisać z przecinkiem.

0

Inaczej: Twój system oczekuje separatora ,, a baza danych - ., dlatego w aplikacji musisz wprowadzać liczby z przecinkiem. Ale wysyłając je do bazy danych, musisz już konwertować je z wykorzystaniem kropki.

0

Właśnie nie w tym problem, mam dodane 2 rekordy, w których używam przecinka, ponieważ z kropką się nie da ;/

1

tyle się tłucze za każdym razem - NIE SKLEJAĆ ZAPYTANIA TYLKO UŻYĆ PARAMETRÓW. Już pomijam użycie jakiegoś ORMa zamiast gołych SQLi.

A ty robisz tak: bierzesz stringa, zamieniasz go na liczbę i dodajesz do stringa. Jak myślisz co się dzieje kiedy próbujesz dodać ciąg znaków i liczbę? Po co w ogóle w pierwszej kolejności zmieniasz ciąg znaków na liczbę?

I tak, przy dodawaniu do bazy LICZBA MUSI MIEĆ KROPKĘ JAKO SEPARATOR DZIESIĘTNY

0

Oszczędź sobie bólu z utrzymywaniem tego kodu i zamiast archaicznych commandów użyj Dappera. Poczujesz się lepiej i kod zmieścisz w 3 linijkach.

0

I bogowie sqla i kodów C# dadzą Ci spokój bo Dapper wszystko zrobi, nawet zabezpieczy Ci parametry.

0

@Dzaro13: próbujesz wprowadzić do bazy wartości nvarchar - tekstowe, patrz: cmd.CommandText, pomimo, że próbujesz potem rzutować wartości na double to baza i tak dostaje wartości tekstowe. Rozwiązanie jest tu użycie:

cmd.Parameters.Add(....)
 

to używałem przy bazie Oracle, zaś dla SQL DB winno być:

 cmd.Parameters.AddWithValue(....)

http://stackoverflow.com/questions/8389803/insert-data-into-sql-server-database
http://stackoverflow.com/questions/12939501/insert-into-c-sharp-with-sqlcommand

Mam nadzieję, że to pomoże.

pozdrawiam

PS. dołączam się do wypowiedzi przedmówców, ORM to podstawa.

0

szymon Twoja propozycja działa, ale można dodać tylko 1 rekord, a następnie wywala "variable names must be unique within a query batch or stored procedure c#" . Pobawie się z tą nazwą poźniej, chyba, że ktoś wie o co chodzi.
P.S. Jestem początkującym i nie wiedziałem że jest takie coś jak OMR, ogarne i dziękuję za uświadomienie wszystkim :)

0

Do prostych i szybkich rzeczy to ADO.NET :) będzie doskonałe.

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