Если я получил это право, я думаю, есть несколько вещей, которые я хотел бы изменить, которые могут помочь вам:
- Использование Using. Это будет уничтожать объекты SQL, как только они закончились.
- Использование SqlParameters. Это поможет с фильтрацией ваших данных.
- Удалить использование
SqlDataAdapter
. В этом случае я не чувствую, что это необходимо.
- Использование
IIf
. Я буду использовать If
, который заменил IIf
.
С этим в виду, я хотел бы посмотреть на что-то вроде этого:
Dim fromValue As Decimal = 0D
Dim toValue As Decimal = 0D
If Decimal.TryParse(TextBox1.Text, fromValue) AndAlso Decimal.TryParse(TextBox1.Text, toValue) Then
Dim dt As New DataTable
Using conn As SqlConnection = SQLConn,
cmd As New SqlCommand("SELECT [Equivalent Value] FROM tblSSS WHERE [From] >= @From AND [To] <= @To", conn)
cmd.Parameters.Add(New SqlParameter With {.ParameterName = "@From", .SqlDbType = SqlDbType.Decimal, .Value = fromValue})
cmd.Parameters.Add(New SqlParameter With {.ParameterName = "@To", .SqlDbType = SqlDbType.Decimal, .Value = toValue})
conn.Open()
dt.Load(cmd.ExecuteReader)
End Using
If dt.Rows.Count = 1 Then
TextBox2.Text = If(IsDBNull(dt.Rows(0).Item("Equivalent Value")), "0", dt.Rows(0).Item("Equivalent Value").ToString)
End If
End If
Обратите внимание на использование Decimal.TryParse:
Преобразует строковое представление числа в десятичный эквивалент. Возвращаемое значение указывает, было ли преобразование успешным или неудачным.
Это предположение что От и К поля в базе данных являются Decimal
.
Теперь, чтобы объяснить разницу между IIf
и If
. IIf
выполняет каждую часть инструкции, даже если она истинна, а If
выполняет только одну часть. Я не буду вдаваться в подробности, как многие другие здесь уже сделали это. Посмотрите на это answer.
Как и в случае с Andrew Morton's комментариями и более в соответствии с тем, что пытался сделать ОП, является решением, которое использует ExecuteScaler.
ExecuteScaler выполняет запрос и возвращает первый столбец первой строки в результирующем наборе, возвращаемом запросом. Дополнительные столбцы или строки игнорируются.
Имея это в виду:
'I reset the value of TextBox2.Text. You may not want to.
TextBox2.Text = ""
Dim fromValue As Decimal = 0D
Dim toValue As Decimal = 0D
If Decimal.TryParse(TextBox1.Text, fromValue) AndAlso Decimal.TryParse(TextBox1.Text, toValue) Then
Using conn As SqlConnection = SQLConn,
cmd As New SqlCommand("SELECT [Equivalent Value] FROM tblSSS WHERE [From] >= @From AND [To] <= @To", conn)
cmd.Parameters.Add(New SqlParameter With {.ParameterName = "@From", .SqlDbType = SqlDbType.Decimal, .Value = fromValue})
cmd.Parameters.Add(New SqlParameter With {.ParameterName = "@To", .SqlDbType = SqlDbType.Decimal, .Value = toValue})
conn.Open()
Try
TextBox2.Text = cmd.ExecuteScalar().ToString()
Catch ex As Exception
End Try
End Using
End If
Я использовал пример на MSDN документации ExecuteScaler
. Возможно, вам стоит взглянуть на обработку исключения на Try Catch
немного лучше и не допустить его впустую.
Возможно, вы захотите поместить этот код по методу TextBox1.Leave
или, возможно, по методу Button.Click
. Это полностью зависит от вас.
Возможно, вам придется внести несколько изменений, но я думаю, что это даст вам несколько идей о том, как продвигаться вперед по вашему коду.
А что вы пробовали до сих пор? –
Можете ли вы объяснить немного больше? –
извините, ребята. Okey – Jaron2016