Goran Bibic Ответов: 3

Верните командира...когда читатель не читает значение


Если читатель читает нормально, то еще


{
                               notificationPanel.BackColor = System.Drawing.ColorTranslator.FromHtml("#FD7400");
                               messageLabel.Text = "Radnik ne postoji u bazi! \nProverite vašu karticu ili probajte ponovo!";
                               textBox1.Text = "";
                               readerresultTextbox.Clear();


Линия собирается вставить команду и сделать это...Я хочу вернуться на старт если читатель не читал
Мне нужны рекомендации?

Что я уже пробовал:

private void prijavaAction()  //novija doradjena....04.04.2018
       {

           {
               SqlConnection con = new SqlConnection(cs);

               if (textBox1.Text.All(char.IsDigit))

               {
                   string queryString = "SELECT [ime_prezime] FROM dbo.radnici WHERE bar_kod = '" + textBox1.Text + "'";// pronaci radnika u bazi
                   using (SqlConnection connection = new SqlConnection(cs))
                   {
                       SqlCommand command = new SqlCommand(queryString, connection);
                       connection.Open();
                       SqlDataReader reader = command.ExecuteReader();
                       try
                       {
                           if (reader.Read())  //radi
                                               //while (reader.Read())  //radi
                           {
                               notificationPanel.BackColor = System.Drawing.ColorTranslator.FromHtml("#2EFF36");
                               messageLabel.Text = (reader["ime_prezime"].ToString()) + " je prijavljen u \n " + DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss");
                               readerresultTextbox.Text = (reader["ime_prezime"].ToString());
                           }
                           else
                           {
                               notificationPanel.BackColor = System.Drawing.ColorTranslator.FromHtml("#FD7400");
                               messageLabel.Text = "Radnik ne postoji u bazi! \nProverite vašu karticu ili probajte ponovo!";
                               textBox1.Text = "";
                               readerresultTextbox.Clear();

                           }
                       }
                       finally
                       {
                           string prijava = "SELECT count(*) from dbo.prijava_radnika where vrijemeprijave is not null and vrijemeodjave is null and radnik = '" + readerresultTextbox.Text + "' and redni_broj is NULL";
                           SqlCommand provjeraprijaveradnika = new SqlCommand(prijava, con);
                           con.Open();
                           int result = Convert.ToInt32(provjeraprijaveradnika.ExecuteScalar());
                           //con.Open();
                           con.Close();
                           if ((result == 0)) //radi
                                              //if ((prijava !))
                           {
                               String saveStaff = "INSERT INTO dbo.prijava_radnika (vrijemeprijave, status, radnik,idfakture) VALUES(@vrijemeprijave,'prijavljen', '" + readerresultTextbox.Text + "',@idfakture)";
                               using (SqlConnection openCon2 = new SqlConnection(cs))
                               {
                                   using (SqlCommand querySaveStaff = new SqlCommand(saveStaff))
                                   {
                                       querySaveStaff.Connection = openCon2;
                                       querySaveStaff.Parameters.Add("@vrijemeprijave", SqlDbType.DateTime).Value = DateTime.Now;
                                       querySaveStaff.Parameters.Add("@idfakture", SqlDbType.Int).Value = id_fakture;
                                       openCon2.Open();
                                       querySaveStaff.ExecuteNonQuery();
                                       openCon2.Close();

                                       //notificationPanel.BackColor = System.Drawing.ColorTranslator.FromHtml("#FFE11A");
                                       // messageLabel.Text = (reader["ime_prezime"].ToString()) + " je prijavljen u \n " + DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss");
                                   }
                               }
                           }
                           else
                           {

                               String updateStaff = " declare @maxNo integer = 0 select @maxNo = isnull(max(redni_broj), 0) from[dbo].[prijava_radnika] UPDATE[dbo].[prijava_radnika] SET"
                                   + " [vrijemeodjave] = @vrijemeodjave,[redni_broj] = (@maxNo+1),[status] = 'odjavljen' WHERE radnik = '" + readerresultTextbox.Text + "'and[status] = 'prijavljen'";



                               //string queryString = "SELECT [ime_prezime] FROM dbo.radnici WHERE bar_kod = '" + textBox1.Text + "'";// pronaci radnika u bazi
                               using (SqlConnection connection1 = new SqlConnection(cs))
                               {
                                   SqlCommand command1 = new SqlCommand(queryString, connection1);
                                   connection1.Open();
                                   SqlDataReader reader1 = command1.ExecuteReader();
                                   connection.Close();
                                   try
                                   {
                                       if (reader1.Read())
                                       {


                                           using (SqlConnection openCon3 = new SqlConnection(cs))
                                           {
                                               using (SqlCommand queryupdateStaff = new SqlCommand(updateStaff))
                                               {
                                                   queryupdateStaff.Connection = openCon3;
                                                   queryupdateStaff.Parameters.Add("@vrijemeodjave", SqlDbType.DateTime).Value = DateTime.Now;
                                                   openCon3.Open();
                                                   queryupdateStaff.ExecuteNonQuery();
                                                   openCon3.Close();

                                               }
                                           }

                                           notificationPanel.BackColor = System.Drawing.ColorTranslator.FromHtml("#FFE11A");
                                           messageLabel.Text = (reader1["ime_prezime"].ToString()) + " je odjavljen u \n " + DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss");
                                       }
                                   }
                                   catch { }


                               }
                               // Always call Close when done reading.

                               reader.Close();
                           }
                       }
                   }
               }
               else
               {
                   notificationPanel.BackColor = System.Drawing.ColorTranslator.FromHtml("#FD7400");
                   messageLabel.Text = "Bar kod nije važeci ili nije bar kod";
                   textBox1.Text = "";
               }
           }
       }

3 Ответов

Рейтинг:
2

OriginalGriff

Вставка находится внутри а finally блок, что означает, что независимо от того, что происходит, это вызывает выход из try, этот код выполняется.

То finally блок предназначен для очистки после завершения операции, независимо от ее успеха или неудачи - он не существует как форма управления потоком, чтобы убедиться, что вы всегда пытаетесь что-то вставить!

Здесь вам нужно обратить внимание на две вещи:
1) Ваш контроль потока: скорее всего, большая часть кода в вашем finally блок принадлежит в теле try, с возвратом, используемым, когда считыватель пуст.
2) Не делайте этого так! Никогда не объединяйте строки для построения команды SQL. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого используйте параметризованные запросы.

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?


