2017-01-31 3 views
1

У меня есть таблица SQL с тремя столбцами «От», «В» и «Эквивалентное значение». Каждое значение показано ниже:, если входное значение находится между двумя значениями, тогда отобразится результат

From  To   Equivalent Value 
1,001.00 2,000.00  200.00 
2,001.00 3,000.00  300.00 

Теперь, если пользователь вводит значение «1,200.00» в TextBox1 он будет отображать значение результата для TextBox2 который является «200,00», потому что это соответствующее значение между «С» и «. Для того, чтобы

Еще одно условие, если пользователь вводит значение„ 2,500.00“в TextBox1 он будет отображать значение„300.00“

до сих пор, я попробовал этот код, но не повезло:

Dim conn As SqlConnection = SQLConn() 
Dim da As New SqlDataAdapter 
Dim dt As New DataTable 

conn.Open() 

Dim cmd As New SqlCommand("", conn) 
Dim result As String 

cmd.CommandText = "SELECT [Equivalent Value] FROM tblSSS" 
result = IIf(IsDBNull(cmd.ExecuteScalar), "", cmd.ExecuteScalar) 
da.SelectCommand = cmd 
dt.Clear() 
da.Fill(dt) 

If result <> "" Then 
    If TextBox1.Text >= dt.Rows(0)(1).ToString() And TextBox1.Text <= dt.Rows(0)(2).ToString() Then 
     TextBox2.Text = dt.Rows(0)(3).ToString() 

    End If 
End If 
+0

А что вы пробовали до сих пор? –

+0

Можете ли вы объяснить немного больше? –

+0

извините, ребята. Okey – Jaron2016

ответ

2

Если я получил это право, я думаю, есть несколько вещей, которые я хотел бы изменить, которые могут помочь вам:

  1. Использование Using. Это будет уничтожать объекты SQL, как только они закончились.
  2. Использование SqlParameters. Это поможет с фильтрацией ваших данных.
  3. Удалить использование SqlDataAdapter. В этом случае я не чувствую, что это необходимо.
  4. Использование 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. Это полностью зависит от вас.

Возможно, вам придется внести несколько изменений, но я думаю, что это даст вам несколько идей о том, как продвигаться вперед по вашему коду.

-3

Надеется, что это помогает ...

Dim connetionString As String 
Dim cnn As SqlConnection 
Dim cmd As SqlCommand 
Dim sql As String 

connetionString = "Data Source=ServerName;Initial Catalog=DatabaseName;User ID=UserName;Password=Password" 
sql = "SELECT [Equivalent Value] FROM tblSSS WHERE [FROM]<=" & Val(TextBox1.Text) & " AND [TO]>= " & Val(TextBox1.Text) 

cnn = New SqlConnection(connetionString) 
Try 
    cnn.Open() 
    cmd = New SqlCommand(sql, cnn) 
    Dim count As Int32 = Convert.ToInt32(cmd.ExecuteScalar()) 
    cmd.Dispose() 
    cnn.Close() 

Catch ex As Exception 
    MsgBox("Can not open connection ! ") 
End Try 
+0

Пожалуйста, добавляйте более подробную информацию. – GiamPy

+1

Извините, глючный и широко открытый код SQL-инъекций заслуживает понижения. – Arvo

+0

Взгляните на [это] (http://stackoverflow.com/questions/332365/how-does-the-sql-injection-from-the-bobby-tables-xkcd-comic-work?noredirect=1&lq=1) Кунал. Параметры всегда должны предлагаться при предоставлении ответа на SQL, даже если нужно исправить небольшую проблему синтаксиса. – Bugs

Смежные вопросы