Amar chand123 Ответов: 1

Проблема при выполнении запроса в datagridview C# winform


я пытаюсь показать данные SqlDatabase в DataGridView в C#, но когда я пытаюсь запустить код без ошибок и данные не отображаются в DataGridView
если я использую это в SQL-запросе DataShow, но когда я показываю в C# WinForm данные не отображаются
string QueryEMI = "select ST.SrNumber, ST.StudentName+' / '+ST.FatherName AS StudentDetails, ST.Address+' , '+ST.Address1 AS Address, ST.MobileNo+' , '+ST.SecMobileNo AS Contect,  FORMAT(FD.FeesDate,'dd/MM/yyyy'), FD.Amount  from FeesDetails FD inner join Student ST on FD.SrNumber=ST.SrNumber where FD.PaymentStatus ='DUE'"


и я использую это в SQL-запросе или данных WinForm C#, которые не отображаются в обоих случаях
string QueryEMI = "select ST.SrNumber, ST.StudentName+' / '+ST.FatherName AS StudentDetails, ST.Address+' , '+ST.Address1 AS Address, ST.MobileNo+' , '+ST.SecMobileNo AS Contect,  FORMAT(FD.FeesDate,'dd/MM/yyyy'), FD.Amount  from FeesDetails FD inner join Student ST on FD.SrNumber=ST.SrNumber where FD.PaymentStatus =@DUE and FORMAT(FD.FeesDate,'dd/MM/yyyy')<=@date";


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

private void LoadStudentData()
        {
            try
            {
                string QueryEMI = "select ST.SrNumber, ST.StudentName+' / '+ST.FatherName AS StudentDetails, ST.Address+' , '+ST.Address1 AS Address, ST.MobileNo+' , '+ST.SecMobileNo AS Contect,  FORMAT(FD.FeesDate,'dd/MM/yyyy'), FD.Amount  from FeesDetails FD inner join Student ST on FD.SrNumber=ST.SrNumber where FD.PaymentStatus =@DUE and FORMAT(FD.FeesDate,'dd/MM/yyyy')<=@date";
                var date = dtpDueEMI.Value.ToString("dd/MM/yyyy");
                {
                    con.Open();
                    using (SqlDataAdapter da = new SqlDataAdapter(QueryEMI, con))
                    {
                        da.SelectCommand.Parameters.AddWithValue("@DUE", "DUE");
                        da.SelectCommand.Parameters.AddWithValue("@date", date);
                        DataTable dt = new DataTable();
                        da.Fill(dt);
                        dataGridView1.DataSource = dt;


                        // Change Selected Row Color Just Remove "//"
                        //dataGridView1.DefaultCellStyle.SelectionBackColor = Color.LightBlue;
                        // dataGridView1.DefaultCellStyle.SelectionForeColor = Color.Black;

                        // Change DataGridView Rows Color Format Just Remove "//"
                        //dataGridView1.RowsDefaultCellStyle.BackColor = Color.LightGray;
                        //dataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.LightSlateGray;

                        
                    }
                }
            }
            catch
            {
                MessageBox.Show("Fees Not Found");
                this.Close();
            }
        }

1 Ответов

Рейтинг:
9

OriginalGriff

Во-первых, не делай этого так! Никогда не объединяйте строки для построения команды 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;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

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

Во-вторых, никогда не форматируйте даты в строки и не пытайтесь сравнивать их: если вы это сделаете, то получите сравнение строк, которое означает, что общий результат основан на первом различном символе в паре строк. Это очень плохо для сортировки или сравнения дат, так как 01-12-2020-это до 31-01-1990.

Вы используете DateTimePicker, чтобы позволить пользователю выбрать дату, поэтому не преобразуйте это значение в строку, используйте это значение напрямую и передайте его в качестве DateTime вашему запросу. Сравните это значение DATETIME со столбцом DATETIME вашей базы данных FeesDate и сравнение будет работать.
И, вероятно, так же будет ваш код - но исправьте все ваше приложение, чтобы удалить конкатенацию строк, или вы потеряете свою БД.


Amar chand123

Спасибо за ответ и тяжелую работу, но на этот раз это все моя вина, потому что когда я запускаю код в c# winform, я забыл поставить LoadStudentData(); в Form Load вот почему запрос выполняется в SQL, но не в winform, я нахожу свою ошибку, когда ставлю точку останова в своем коде