注册 登录
编程论坛 VB6论坛

求教一条VB 数据库语句

ictest 发布于 2017-08-07 00:50, 3024 次点击
两个问题
1、想在   Adodc1.RecordSource = "select * from pingjunzhi where   语句后添加如下条件,这条语句怎么写?
日期   between   Text1.Text  和  Text7.Text  之间
品种名  =  Text2.Text
批号    =  Text3.Text
文件名  =  Text4.Text
参数名  =  Text5.Text
Site号  =  Text6.Text

2、什么符号是数据库里的通配符?也就是说文本框内填写什么符号,发出筛选命令后它是显示所有的。
举例说明:
数据库里有一项“批号”列,内有数字“1”、“2”、“3”、“4”、“5”,在筛选文本框内填写数字,DataGrid中“批号”列就显示相应数字的那一行,
现想在筛选文本框内填写一个符号(不知是* 还是%,或者其他符号),“批号”列就显示是数字“1”、“2”、“3”、“4”、“5”的行(也就是所有行)。

14 回复
#2
ZHRXJR2017-08-07 08:45
日期 、品种名 、批号 、文件名 、参数名  、Site号  各字段的数据类型不同,SQL语句是不一样的。
你的主要目的是实现什么查询,显示一个行与显示多行SQL语句也是不同的,不清楚你到底需要什么。
查询条件太多,有可能一个数据都不会查询到。
#3
xiangyue05102017-08-07 09:02
以下是引用ictest在2017-8-7 00:50:00的发言:

两个问题
1、想在   Adodc1.RecordSource = "select * from pingjunzhi where   语句后添加如下条件,这条语句怎么写?
日期   between   Text1.Text  和  Text7.Text  之间
品种名  =  Text2.Text
批号    =  Text3.Text
文件名  =  Text4.Text
参数名  =  Text5.Text
Site号  =  Text6.Text

2、什么符号是数据库里的通配符?也就是说文本框内填写什么符号,发出筛选命令后它是显示所有的。
举例说明:
数据库里有一项“批号”列,内有数字“1”、“2”、“3”、“4”、“5”,在筛选文本框内填写数字,DataGrid中“批号”列就显示相应数字的那一行,
现想在筛选文本框内填写一个符号(不知是* 还是%,或者其他符号),“批号”列就显示是数字“1”、“2”、“3”、“4”、“5”的行(也就是所有行)。

这些都是最基本的东西,自己看一下教材。
1. 多条件查询,查询条件用and串起来。下面是一个时间区间的例子
select * from table where date between '2007-10-01' and '2008-10-01'
或者
select * from table where date>'2007-10-01' and date<'2008-10-01'
2. 通配符, % 。 具体还是去看教材。
#4
ZHRXJR2017-08-07 09:15

比如 日期   between,就以日期为字段名,并且日期的数据类型是日期时间数据,数据库是Access数据库,那么查询 Text1.Text  和  Text7.Text  之间的数据的SQL语句是:
SQL = "Select * From pingjunzhi Where 日期>=#" & CDate(Text1.Text) & "# And 日期<= #" & CDate(Text7.Text) & "#"
#5
ictest2017-08-07 15:24
对不起,我的意思没有表达清楚,我想表达的意思应该是:多条件多种组合查询。
比如数据库的结构是:
日期  、 品种名  、批号   、文件名  、参数名  、Site号 、数值
首先确定的是 日期(between   Text1.Text  和  Text7.Text  之间)是必选条件,
接下来
有可能只筛选满足 日期(between   Text1.Text  和  Text7.Text  之间)的数据,
也可能会筛选满足 品种名(=Text2.Text)、批号 (=Text3.Text)、文件名(=  Text4.Text)、参数名(=  Text5.Text)、Site号(=  Text6.Text)组合条件的数据;
也可能会筛选满足 品种名(=Text2.Text)、参数名(=  Text5.Text)、Site号(=  Text6.Text)组合条件的数据;
也可能会筛选满足 品种名(=Text2.Text)、批号 (=Text3.Text)、Site号(=  Text6.Text)组合条件的数据;
        .
        .
        .
        .
        .
        .
不知道 Adodc1.RecordSource = "select * from pingjunzhi where 语句后如何添加各种筛选条件组合,求教各位大神和版主大大这条语句怎么写?

[此贴子已经被作者于2017-8-7 15:25编辑过]

#6
xyxcc1772017-08-07 15:38
可以的,如果这样,就引用ADO更灵活.
#7
ictest2017-08-07 16:15
求教这段语句怎么写?谢谢!
#8
chen35232017-08-07 16:53
有可能就是有条件对吧?
设置条件判断判断语句,在什么情况下用条件1,什么情况下用条件2…
4楼的日期判断语句正确了,后面的用"and "连接上就行了。
#9
风吹过b2017-08-07 17:09
日期   between   Text1.Text  和  Text7.Text  之间
品种名  =  Text2.Text
批号    =  Text3.Text
文件名  =  Text4.Text
参数名  =  Text5.Text
Site号  =  Text6.Text

s1= "日期>=#" & CDate(Text1.Text) & "# And 日期<= #" & CDate(Text7.Text) & "#"

if len(trim(text2.text))>0 then            '去空格,计算长度是否大于0,判断是否有内容
s1=s1 & " and  品种名 = '" & trim(text2.text) & "'"            '生成本次的条件,并且连接进总条件中
end if

以下类似。每一个条件判断一次,附加一段判断命令。
最后


sql="Select * From pingjunzhi "        '无任何条件的查询命令
if len(s1)>0 then                     '有查询条件
sql =sql  & " Where " & s1            '把条件组合进去
end if
#10
xiangyue05102017-08-07 17:25
以下是引用ictest在2017-8-7 15:24:30的发言:

对不起,我的意思没有表达清楚,我想表达的意思应该是:多条件多种组合查询。
比如数据库的结构是:
日期  、 品种名  、批号   、文件名  、参数名  、Site号 、数值
首先确定的是 日期(between   Text1.Text  和  Text7.Text  之间)是必选条件,
接下来
有可能只筛选满足 日期(between   Text1.Text  和  Text7.Text  之间)的数据,
也可能会筛选满足 品种名(=Text2.Text)、批号 (=Text3.Text)、文件名(=  Text4.Text)、参数名(=  Text5.Text)、Site号(=  Text6.Text)组合条件的数据;
也可能会筛选满足 品种名(=Text2.Text)、参数名(=  Text5.Text)、Site号(=  Text6.Text)组合条件的数据;
也可能会筛选满足 品种名(=Text2.Text)、批号 (=Text3.Text)、Site号(=  Text6.Text)组合条件的数据;
        .
        .
        .
        .
        .
        .
不知道 Adodc1.RecordSource = "select * from pingjunzhi where 语句后如何添加各种筛选条件组合,求教各位大神和版主大大这条语句怎么写?

对啊,就是我说的用AND把多种条件串起来啊,如果不确定是不是一定有条件的话,那么可以这样写
程序代码:

sqltxt="select * from Table1 where  1=1 "   '这里利用1=1 这个必然成立的条件作为第一个条件,后面直接串起来就可以,不用判断是否要加AND
if  Text3.Text<>"" then  sqltxt =sqltxt & "And 批号=" & Text3.Text
……
#11
ZHRXJR2017-08-08 03:39
以下是引用ictest在2017-8-7 15:24:30的发言:

对不起,我的意思没有表达清楚,我想表达的意思应该是:多条件多种组合查询。
比如数据库的结构是:
日期  、 品种名  、批号   、文件名  、参数名  、Site号 、数值
首先确定的是 日期(between   Text1.Text  和  Text7.Text  之间)是必选条件,
接下来
有可能只筛选满足 日期(between   Text1.Text  和  Text7.Text  之间)的数据,
也可能会筛选满足 品种名(=Text2.Text)、批号 (=Text3.Text)、文件名(=  Text4.Text)、参数名(=  Text5.Text)、Site号(=  Text6.Text)组合条件的数据;
也可能会筛选满足 品种名(=Text2.Text)、参数名(=  Text5.Text)、Site号(=  Text6.Text)组合条件的数据;
也可能会筛选满足 品种名(=Text2.Text)、批号 (=Text3.Text)、Site号(=  Text6.Text)组合条件的数据;

不知道 Adodc1.RecordSource = "select * from pingjunzhi where 语句后如何添加各种筛选条件组合,求教各位大神和版主大大这条语句怎么写?

Adodc1.RecordSource = "select * from pingjunzhi where between>=#" & CDate(Text1.Text) & "# And between<=#" & CDate(Text2.Text) & "# Or 品种名='" & Text2.Text & "' Or 批号='" & Text3.Text & "' Or 文件名='" & Text4.Text & "' Or 参数名='" & Text5.Text & "' Or Site号='" & Text6.Text & "'"
日期(between   Text1.Text  和  Text7.Text  之间)是必选条件,也就是这个条件是必须满足的,而 品种名=Text2.Text、批号=Text3.Text、文件名=Text4.Text、参数名=Text5.Text、Site号=Text6.Text 是有可能满足也有可能不满足,关键字And是与的关系,是必须满足的条件,关键字Or是或的关系,就是可以满足条件,也可能不满足条件
那么在程序执行时,首先查找满足And的条件的记录,然后查找满足Or的条件的记录 品种名=Text2.Text 的记录,如果这个条件存在(即满足),再查找 批号=Text3.Text,以此类推;
如果 品种名=Text2.Text 这个条件不存在(即不满足),程序会停止查找记录,返回前面已经查找到的记录。

[此贴子已经被作者于2017-8-8 03:42编辑过]

#12
ictest2017-08-08 17:11
恕我驽钝,我是这样写的:
程序代码:
Dim s1 As String
Dim s2 As String
Dim s3 As String
Dim s4 As String
Dim s5 As String

If Len(Trim(Text2.Text)) > 0 Then         
Text11.Text = " 品种名 = '" & Trim(Text2.Text) & "'"  
Else
Text11.Text = " 1=1 "
End If

