Wątek przeniesiony 2018-01-14 16:21 z C# i .NET przez somekind.

Zamiana string na int

0

cześć
Chciałem sprawdzić czy podany przez nas numer seryjny znajduje się w bazie danych. Wymyśliłem że najprościej jest zliczyć przez COUNT czy jest taki numer,

string sql1 = 
"SELECT COUNT (numerSeryjny) FROM NumerySeryjne WHERE numerSeryjny =" + tbnumerSeryjny .Text + "";

Problem mam ze zamianą zmiennej typu string na int :(. Próbowałem w taki sposób:

int sql2 = Int32.Parse(sql1);
int sql2 = Convert.ToInt32(sql1);
int sql2 = System.Convert.ToInt32(sql1);
int sql2 = int.Parse(sql1);

int sql2;
int.TryParse(sql1, out sql2);
sql2 = Convert.ToInt32(sql1);

Pojawia się taki komunikat: Input string was not in a correct format.
Jak bym uzyskał wartość sql2 to bym użył if'a do sprawdzenia

  if (sql2 > 0)
                {
                    MessageBox.Show("Numer seryjny już istnieje w bazie danych");
                }
                else
                {
Dodajdobazy();
                }

Proszę o pomoc

0

A wykonałeś w ogóle to zapytanie? :D

0

tak, zliczyło mi

nawet jak zapytanie będzie wyglądać w taki sposób:

string sql1 = 
"SELECT COUNT (numerSeryjny) AS Expr1  FROM NumerySeryjne WHERE numerSeryjny =" + tbnumerSeryjny .Text + "";

Dalej wywala ten sam błąd

0

Masz w zapytaniu spację między tbNumerSeryjny, a .Text. To błąd przepisywania czy w oryginale też się trafił taki kudłacz?

Druga sprawa, podepnij debugger i zwyczajnie zajrzyj co trafia do zmiennej, bo możesz tam mieć tysiąc i jeden rodzaj bzdur, jeśli zapytanie gdzieś jest trafione :)

1

@Klojtex: ta spacja nie ma znaczenia.
@przonak007 to zapytanie NAJPIERW trzeba wykonać. Nie wystarczy go napisać - trzeba się połączyć z bazą danych i na niej wykonać zapytanie SQL i dopiero wtedy możesz odczytać wynik.
Poczytaj:
https://www.dotnetperls.com/sqlconnection
https://www.codeproject.com/Articles/4416/Beginners-guide-to-accessing-SQL-Server-through-C

0

Faktycznie wyleciało mi to z głowy. Skupiłem się na zapytanie sql.
Teraz wyskakuje błąd :
Error 1 The name 'sql3' does not exist in the current context

string sql1 = "SELECT COUNT (numerSeryjny) AS Expr1  FROM NumerySeryjne WHERE numerSeryjny =" + tbnumerSeryjny .Text + "";

                OleDbConnection con1 = new OleDbConnection(connectingstring);
                OleDbCommand cmd1 = new OleDbCommand(sql1, con1);

                con1.Open();

                OleDbDataReader myreader1 = cmd1.ExecuteReader();
                OleDbDataReader myreader2;

                while (myreader1.Read())
                {
                    string sql2 = myreader1.GetString(1);
                    int sql3 = Convert.ToInt32(sql2);

                }
 if (sql3 > 0)
                {
                    MessageBox.Show("Numer seryjny już istnieje w bazie danych");
                }
                else
                {
Dodajdobazy();
                }
}
0

Zmienna sql3 istnieje tylko wewnątrz pętli while, bo tam ją zadeklarowałeś.

Raczej:

int sql3 = 0;
while (myreader1.Read())
{
    string sql2 = myreader1.GetString(1);
    sql3 = Convert.ToInt32(sql2);
}

if (sql3 > 0)
// ...
0

teraz w

OleDbDataReader myreader1 = cmd1.ExecuteReader();

wywala błąd: Nieodpowiedni typ danych w wyrażeniu kryterium.

0

ten sam błąd występuje gdy robię:

using (var conn = new OleDbConnection(connectingstring))
                {
                    using (var cmd1 = new OleDbCommand(sql1, conn))
                    {
                        conn.Open();
                        sql3 = (int)cmd1.ExecuteScalar();
                    }
                }
0

Numer seryjny w bazie zapewie jest typem tekstowym, więc powinieneś jego wartość podać w apostrofach, aby SQL rozumiał go jako tekst.

0

Tak, numer jest w bazie txtem, bo numery składają się też z liter.

1

Nie wiem dlaczego nikt o tym nie wspomniał ale takie zapytanie powinno być sparametryzowane, a nie szyte wstawiając doń kawałki stringów z pól tekstowych, o SQL injection nie wspominając. No i nie trzeba wtedy wrzucać czegoś co w bazie ma być varcharem w apostrofy. Raz, że to bezpieczniejsze, a dwa, że wygodne.

https://stackoverflow.com/questions/293311/whats-the-best-method-to-pass-parameters-to-sqlcommand
Przykłady na pewno znajdziesz, bo to temat dobrze opisany w Internecie.

0

Zrobiłem coś takiego:

OleDbConnection con1 = new OleDbConnection(connectingstring);
            string sql1 = "SELECT COUNT (numerSeryjny) AS Expr1  FROM NumerySeryjne WHERE numerSeryjny =" + tbnumerSeryjny .Text + "";
            OleDbCommand cmd1 = new OleDbCommand(sql1, con1);
            int sql2 = Convert.ToInt32(cmd1.ExecuteScalar());

            if (sql2 == 0)
            {
                Dodaj()
            }
            else
            {
             MessageBox.Show("już istnieje taki numer");
            }

Pojawia się taki błąd:

ExecuteScalar requires an open and available Connection. The connection's current state is closed.
0
requires an open and available Connection. The connection's current state is closed.

Wszystko Ci tutaj pisze musisz otworzyć połączenie

czyli coś takiego

con1.Open();

i musisz to zamknąć

 con1.Close();

albo użyć

using(OleDbConnection con1 = new OleDbConnection(connectingstring))
{
//TODO
}

wtedy Ci Open i Close nie potrzebne.

0

faktycznie z rospędu zapomniałem o Open, ale i ta w kodzie

int sql2 = Convert.ToInt32(cmd1.ExecuteScalar());

Wywala błąd:

Nieodpowiedni typ danych w wyrażeniu kryterium.

Przecież jest użyty Convert.ToInt32 żeby z text zrobić int

0

sprawdź swoje zapytanie bo masz błąd :)

0

w zapytaniu SQL wykazuje mi że mam już taki numer

SELECT COUNT (numerSeryjny) AS Expr1 FROM NumerySeryjne WHERE numerSeryjny = '3101918581t'
0

o tutaj masz błąd, czegoś ci brakuje

   string sql1 = "SELECT COUNT (numerSeryjny) AS Expr1  FROM NumerySeryjne WHERE numerSeryjny =" + tbnumerSeryjny .Text + "";
0

nie widzę tego błędu :(, jakaś podpowiedź?

0

Patrz, gdyby usunąć te plusy to, Ci wychodzi tak

  string sql1 = "SELECT COUNT (numerSeryjny) AS Expr1  FROM NumerySeryjne WHERE numerSeryjny =  tbnumerSeryjny .Text"

a porównaj z zapytaniem sql

SELECT COUNT (numerSeryjny) AS Expr1 FROM NumerySeryjne WHERE numerSeryjny = '3101918581t'
0

ok ale numer jest pobierany z textboxa, jak usunę "++" to wszystko zlewa się w jedno zapytanie. Po usunięciu "++" wyskakuje błąd

Nie podano wartości dla jednego lub kilku wymaganych parametrów.
1

spróbuj

string sql1 = "SELECT COUNT (numerSeryjny) AS Expr1  FROM NumerySeryjne WHERE numerSeryjny ='" + tbnumerSeryjny .Text + "'";
0

Brak ' ' i k... nic nie działa. Jesteś wielki. Bardzo dziękuję za pomoc.

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