SQLClient 命令参数查询字符串长度
SQLClient Command Parameter Query String Length
我正在连接到 SQL 服务器并试图通过添加参数来限制结果。我添加的第一个参数@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
此外,如您所见,我希望添加另一个参数,该参数仅 returns 来自同一 LP_EOC_DATA.PL 字段的字母数字结果。我还没有走那么远,但如果你也看到我做错了什么,我将不胜感激。
如果您多格式化 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
值在这种情况下会产生意想不到的结果(我发布的代码已经说明了这一点)。您可能还会遇到某些 unicode 空格填充字符数的问题。另一种可能性是 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'。
我正在连接到 SQL 服务器并试图通过添加参数来限制结果。我添加的第一个参数@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
此外,如您所见,我希望添加另一个参数,该参数仅 returns 来自同一 LP_EOC_DATA.PL 字段的字母数字结果。我还没有走那么远,但如果你也看到我做错了什么,我将不胜感激。
如果您多格式化 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
值在这种情况下会产生意想不到的结果(我发布的代码已经说明了这一点)。您可能还会遇到某些 unicode 空格填充字符数的问题。另一种可能性是 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'。