BassamKassem Ответов: 1

У меня есть ошибка даты в базе данных SQL server при использовании ее с моим VB.NET применение


Я получаю эту ошибку после переноса моей базы данных из Access на SQL Server .

ниже приведены те действия, которые мне нужно сделать, но все они дали мне ошибку "переполнение SqlDateTime. Должно быть, между 1/1/1753 12:00:00 утра и 12/31/9999 11:59:59 вечера."

1 - мне нужно искать все записи, которые превышены за 24 часа или 1 день
2 - мне нужно найти все записи с DateAdded = Pick_DateAdded.Текст
3 - Все записи с определенными фиксированными значениями в двух столбцах данных

Заранее спасибо

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

Private Sub Supplier_Query()
      'Dim sqlQRY As String
      Try
          Dim Yesterday As DateTime
          'call needed query 1st and Update the datatable with the escalatoin date to the supplier
          If cnnOLEDB.State = ConnectionState.Open Then
              cnnOLEDB.Close()
          End If
          cnnOLEDB.ConnectionString = strConnectionString
          cnnOLEDB.Open()
          If SLA_chk.Checked = True Then
              Yesterday = Today.AddDays(-(SLA_TXT.Value))
              sqlQRY = "SELECT * FROM Customers WHERE SupplierName = '" & SuppNameVariable.Text & "' AND Supplier_Feedback = '.....' AND DateAdded <= @Yesterday"

          ElseIf Chk_Specofic_date.Checked = True Then
              sqlQRY = "Select * From Customers WHERE SupplierName = '" & SuppNameVariable.Text & "' AND Supplier_Feedback = '.....' AND DateAdded = @DatePickerValue"
          ElseIf SLA_TXT.Text = "0" Then
              sqlQRY = "Select * From Customers WHERE SupplierName = '" & SuppNameVariable.Text & "' AND Supplier_Feedback = '.....'"
          End If

          Dim da As New SqlDataAdapter(sqlQRY, cnnOLEDB)
          Dim ds As DataSet = New DataSet
          da = New SqlDataAdapter(sqlQRY, cnnOLEDB)
          da.SelectCommand.Parameters.AddWithValue("@Yesterday", Yesterday)
          da.SelectCommand.Parameters.AddWithValue("@DatePickerValue", Pick_DateAdded.Text)

          Dim cb As SqlCommandBuilder = New SqlCommandBuilder(da)
          'Dim d As SqlCommand
          'd = New SqlCommand

          da.Fill(ds, "Customers")
          Alerting_Escalation_Tool.DataGridViewCustomer.DataSource = ds
          Alerting_Escalation_Tool.DataGridViewCustomer.DataMember = "Customers"
          cnnOLEDB.Close()

1 Ответов

Рейтинг:
6

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

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

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


Цитата:
Я не очень хорошо знаком с параметризованными запросами вот почему я потерялся


Основы:
Using con As New SqlConnection(strConnect)
	con.Open()
	Using cmd As New SqlCommand("SELECT description FROM myTable WHERE ID = @ID", con)
        cmd.Parameters.AddWithValue("@ID", idToSearchFor)
		Using reader As SqlDataReader = cmd.ExecuteReader()
			While reader.Read()
				Dim desc As String = DirectCast(reader("description"), String)
				Console.WriteLine("ID: {0}" & vbLf & "    {1}", idToSearchFor, desc)
			End While
		End Using
	End Using
End Using
Для получения более подробной информации Google "параметризованные запросы VB" и начните читать!


BassamKassem

Не могли бы вы пожалуйста сказать мне какой код написать ей я немного заблудился

OriginalGriff

Немного заблудился где?
Полагаю, вы знаете, как писать параметризованные запросы?

BassamKassem

Я не очень хорошо знаком с параметризованными запросами вот почему я потерялся

MadMyche

Ваш запрос уже использует hem; посмотрите на код для этого запроса. @Вчера

OriginalGriff

Ответ обновлен - извините, я забыл упомянуть об этом.