sprawdzenie czy rekord istnieje w bazie

0

Witam,

w jaki sposób powinien być skonstruowany kod c# aby sprawdzić czy dany rekord istnieje w tabeli ?

np mam tabela1 z polami data i godzina

i teraz chce sprawdzić czy dane wprowadzane z datatimepicker (data) oraz datatimepicker1 (godzina) już istnieją. Chodzi mi o to aby nie było rekordu który zawiera taką samą godzinę i datę. kompletnie nie wiem jak się do tego zabrać ;/ z góry dzięki za pomoc.

0

zapomniałem dodać, że chodzi o bazę SQL

0

Zapytanie SELECT...WHERE sprawdzające czy rekord o danych parametrach istnieje?

0

no tak myślałem ale nie bardzo wiem jak to zrobić w kodzie...

powiedzmy mam taki kod, czy on się nadaję ? i jak dokładnie sprecyzować zapytanie select jesli pytam o tabele1 i kolumny data i godzina ?

wybaczcie ale siedzę już nad tym pół dnia i nie daję rady ;/

 

 try
            {
                SqlCommand dodaj = new SqlCommand();
                dodaj.Connection = new SqlConnection(ConfigurationSettings.AppSettings["conn"]);
                dodaj.CommandText = "";

                dodaj.Connection.Open();
                dodaj.ExecuteNonQuery();
                dodaj.Connection.Close();
                
            }
            catch (Exception ex)
            {
                MessageBox.Show("Podana data i godzina już istnieje");
                
            }
0

Czyli Twoim problemem nie jest C# tylko SQL.
Jako CommandText można wstawić np.

SELECT COUNT(*) FROM Tabela WHERE Data=wartość_daty AND Godzina=wartość_godziny

A następnie wywołać nie przez ExecuteNonQuery lecz przez ExecuteScalar i przypisać do zmiennej typu int. Jeśli będzie większa niż 0, to znaczy, że rekord o takich atrybutach istnieje. Jeśli nie, to trzeba będzie napisać drugie zapytanie, które wstawi nowy. (Oczywiście można napisać jedno zapytanie z ifem, który wstawi tylko jeśli rekord nie istnieje.)

0

kurde z c# też mam problem ;p

to może coś takiego ?
ma to sens ?


int zmienna;
         

                
                  
                    SqlCommand dodaj = new SqlCommand();
                    dodaj.Connection = new SqlConnection(ConfigurationSettings.AppSettings["polaczbaza"]);
                    dodaj.CommandText = "SELECT COUNT(id) FROM c_timetable WHERE date=" + cb_data.Text + " AND godz=" + t_godzina.Text + "";

                    dodaj.Connection.Open();
                    dodaj.ExecuteScalar();
                    dodaj.Connection.Close();

                    SqlDataReader sdr = dodaj.ExecuteReader();
                    sdr.Read();
                    zmienna = sdr.GetInt32(0);



                    dodaj.Connection.Close();

                if (zmienna == 0)
                {
                    MessageBox.Show("jest w bazie");
                }
                else
                    MessageBox.Show("nie ma");

 
0

poprawka:



 int zmienna;
         

                
                  
                    SqlCommand dodaj = new SqlCommand();
                    dodaj.Connection = new SqlConnection(ConfigurationSettings.AppSettings["polaczbaza"]);
                    dodaj.CommandText = "SELECT COUNT(id) FROM c_timetable WHERE date=" + cb_data.Text + " AND godz=" + t_godzina.Text + "";

                    dodaj.Connection.Open();
                    dodaj.ExecuteScalar();
                    

                    SqlDataReader sdr = dodaj.ExecuteReader();
                   
                    zmienna = sdr.GetInt32(0);

if (zmienna == 0)
                {
                    MessageBox.Show("jest w bazie");
                }
                else
                    MessageBox.Show("nie ma");

                    dodaj.Connection.Close();

                


 
0

nie dosc ze problem z sql to chyba jeszcze z czytaniem!
co napisal somekind?
"... wywołać ... przez ExecuteScalar i przypisać do zmiennej typu int" - gdzie to masz?
"Jeśli będzie większa niż 0, to znaczy, że rekord o takich atrybutach istnieje" - gdzie to masz?
po co ci ten reader? bylo gdzies ze masz uzyc DataReadera???

"if (zmienna == 0)" - popatrz na zapytanie sql, czy na pewno jesli jest zero to znaczy ze rekord istnieje

0

kurde...

tak ?

SqlCommand dodaj = new SqlCommand();
            dodaj.Connection = new SqlConnection(ConfigurationSettings.AppSettings["polaczbaza"]);
            dodaj.CommandText = "SELECT COUNT(date) FROM c_timetable WHERE date=" + cb_data.Text + "";

            dodaj.Connection.Open();
        

            int zmienna = (int)dodaj.ExecuteScalar();
            

            if (zmienna > 0)
            {
                MessageBox.Show("jest w bazie");
            }
            else
                MessageBox.Show("nie ma");

            dodaj.Connection.Close();

 

znowu siedziałem nad tym 2 godizny ;/ czytałem o zmiennych itp. tylko teraz mam problem, bo wyskakuje błąd:

podświetla linie: int zmienna = (int)dodaj.ExecuteScalar();
Operand type clash: date is incompatible with int

pomoże ktoś ?

0

hmm zmieniłem w bazie z typu "date" na datetime i poszło jakoś..

tylko teraz nie wiem jak skonstruować if ...


int zmienna = (int)dodaj.ExecuteScalar();
            

            if (zmienna > 0)
            {
                MessageBox.Show("jest w bazie");
            }
            else
                MessageBox.Show("nie ma");
 

ciągle mi pokazuje, że nie ma ... może to kwestia ustawienia w datatimepicker bo mi się zmienił format daty w bazie z: 21-01-2009 na 21-01-2009 00:00 i teraz nie wiem o co chodzi ;/

0

dobra wszystko śmiga :)

dzięki wszystkim za pomoc.

 SqlCommand dodaj = new SqlCommand();
            dodaj.Connection = new SqlConnection(ConfigurationSettings.AppSettings["polaczbaza"]);
            dodaj.CommandText = "SELECT COUNT(*) FROM c_timetable WHERE date= '" + cb_data.Text + "' AND godz= '" + t_godzina.Text + "'";

            dodaj.Connection.Open();


            int zmienna = (int)dodaj.ExecuteScalar();
            

            if (zmienna > 0)
            {
                MessageBox.Show("jest w bazie");
            }
            else
                MessageBox.Show("nie ma");

            dodaj.Connection.Close();
0

dzieci sie nie bije, ale za kawalek ktory napisales powyzej powinno :)
konkretnie za ten:
"SELECT COUNT() FROM c_timetable WHERE date= '" + cb_data.Text + "' AND godz= '" + t_godzina.Text + "'"
sql injection - poczytaj o tym
uzyj parametrow
powinno byc tak:
dodaj.CommandText = "SELECT COUNT(
) FROM c_timetable WHERE date= @date AND godz= @Time";
dodaj.Parameters.Add("@date", SqlType.VarChar, 10).Value = cb_data.Text;
dodaj.Parameters.Add("@Time", SqlType.VarChar, 10).Value = t_godzina.Text;

// pisze z glowy, wiec moga byc mini bledy, ale co do zasady tak powinno byc

0

Szybszym (dla bazy) rozwiązaniem będzie:

Exists()

lub

Select TOP 1

0

Czemu nie ma unique w bazie? Wtedy by się nie dało dodać takiego samego rekordu i problem by się rozwiązał.

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