Search code examples
stringvb.netsqlclient

SQLClient Command Parameter Query String Length


I am connecting to a SQL Server and am trying to limit the results by adding parameters. The first parameter I added, @sdate, worked just fine. But, now I am trying to add a second parameter which is not working. I want the field, LP_EOC_DATA.PL, to only be returned if the length of the string is greater than 6 characters long. The code below executed, and like I say, the dates returned were correct, but it also returned values from LP_EOC_DATA.PL that had string lengths less than 6. Please let me know if you know how to get this to work. Thanks in advance.

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

Also, as you can see, I am looking to add another parameter that only returns alphanumeric results from the same LP_EOC_DATA.PL field. I haven't got quite that far yet, but if you see something I'm doing wrong there too, I'd appreciate the input.


Solution

  • It helps if you format your SQL a little more. There's some structure, but it still comes off as a big wall of text. It's even harder for us to debug than it is for you, since we don't know your schema at all. There are also a number of other little things you should do different before we even address the question (Using block so connection is closed in case of exception, avoid AddWithValue() for index safety, isolate SQL from user interface, etc):

    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
    

    And then call it like this:

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

    As for the question, there are a few possibilities: NULL values can give unexpected results in this kind of situation (the code I posted already accounts for that). You may also have trouble with certain unicode whitespace padding your character count. Another possibility is char or nchar fields instead of varchar or nvarchar, though I don't think that's the issue here.