Рейтинг:
0

Goran Bibic

Спасибо за совет, какое-то решение?


Richard Deeming

Чтобы ответить на решение, нажмите кнопку "есть вопрос или комментарий?" кнопка под этим решением.

НЕ опубликуйте свой ответ как новое "решение".

Рейтинг:
0

Goran Bibic

Но readerresulttextbox опаздывает со значением...если поставить пару неверных кодов, вставьте в работу первую строку с пустым значением из readerresulttextbox

private void prijavaAction()  //04.04. final doradjena
       {

           {
               SqlConnection con = new SqlConnection(cs);

               if (textBox1.Text.All(char.IsDigit))

               {
                   string queryString = "SELECT [ime_prezime] FROM dbo.radnici WHERE bar_kod = '" + textBox1.Text + "'";// pronaci radnika u bazi
                   using (SqlConnection connection = new SqlConnection(cs))
                   {
                       SqlCommand command = new SqlCommand(queryString, connection);
                       connection.Open();
                       SqlDataReader reader = command.ExecuteReader();
                       try
                       {
                           if (reader.Read())  //radi
                                               //while (reader.Read())  //radi
                           {
                               string prijava = "SELECT count(*) from dbo.prijava_radnika where vrijemeprijave is not null and vrijemeodjave is null and radnik = '" + readerresultTextbox.Text + "' and redni_broj is NULL";
                               SqlCommand provjeraprijaveradnika = new SqlCommand(prijava, con);
                               con.Open();
                               int result = Convert.ToInt32(provjeraprijaveradnika.ExecuteScalar());
                               //con.Open();
                               con.Close();
                               if ((result == 0)) //radi
                                                  //if ((prijava !))
                               {
                                   String saveStaff = "INSERT INTO dbo.prijava_radnika (vrijemeprijave, status, radnik,idfakture) VALUES(@vrijemeprijave,'prijavljen', '" + readerresultTextbox.Text + "',@idfakture)";
                                   using (SqlConnection openCon2 = new SqlConnection(cs))
                                   {
                                       using (SqlCommand querySaveStaff = new SqlCommand(saveStaff))
                                       {
                                           querySaveStaff.Connection = openCon2;
                                           querySaveStaff.Parameters.Add("@vrijemeprijave", SqlDbType.DateTime).Value = DateTime.Now;
                                           querySaveStaff.Parameters.Add("@idfakture", SqlDbType.Int).Value = id_fakture;
                                           openCon2.Open();
                                           querySaveStaff.ExecuteNonQuery();
                                           openCon2.Close();

                                           notificationPanel.BackColor = System.Drawing.ColorTranslator.FromHtml("#2EFF36");
                                           messageLabel.Text = (reader["ime_prezime"].ToString()) + " je prijavljen u \n " + DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss");
                                           readerresultTextbox.Text = (reader["ime_prezime"].ToString());
                                       }
                                   }
                               }
                               else
                               {

                                   String updateStaff = " declare @maxNo integer = 0 select @maxNo = isnull(max(redni_broj), 0) from[dbo].[prijava_radnika] UPDATE[dbo].[prijava_radnika] SET"
                                       + " [vrijemeodjave] = @vrijemeodjave,[redni_broj] = (@maxNo+1),[status] = 'odjavljen' WHERE radnik = '" + readerresultTextbox.Text + "'and [status] = 'prijavljen'";



                                   //string queryString = "SELECT [ime_prezime] FROM dbo.radnici WHERE bar_kod = '" + textBox1.Text + "'";// pronaci radnika u bazi
                                   using (SqlConnection connection1 = new SqlConnection(cs))
                                   {
                                       SqlCommand command1 = new SqlCommand(queryString, connection1);
                                       connection1.Open();
                                       SqlDataReader reader1 = command1.ExecuteReader();
                                       connection.Close();
                                       try
                                       {
                                           if (reader1.Read())
                                           {


                                               using (SqlConnection openCon3 = new SqlConnection(cs))
                                               {
                                                   using (SqlCommand queryupdateStaff = new SqlCommand(updateStaff))
                                                   {
                                                       queryupdateStaff.Connection = openCon3;
                                                       queryupdateStaff.Parameters.Add("@vrijemeodjave", SqlDbType.DateTime).Value = DateTime.Now;
                                                       openCon3.Open();
                                                       queryupdateStaff.ExecuteNonQuery();
                                                       openCon3.Close();

                                                   }
                                               }

                                               notificationPanel.BackColor = System.Drawing.ColorTranslator.FromHtml("#FFE11A");
                                               messageLabel.Text = (reader1["ime_prezime"].ToString()) + " je odjavljen u \n " + DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss");
                                           }
                                       }
                                       catch { }


                                   }

                               }

                           }
                           else
                           {
                               notificationPanel.BackColor = System.Drawing.ColorTranslator.FromHtml("#FD7400");
                               messageLabel.Text = "Radnik ne postoji u bazi! \nProverite vašu karticu ili probajte ponovo!";
                               textBox1.Text = "";


                           }
                       }
                       finally
                       {

                       }
                   }

               }
               else
               {
                   notificationPanel.BackColor = System.Drawing.ColorTranslator.FromHtml("#FD7400");
                   messageLabel.Text = "Bar kod nije važeci ili nije bar kod";
                   textBox1.Text = "";
               }



           }


       }


Richard Deeming

Как и выше, это не решение проблемы.

И вы явно не читали предложения Гриффа, так как ваш код ВСЕ ЕЩЕ уязвимы для SQL-инъекция[^].