如何动态自定义查询?

时间:2010-01-03 21:06:44

标签: vb.net sqlite system.data.sqlite

我正在vb.net上的一个数据库中工作,sqlite主持一个画廊,我想扩大搜索范围。

这是实际的查询字符串:

"SELECT images.*
FROM images 
JOIN nodes 
ON images.id = nodes.image_id 
WHERE tag_id = (SELECT tags.id 
                FROM tags 
                WHERE tag = '" & tagname & "') 
ORDER BY images." & sort & " " & order & ""

但它只能搜索一个描述性标记(标记名)并对图像进行排序而已。

我想过滤图像ext(table = images.ext)或一个或多个参数的结果......例如:

如果用户搜索“cars ext:jpg width> 500”,数据库将返回所有标记为“cars”的图像,其扩展名为jpg且宽度大于500 px。

请帮助D =

4 个答案:

答案 0 :(得分:1)

首先,这段代码很危险。它对SQL Injection攻击持开放态度。您不应该只是将类似的字符串值附加到查询字符串。相反,您应该使用参数化查询。

关于您的具体问题,您应该检查搜索的输入,并根据输入生成查询的特定部分,并在必要时对其进行参数化。

例如,如果必须对扩展进行过滤,则在包含join子句的变量中向扩展表添加连接,并在包含where子句的变量中对连接表进行过滤(同样作为适当的参数和参数值)。

然后,最后,您将查询的各个部分(以及查询参数)连接在一起并执行它。

答案 1 :(得分:0)

如果我正确理解了这个问题,你只想建立一个查询字符串。你尝试过这样的事吗?

SQLcommand.CommandText =“SELECT images。* FROM images JOIN nodes ON images.id = nodes.image_id WHERE tag_id =(SELECT tags.id FROM tags WHERE tag ='”& tagname&“')AND images。 Ext ='“&分机和“'和宽度>”&宽度和宽度“订购图像。” &安培;排序& “”&订单和“”

答案 2 :(得分:0)

首先,如果该输入来自用户,请不要连接这样的字符串,因为SQL Injection

可以成功

使用SQL参数是一种避免注入的方法:

command.CommandText = "SELECT images.* " &_
                      "FROM images " &_
                      "JOIN nodes " &_
                      "ON images.id = nodes.image_id " &_
                      "WHERE tag_id = (SELECT tags.id " &_
                                      "FROM tags " &_
                                      "WHERE tag = @tag)"

您可以将其扩展为:

command.CommandText = "SELECT images.* " &_
                      "FROM images " &_
                      "JOIN nodes " &_
                      "ON images.id = nodes.image_id " &_
                      "WHERE tag_id = (SELECT tags.id " &_
                                      "FROM tags " &_
                                      "WHERE tag = @tag)"

command.Parameters.AddWithValue("@tag", searchTag)


If Not String.IsNullOrEmpty(searchExt) Then
    command.CommandText = command.CommandText & " AND images.ext = @imageExt"
    command.Parameters.AddWithValue("@imageExt", searchExt)
EndIf

If Not String.IsNullOrEmpty(searchWidth) Then
    command.CommandText = command.CommandText & " AND images.width > @imageWidth"
    command.Parameters.AddWithValue("@imageWidth", searchWidth)
EndIf

答案 3 :(得分:-2)

单独构建WHERE子句并将其添加到查询中。

where="1"
if tagname<>"" then where=where & " AND tag='" & tagname & "'"
...
"SELECT images.*
FROM images 
JOIN nodes 
ON images.id = nodes.image_id 
WHERE tag_id = (SELECT tags.id 
                FROM tags 
                WHERE " & where & " ) 
ORDER BY images." & sort & " " & order & ""