Параметр команды 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.