Błąd przy zamykaniu programu związany z SQL

0

Cześć

Ogólnie pobieram z comboboxa (TypPokoju) wartość (int), a następnie na jej podstawie wysyłam zapytanie do bazy sql. Wszystko przebiega idealnie, nie ma żadnych problemów. Ale jak wyłączam program to wtedy jest komunikat "Incorrenct syntax near the keyword 'and' ". Czy może ktoś powiedzieć o co chodzi [szczególnie, że tak jak mówię bezproblemowo pobiera mi wartości]? Poniżej zamieszczam kod dotyczący zapytania do bazy:

  try
            {
                SqlConnection con = new SqlConnection();
                con.ConnectionString = "Data Source=localhost;Initial Catalog=Zaliczenie;Integrated Security=True";
                con.Open();
                SqlCommand cmd = new SqlCommand("SELECT NrPokoju FROM Pokoje where IDTypu=" + (int)TypPokoju.SelectedValue +"and NrPokoju not in (select NrPokoju from Reservation where not ('"+ DateTime.Parse(dateTimePicker2.Text) + "'< DPrzyjazdu OR '" + DateTime.Parse(dateTimePicker1.Text) + "'>DWyjazdu))", con);

                SqlDataReader umg = cmd.ExecuteReader();
                while (umg.Read())
                {comboBox1.Items.Add(umg["NrPokoju"]); }
            }
            catch (Exception ex)
            { MessageBox.Show(ex.Message); }
        }
0

A usingi gdzie masz? Podczas zamykania aplikacji odpalają się Finalizery zamiast Dispose co sprawia że zasoby zwalniają się niekontrolowany sposób.

0

dodaj to sobie w ostatniej lini bloku try{}:

umg.Close();
con.Close();

edit: czyli za tą linią "{comboBox1.Items.Add(umg["NrPokoju"]); }" :p

0

A co jeśli poleci wyjątek? Sytuacja się powtórzy. Niech użyje using, do tego został stworzony.

1

brak spacji przed słowem kluczowym "and"?

... +" and NrPokoju not in ...
0
śmieszek napisał(a):

A co jeśli poleci wyjątek? Sytuacja się powtórzy. Niech użyje using, do tego został stworzony.

Patrząc na ten kod chyba to nie jest jakiś poważny program, dałem mu takie rozwiązanie na szybko zresztą tak sie nie piszę komend do bazy(sql injection).

Może użyć using. Może tez się zabezpieczyć wrzucająć close w bloku finally{}

Oczywiście przed AND też powinna byc spacja

2

To powinno wyglądać mniej-wiecej tak:

string sql = "SELECT NrPokoju FROM Pokoje"
            +" where IDTypu=@typ"
            +" and NrPokoju not in"
            +" (select NrPokoju from Reservation"
            +"  where (DPrzyjazdu<=@przyj and DWyjazdu>=@wyj)"
            +" )";

SqlCommand cmd = new SqlCommand(sql, con);

cmd.Parameters.Add("@typ", SqlDbType.Int);
cmd.Parameters["@typ"].Value = (int)TypPokoju.SelectedValue;

cmd.Parameters.Add("@przyj", SqlDbType.DateTime);
cmd.Parameters["@przyj"].Value = DateTime.Parse(dateTimePicker2.Text);

cmd.Parameters.Add("@wyj", SqlDbType.DateTime);
cmd.Parameters["@wyj"].Value = DateTime.Parse(dateTimePicker1.Text);
0
cSharpKazik napisał(a):

Patrząc na ten kod chyba to nie jest jakiś poważny program, dałem mu takie rozwiązanie na szybko zresztą tak sie nie piszę komend do bazy(sql injection).

Jest to poważny problem bo ktoś później przeczyta takie porady i sobie zapamięta. Później taki gość będzie pisał aplikacje w firmie i g**no dalej będzie się powielać.

Nie rozumiem czemu wszyscy się uparli na używanie czystego ADO.NET. Jakieś skłonności masochistyczne? Czy może im bardziej skomplikowany kod tym czuję się lepszym programistą (często spotykane postępowanie)? Już przeżyłem utrzymywanie dwóch aplikacji napisanych w czystym ADO.NET i mam dość. Nie lepiej użyć dobrego i sprawdzonego Dappera i zapytanie zrobić tak?:

 
connection.Query<int>(
    @"select * 
      from (select 1 as Id union all select 2 union all select 3) as X 
      where Id in @Ids", 
    new { Ids = new int[] { 1, 2, 3 });

Może użyć using. Może tez się zabezpieczyć wrzucająć close w bloku finally{}

Bez sensu. Przecież using jest kompilowany do bloku try {} finally {} zatem lepiej użyć tego, co jest czytelniejsze.

0

Może użyć using. Może tez się zabezpieczyć wrzucająć close w bloku finally{}

Bez sensu. Przecież using jest kompilowany do bloku try {} finally {} zatem lepiej użyć tego, co jest czytelniejsze.

A może dla kogoś bardziej czytelne jest użycie try catch finally :)

0

Programowanie jest nauką ścisłą. Mniej znaków oznacza większą czytelność bo mniej jest miejsca poświęconego na mechanizmy a więcej na logikę samej aplikacji. Zresztą podobnie jest w składzie druku - nie jest tak, że książki są składane według widzimisię redaktora a stosuje się bardzo konkretne zasady.

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