Member 13604810 Ответов: 1

Сравните дату из datetimepicker с датой из базы данных


//How can i do to when i select one date < or = (select u_replica from e_industrial.dbo.e1) from this query, if true show date, if > dont show.


 private void btn_search_Click(object sender, EventArgs e)
        {
            
            SqlConnection conn = new SqlConnection("Data Source=....;Initial Catalog=Innux;Persist Security Info=True;");
            conn.Open();
            SqlDataAdapter SDA = new SqlDataAdapter("select dbo.Alteracoes.Data, dbo.Funcionarios.numero as no, dbo.Funcionarios.nome, DATEPART(hour, Falta) AS faltas, DATEPART(hour, Coluna2) AS  horasextra  from dbo.Alteracoes inner join dbo.Funcionarios on dbo.Alteracoes.IDFuncionario = dbo.Funcionarios.IDFuncionario inner join dbo.Departamentos on dbo.Funcionarios.IDDepartamento = dbo.Departamentos.IDDepartamento WHERE Data = '" + dateTimePicker1.Value.ToString("yyyy/MM/dd") + "'", conn);
            DataSet dt = new DataSet();
            



            SDA.Fill(dt, "dbo.Alteracoes.Data");
            dataGridView1.DataSource = dt.Tables["dbo.Alteracoes.Data"];
            conn.Close();
        }

        private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
        {

            //dateTimePicker1.MaxDate = DateTime.Now;
            SqlConnection conn = new SqlConnection("Data Source=.....;Initial Catalog=Innux;Persist Security Info=True;");
            conn.Open();
            SqlDataAdapter pickerMaxDate = new SqlDataAdapter("select u_replica from e_industrial.dbo.e1 ('"+  dateTimePicker1.Value.ToString("yyyy/MM/dd")+"')" , conn);

            String pickerMaxDateString = pickerMaxDate.ToString();
            DateTime dtMax = Convert.ToDateTime(pickerMaxDateString);

            dateTimePicker1.MaxDate = dtMax;

            
            conn.Close();
        }


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

private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
      {

          //dateTimePicker1.MaxDate = DateTime.Now;
          SqlConnection conn = new SqlConnection("Data Source=.....;Initial Catalog=Innux;Persist Security Info=True;");
          conn.Open();
          SqlDataAdapter pickerMaxDate = new SqlDataAdapter("select u_replica from e_industrial.dbo.e1 ('"+  dateTimePicker1.Value.ToString("yyyy/MM/dd")+"')" , conn);

          String pickerMaxDateString = pickerMaxDate.ToString();
          DateTime dtMax = Convert.ToDateTime(pickerMaxDateString);

          dateTimePicker1.MaxDate = dtMax;


          conn.Close();
      }

Karthik_Mahalingam

вы получаете какую-нибудь ошибку?

1 Ответов

Рейтинг:
0

OriginalGriff

Прекратите преобразование значений DateTime в строки - и прекратите передачу строк в SQL путем конкатенации.

Как только дата находится в формате DateTime, сохраните ее там и передайте SQL в качестве значения DateTime с помощью параметров (как и следует для всех значений, передаваемых в базу данных). Затем пусть SQL строит его в столбце DATE, DATETIME или DATETIME2.
Когда вы извлекаете его, он возвращается в виде значения DateTime и может быть непосредственно сравнен.

Или может быть, если ваше утверждение SELECT действительно...
Так и должно быть

SELECT columnlist FROM MyTableName WHERE TheColumnIWantToCompare = ValueToCompareItWith
Вы пропускаете где и колонку.

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

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