Параметр команды SQLClient Длина строки запроса

Я подключаюсь к SQL Server и пытаюсь ограничить результаты, добавив параметры. Первый параметр, который я добавил, @sdate, работал просто отлично. Но сейчас я пытаюсь добавить второй параметр, который не работает. Я хочу, чтобы поле LP_EOC_DATA.PL возвращалось только в том случае, если длина строки превышает 6 символов. Приведенный ниже код выполняется, и, как я уже сказал, возвращенные даты были правильными, но он также возвращал значения из LP_EOC_DATA.PL с длиной строки меньше 6. Пожалуйста, дайте мне знать, если вы знаете, как заставить это работать. Заранее спасибо.

Sub doSQL()
    Dim myConn As SqlConnection
    Dim myCmd As SqlCommand
    Dim myReader As SqlDataReader
    Dim sqlString As String = "SELECT LP_EOC_DATA.PL as PLs, LP_EOC_DATA.cDate as ReadDate, LP_EOC_LOV.LOCATION as Location " &
        "FROM LP_EOC_DATA INNER JOIN LP_EOC_LOV ON LP_EOC_DATA.PIC = LP_EOC_LOV.PIC " &
        "WHERE LP_EOC_DATA.cDate > (@sdate) AND LEN(LP_EOC_DATA.PL) > @slen1 " &
        "UNION SELECT dbo.VT_DATA.PL as PLs, dbo.VT_DATA.cDate as ReadDate, dbo.VT_LOV.LOCATION as Location " &
        "FROM dbo.VT_DATA INNER JOIN dbo.VT_LOV ON dbo.VT_DATA.PIC = dbo.VT_LOV.PIC " &
        "WHERE dbo.VT_DATA.cDate > (@sdate) AND LEN(dbo.VT_DATA.PL) > @slen1 " &
        "ORDER BY ReadDate;"

    myConn = New SqlConnection("SERVER=ServerName;UID=uName;" &
                            "PWD=Password;")
    myCmd = myConn.CreateCommand
    myCmd.CommandText = sqlString
    myCmd.Parameters.AddWithValue("@sdate", DateTimePicker1.Value)
    myCmd.Parameters.AddWithValue("@slen1", 6)
    'myCmd.Parameters.AddWithValue("@rx1", "'%[^0-9a-z]%'")
    'myCmd.Parameters.AddWithValue("@rx2", " dbo.VT_DATA.PL NOT LIKE '%[^0-9a-z]%'")

    myConn.Open()
    myReader = myCmd.ExecuteReader()
    Table.Load(myReader)

    DataGridView1.Visible = True
    DataGridView1.DataSource = Table
    lblTotal.Text = Table.Rows.Count
End Sub

Кроме того, как вы можете видеть, я хочу добавить еще один параметр, который возвращает только буквенно-цифровые результаты из того же поля LP_EOC_DATA.PL. У меня пока не так далеко, но если вы видите, что я тоже что-то не так делаю, я был бы благодарен за вклад.

2 ответа

Решение

Это поможет, если вы немного отформатируете свой SQL. Есть некоторая структура, но она все еще выглядит как большая стена текста. Нам даже сложнее отлаживать, чем вам, потому что мы вообще не знаем вашу схему. Есть также ряд других мелочей, которые вы должны сделать по-другому, прежде чем мы даже решим вопрос (Using блок, поэтому соединение закрывается в случае исключения, избегайте AddWithValue() для безопасности индекса, изолируйте SQL от пользовательского интерфейса и т. д.):

Function doSQL(StartDate As DateTime) As DataTable
    Dim result As New DataTable
    Dim sqlString As String = _
        "SELECT LP_EOC_DATA.PL as PLs, LP_EOC_DATA.cDate as LPRReadDate, LP_EOC_LOV.LOCATION as Location " & 
        "FROM LP_EOC_DATA " & 
        "INNER JOIN LP_EOC_LOV ON LP_EOC_DATA.PIC = LP_EOC_LOV.PIC " & 
        "WHERE LP_EOC_DATA.cDate > @sdate AND LEN(COALESCE(LP_EOC_DATA.PL,'')) > @slen1 " &
        "UNION " & 
        "SELECT dbo.VT_DATA.PL as PLs, dbo.VT_DATA.cDate as ReadDate, dbo.VT_LOV.LOCATION as LPRLocation " &
        "FROM dbo.VT_DATA " &
        "INNER JOIN dbo.VT_LOV ON dbo.VT_DATA.PIC = dbo.VT_LOV.PIC " &
        "WHERE dbo.VT_DATA.cDate > @sdate AND LEN(COALESCE(dbo.VT_DATA.PL,'')) > @slen1 " &
        "ORDER BY ReadDate;"

    Using myConn As New SqlConnection("SERVER=ServerName;UID=uName;" &
                            "PWD=Password;"), _
          myCmd As New SqlCommand(sqlString, myConn)

        myCmd.Parameters.Add("@sdate", SqlDbType.DateTime).Value = StarDate
        myCmd.Parameters.Add("@slen1", SqlDbType.Int).Value = 6

        myConn.Open()
        result.Load(myCmd.ExecuteReader())
    End Using

    Return result
End Function

А потом назовите это так:

Dim tbl As DataTable = doSql(DateTimePicker1.Value)
DataGridView1.Visible = True
DataGridView1.DataSource = tbl
lblTotal.Text = tbl.Rows.Count

Что касается вопроса, есть несколько возможностей: NULL значения могут дать неожиданные результаты в такой ситуации (код, который я разместил, уже учитывает это). У вас также могут возникнуть проблемы с определенными пробелами в Юникоде, которые дополняют счетчик символов. Другая возможность char или же nchar поля вместо varchar или же nvarcharХотя я не думаю, что это проблема здесь.

Это не ответ на вопрос как таковой, а ответ на запрос примера XML-литерала. Поскольку для этого требуется несколько строк кода, я бы предпочел не помещать его в комментарии.

Dim sql = <sql>
              SELECT *
              FROM MyTable
              WHERE MyColumn = @MyColumn
          </sql>
Dim command As New SqlCommand(sql.Value, connection)

Обратите внимание, что имя элемента может быть любым, что вы хотите, но я обычно использую "sql", когда это для кода SQL.

Другие вопросы по тегам