If Len(Trim(Text3.Text)) > 0 Then      
Text12.Text = " 批号 = '" & Trim(Text3.Text) & "'"     
Else
Text12.Text = " 2=2 "
End If

If Len(Trim(Text4.Text)) > 0 Then   
Text13.Text = " 文件名 = '" & Trim(Text4.Text) & "'"     
Else
Text13.Text = " 3=3 "
End If

If Len(Trim(Text5.Text)) > 0 Then     
Text14.Text = " 参数名 = '" & Trim(Text5.Text) & "'"   
Else
Text14.Text = " 4=4 "
End If

If Len(Trim(Text6.Text)) > 0 Then     
Text15.Text = " Site号 = '" & Trim(Text6.Text) & "'"     
Else
Text15.Text = " 5=5 "
End If

Adodc1.RecordSource = "Select * From pingjunzhi Where 日期>=#" & CDate(Text1.Text) & "# And 日期<= #" & CDate(Text7.Text) & "# 'and " & (Text11.Text) & " and " & (Text12.Text) & " and " & (Text13.Text) & " and " & (Text14.Text) & " and " & (Text15.Text) & ""
  Adodc1.Refresh
  Set DataGrid1.DataSource = Adodc1


如果只选择两个日期范围,其他的(Text2.Text~Text6.Text)为空,则报如下错误:
只有本站会员才能查看附件,请 登录

如果(Text1.Text~Text7.Text)全有内容,且这些数据在数据库中确实存在,则报如下错误:
只有本站会员才能查看附件,请 登录


实在不知哪里错了,恳求各位教教我!谢谢!
#13
xyxcc1772017-08-08 17:41
Dim s1 As String
Dim s2 As String
Dim s3 As String
Dim s4 As String
Dim s5 As String
Dim sql As String
If Text1.Text="" or Text7.Text="" Then
  msgbox( "请填写日期!",16)
  Exit sub
End If

sql="Select * From pingjunzhi Where 日期>=#" & CDate(Text1.Text) & "# And 日期<= #" & CDate(Text7.Text) & "# "
If Len(Trim(Text2.Text)) > 0 Then         
sql= sql & "  and 品种名 = '" & Trim(Text2.Text) & "'"  
End If

If Len(Trim(Text3.Text)) > 0 Then      
sql= sql & " and  批号 = '" & Trim(Text3.Text) & "'"     
End If

If Len(Trim(Text4.Text)) > 0 Then   
sql= sql & " 文件名 = '" & Trim(Text4.Text) & "'"     
End If

If Len(Trim(Text5.Text)) > 0 Then     
sql =sql & "  and 参数名 = '" & Trim(Text5.Text) & "'"   
End If

If Len(Trim(Text6.Text)) > 0 Then     
sql = sql & " and  Site号 = '" & Trim(Text6.Text) & "'"     
End If

Adodc1.RecordSource = sql
  Adodc1.Refresh
  Set DataGrid1.DataSource = Adodc1
#14
xyxcc1772017-08-08 18:08
发完有个错误,,在文件名前加and
#15
ZHRXJR2017-08-09 08:57
回复 12楼 ictest
你的这些判断根本不是SQL语句,因此产生错误是不可避免的。稍稍给你修改一下:
程序代码:
Dim SQL1 AS String
SQL1= " Select * From pingjunzhi Where 日期>=#" & CDate(Text1.Text) & "# And 日期<= #" & CDate(Text7.Text) & "#" '这个语句是检测日期范围的
If Len(Trim(Text2.Text)) > 0 Then         
SQL1 = SQL1 & = " And 品种名 = '" & Trim(Text2.Text) & "'"  '如果Text2.Text不为空,检测 “品种名” 字段的值
End If
If Len(Trim(Text3.Text)) > 0 Then      
SQL1 = SQL1 & = " And  批号 = '" & Trim(Text3.Text) & "'"   '如果Text3.Text不为空,检测 “批号” 字段的值   
End If
If Len(Trim(Text4.Text)) > 0 Then   
SQL1 = SQL1 & = " And  文件名 = '" & Trim(Text4.Text) & "'"     '如果Text4.Text不为空,检测 “文件名” 字段的值   
End If
If Len(Trim(Text5.Text)) > 0 Then     
SQL1 = SQL1 & = " And  参数名 = '" & Trim(Text5.Text) & "'"        '如果Text5.Text不为空,检测 “参数名” 字段的值
End If
If Len(Trim(Text6.Text)) > 0 Then     
SQL1 = SQL1 & = " And  Site号 = '" & Trim(Text6.Text) & "'"      '如果Text6.Text不为空,检测 “Site号” 字段的值   
End If
'以上判断可以是一个文本框有值,也可以是二个文本框有值.......,同样可以是全部文本框有值,有值按条件查询,
'
如果没有值,就会跳过这个文本框的查询SQL语句
Adodc1.RecordSource = SQL1    '这才是Adodc1控件连接的SQL语句,不会再出错,除非文本框填写的内容在数据表中找不到,这样就没有记录显示在 DataGrid1 控件中。
  Adodc1.Refresh
  Set DataGrid1.DataSource = Adodc1
1