Sql最大错误[关闭]
Posted
技术标签:
【中文标题】Sql最大错误[关闭]【英文标题】:Sql Biggest error [closed] 【发布时间】:2014-09-17 09:56:19 【问题描述】:我在 SQL 查询中遇到问题。当我们必须搜索多个字段时,我们使用 AND 运算符,但当其中一个字段为空时,它不会显示任何值。 例如:-
Select * from table_name
where Party_name='"+ textbox.text &"'
And No='"+ Textbox2.text &"'"
当其中一个字段为空时,它没有显示任何值。请帮助我!
【问题讨论】:
您是说当一个字段为空时您不想对该字段进行过滤吗?使用一些逻辑来识别它,并且当它为空时不要将它添加到 SQL 字符串中 【参考方案1】:以下是实现可选过滤器的方法:
Dim sql = <sql>
SELECT *
FROM MyTable
WHERE (@Column1A IS NULL OR Column1 = @Column1B)
AND (@Column2A IS NULL OR Column2 = @Column2B)
</sql>
command.CommandText = sql.Value
Dim filter1 = If(TextBox1.TextLength = 0, CObj(DBNull.Value), TextBox1.Text)
Dim filter2 = If(TextBox2.TextLength = 0, CObj(DBNull.Value), TextBox2.Text)
With command.Parameters
.Add("@Column1A", OleDbType.VarChar, 50).Value = filter1
.Add("@Column1B", OleDbType.VarChar, 50).Value = filter1
.Add("@Column2A", OleDbType.VarChar, 50).Value = filter2
.Add("@Column2B", OleDbType.VarChar, 50).Value = filter2
End With
首先,注意使用 XML 文字使 SQL 代码更具可读性。其次,注意使用参数将值插入代码而不是字符串连接。
至于实际的过滤,我们来看一对参数:
@Column1A IS NULL OR Column1 = @Column1B
如果TextBox1
为空,则@Column1A
和@Column1B
都设置为NULL
。这意味着第一个条件为真并且每一行都匹配,有效地忽略了该过滤器。如果TextBox1
不为空,则第一个条件为假,只有第二个条件为真的那些行才会匹配,从而尊重该过滤器。
值得注意的是,您需要四个参数,因为您使用的是 Access。 Jet 和 ACE OLE DB 提供程序使用位置参数,即使您使用名称。这意味着一个OleDbParameter
不能用于多个SQL 参数。如果您使用的是 SQL Server,那么两个参数就足够了,因为每个参数都可以使用两次,即
Dim sql = <sql>
SELECT *
FROM MyTable
WHERE (@Column1 IS NULL OR Column1 = @Column1)
AND (@Column2 IS NULL OR Column2 = @Column2)
</sql>
command.CommandText = sql.Value
Dim filter1 = If(TextBox1.TextLength = 0, CObj(DBNull.Value), TextBox1.Text)
Dim filter2 = If(TextBox2.TextLength = 0, CObj(DBNull.Value), TextBox2.Text)
With command.Parameters
.Add("@Column1", SqlDbType.VarChar, 50).Value = filter1
.Add("@Column2", SqlDbType.VarChar, 50).Value = filter2
End With
【讨论】:
非常感谢它的工作.........以上是关于Sql最大错误[关闭]的主要内容,如果未能解决你的问题,请参考以下文章