| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1454 人关注过本帖, 1 人收藏
标题:ADO 查询语法问题
只看楼主 加入收藏
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
结帖率:97.66%
收藏(1)
已结贴  问题点数:20 回复次数:8 
ADO 查询语法问题
如果说要查询时间并列出到Combobox内~

要怎么才能只用ADO查询~
就能让年和月放在两个不同的Combox内(资料内月份不一定固定是从1~12)?

还是只能查询完全部年和月后再用程式语法去切割年和月?

图片附件: 游客没有浏览图片的权限,请 登录注册


但是原始资料中时间格式为:

MONTH
201201
201201
201202
201202
201202
201202
201202
201202
201202
201202
201202
201202
201202
201202
201202
201203
201203
201203
201203
201203
201204
201204
201310
201310
201310
201310
201310
201310
201310
201310
201310
201310
201310
201310
201411
201411
201411
201411
201411
201411
201411
201411
201411
201411
搜索更多相关主题的帖子: 切割 资料 
2017-02-09 14:07
xiangyue0510
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:86
帖 子:938
专家分:5244
注 册:2015-8-10
收藏
得分:0 
查询完之后分割还是查询的时候直接分割都是可以的。
1. 你的日期格式是同意的,所以可以直接用left函数, SQL中支持的,“Select left([日期],4) From 记录”。 VB中更没有问题了。
2. 利用SQL日期函数,Year,Month 。“Select Year([日期]) From [记录]”或  “Select Month ([日期]) From [记录]”即可
但是由于你的日期不是标准的yyyymmdd,而是yyymm,所以在查询的时候处理一下,否则201101会被当成2020/11/01,而不是2011/01/**。
字段后面加上01就可以了,也就是每月的第一天。
SELECT year(concat([日期] , '01' )) From [记录]   此方法不改变原来的数据记录,只操作数据集
或者
update [记录] set [日期] = [日期] + '01'
Select Year([日期]) From [记录]
此方法会改变原来的数据记录
VB中也有日期函数。
2017-02-09 14:55
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
收藏
得分:0 
我是这样写,用程式去过滤资料,只是不知道能不能使用ADO直接找出来~
这是ADO查询EXCEL不是ADO查询SQL~

程序代码:
Private Sub ComboTime_GotFocus(Index As Integer)
Dim First As String, Second As String
Dim i As Integer, year As Integer

    ComboTime(Index).Clear
    
    Set rs = New ADODB.Recordset
    rs.Open "SELECT " + Title(3) + " FROM [" & SheetName & "$] group by " + Title(3), cn, adOpenStatic
    
    For i = 0 To rs.RecordCount - 1
        If Index = 0 Then
            If i = 0 Then
                ComboTime(Index).AddItem " "
                First = Mid$(rs.Fields.Item(Title(3)), 1, 4)
            ElseIf i = rs.RecordCount - 1 Then
                Second = Mid$(rs.Fields.Item(Title(3)), 1, 4)
            End If
        Else
            If ComboTime(0).Text <> "" Then
                year = CInt(ComboTime(0).Text)
                If i = 0 Then
                    ComboTime(Index).AddItem " "
                End If
                If Mid$(rs.Fields.Item(Title(3)), 1, 4) = year Then
                    ComboTime(Index).AddItem Mid$(rs.Fields.Item(Title(3)), 5)
                End If
            End If
        End If
        rs.MoveNext
    Next i
    
    If Index = 0 Then
        For i = CInt(First) To CInt(Second)
            ComboTime(Index).AddItem i
        Next i
    End If
    
End Sub

不要選我當版主
2017-02-09 15:24
ZHRXJR
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:125
帖 子:1034
专家分:5519
注 册:2016-5-10
收藏
得分:10 
回复 楼主 wube
这个问题其实不难,一个数组就可以解决问题,看下面代码:
程序代码:
Dim cn As New ADODB.Connection, RS As New ADODB.Recordset, DDX As Integer, NYFX() As String, I As Integer

Private Sub Combo1_Click()
Combo2.Clear    '清除月份记录
For I = 1 To DDX    '循环,循环范围是不重复记录的记录数
    If Left(NYFX(I), 4) = Combo1.Text Then    '判断不重复记录的记录数的前四个字符是否与年份相同
        Combo2.AddItem Right(NYFX(I), 2)    '如果相同加载月份数,月份是不重复记录的记录数的后二个字符
    End If
Next I
End Sub

Private Sub Form_Load()
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\MONTH.mdb;Persist Security Info=False"           '2003数据库连接,如果是其他数据库修改即可
RS.Open "select Distinct MONTHS from MONTHX ", cn, 3, 2    'Distinct 关键字是筛选不重复的记录
DDX = RS.RecordCount    '得到不重复记录的记录数
ReDim NYFX(1 To DDX)    '设置不重复记录的记录的下标
For I = 1 To DDX
NYFX(I) = RS!MONTHS    '将不重复记录的记录放在数组变量NYFX(I)中
RS.MoveNext
Next I
RS.Close
cn.Close
Combo1.Clear
Combo2.Clear
For I = 2012 To 2014   '设置年份,可以修改年份范围
Combo1.AddItem I
Next I
End Sub

图片附件: 游客没有浏览图片的权限,请 登录注册
这个是数据表的记录
图片附件: 游客没有浏览图片的权限,请 登录注册
这个是运行情况

请不要选我!!!
2017-02-09 22:04
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:10 
这个应该可以用两个查询语句完成,首先做年的查询,代码如下:
rs.Open "SELECT left(" + Title(3) + ",4) as nian FROM [" & SheetName & "$] group by left(" + Title(3) + ",4)", cn, adOpenStatic
ComboTime(0).clear
while not rs.eof
  ComboTime(0).additem rs("nian") '这样会将你示例数据的2012、2013、2014添加进用来表示年的combbox里
  rs.movenext
wend

在ComboTime_click事件里写下述代码,可以把选择的年份包含的月份添加进另一个combbox里

private sub ComboTime_click(Index As Integer)
  if index=0 then
    rs.Open "SELECT right(" + Title(3) + ",2) as yue FROM [" & SheetName & "$] where "+Title(3)+"like " + combotime(0) + "* group by right(" + Title(3) + ",2)", cn, adOpenStatic
    ComboTime(1).clear
    while not rs.eof
      ComboTime(1).additem rs("yue") '这样会将你示例数据相应年份所包含的月份添加进用来表示月的combbox里,如2012年就只有01至04
      rs.movenext
    wend
  endif
end sub
2017-02-10 10:54
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
收藏
得分:0 
以下是引用xzlxzlxzl在2017-2-10 10:54:53的发言:

这个应该可以用两个查询语句完成,首先做年的查询,代码如下:
rs.Open "SELECT left(" + Title(3) + ",4) as nian FROM [" & SheetName & "$] group by left(" + Title(3) + ",4)", cn, adOpenStatic
ComboTime(0).clear
while not rs.eof
  ComboTime(0).additem rs("nian") '这样会将你示例数据的2012、2013、2014添加进用来表示年的combbox里
  rs.movenext
wend
 
在ComboTime_click事件里写下述代码,可以把选择的年份包含的月份添加进另一个combbox里
 
private sub ComboTime_click(Index As Integer)
  if index=0 then
    rs.Open "SELECT right(" + Title(3) + ",2) as yue FROM [" & SheetName & "$] where "+Title(3)+"like " + combotime(0) + "* group by right(" + Title(3) + ",2)", cn, adOpenStatic
    ComboTime(1).clear
    while not rs.eof
      ComboTime(1).additem rs("yue") '这样会将你示例数据相应年份所包含的月份添加进用来表示月的combbox里,如2012年就只有01至04
      rs.movenext
    wend
  endif
end sub

好像不行~但是不知道哪里有问题~
程序代码:
Dim cn As New ADODB.Connection, RS As New ADODB.Recordset, DDX As Integer, NYFX() As String, I As Integer

Private Sub A()
    RS.Open "SELECT left(" + "MONTH" + ",4) as nian FROM [" & "RawData" & "$] group by left(" + "MONTH" + ",4)", cn, adOpenStatic
    ComboTime(0).Clear
    While Not RS.EOF
        ComboTime(0).AddItem RS("nian")
        RS.MoveNext
    Wend
    Set RS = Nothing
End Sub

Private Sub ComboTime_Click(Index As Integer)
Dim Title(3) As String

    Title(3) = "MONTH"
    If Index = 0 Then
        RS.Open "SELECT right(" + Title(3) + ",2) as yue FROM [" & SheetName & "$] where " + Title(3) + " like " + ComboTime(0).Text + "* group by right(" + Title(3) + ",2)", cn, adOpenStatic
        ComboTime(1).Clear
        While Not RS.EOF
            ComboTime(1).AddItem RS("yue")
            RS.MoveNext
        Wend
        Set RS = Nothing
    End If
End Sub

Private Sub Form_Load()
    cn.Open "Data Source=" + App.Path + "\11111.xlsx" + ";" + "Provider=" + "Microsoft.ACE.OLEDB.12.0;" + "Extended Properties=" + "'Excel 12.0;" + "HDR=" + "Yes" + "IMEX=" + "1';"
    Call A
End Sub

图片附件: 游客没有浏览图片的权限,请 登录注册


图片附件: 游客没有浏览图片的权限,请 登录注册


不要選我當版主
2017-02-15 18:05
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:0 
我用你的数据做个示范工程供参考,不知道是不是你想要的效果,效果图如下:
图片附件: 游客没有浏览图片的权限,请 登录注册

示范工程:
adoExcel.rar (13.09 KB)

所有代码如下:
程序代码:
Dim con As New ADODB.Connection
Private Sub addyue()
  '添加年份对应的月份
  Dim rs As New Recordset, sql As String
  Combo2.Clear
  If Trim(Combo1) = "" Then Exit Sub
  sql = "select right([month],2) as yue from [sheet1$] where [month] like '" & Combo1 & "%' group by right([month],2)"
  rs.Open sql, con, adOpenStatic, adLockOptimistic
  If rs.State = 0 Then
    MsgBox "记录集打开失败"
    End
  End If
  While Not rs.EOF
    Combo2.AddItem rs.Fields("yue")
    rs.MoveNext
  Wend
  If Combo2.ListCount > 0 Then Combo2 = Combo2.List(0)
  rs.Close
End Sub

Private Sub Combo1_Click()
  '点击选择年份更改combo2中相应年份对应的月份
  addyue
End Sub

Private Sub Form_Load()
  Dim rs As New ADODB.Recordset, sql As String
  'con.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & App.Path & "\aaaa.xlsx;Extended Properties='Excel 12.0;HDR=YES;IMEX=1';Persist Security Info=False"  '连接2007以上版本用
  con.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\aaaa.xls;Extended Properties='Excel 8.0;HDR=YES;IMEX=1';Persist Security Info=False"
  con.CursorLocation = adUseClient
  If con.State = 0 Then
    MsgBox "excel打开失败!"
    End
  End If
  sql = "Select left([month],4) as nian from [Sheet1$] group by left([month],4)"
  rs.Open sql, con, adOpenStatic, adLockOptimistic
  If rs.State = 0 Then
    MsgBox "记录集打开失败"
    End
  End If
  Combo1.Clear
  While Not rs.EOF
    Combo1.AddItem rs.Fields("nian")  '添加不重复的年份
    rs.MoveNext
  Wend
  If Combo1.ListCount > 0 Then Combo1 = Combo1.List(0)
  rs.Close     '关闭记录集对象
  addyue
End Sub
2017-02-15 20:28
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
收藏
得分:0 
以下是引用xzlxzlxzl在2017-2-15 20:28:49的发言:

我用你的数据做个示范工程供参考,不知道是不是你想要的效果,效果图如下:
 
示范工程:
 
所有代码如下:
Dim con As New ADODB.Connection
Private Sub addyue()
  '添加年份对应的月份
  Dim rs As New Recordset, sql As String


1.工程可以正常执行,所以之前无法运行的原因是?
2.因为资料上日期栏位名称为MONTH,但是month预设是DateTime的Members,所以在Rignt()内写MONTH都会自动变成month,
  所以 left([month],4) 和 right([month],2) 内的month是指兰为名称还是VB6参数?
3."nian"(年) 和 "yue"(月) 是ADO内建可辨识参数吗?


不要選我當版主
2017-02-16 19:17
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:0 
回复 8楼 wube
我觉得你应该自己找的到原因!
1、之前不能正常运行是因为原来的sql语句的模糊匹配我用的是*号,实际上这是access的sql用法,ado的sql语句应该用%(like '" & Combo1 & "%')
2、month的确是sql的关键字,所以作为字段名,为区分就用[]括起来,即[month],这样就会作为栏位名(字段名)
3、nian和yue是自定义的名称,可依据你自己的习惯写。由于该栏位值是通过计算得到的,已经不是原栏位名称所指向的值了,所以如果你没有指定一个名称,sql会默认一个名称,默认的是什么,我也忘了,你可以自己试验。
收到的鲜花
  • wube2017-02-17 23:33 送鲜花  10朵   附言:好文章
2017-02-16 19:56
快速回复:ADO 查询语法问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021847 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved