Board logo

标题: [问题求助] vbs访问Access数据库查询语句中where报错是什么原因 [打印本页]

作者: waiter_bat    时间: 2016-7-21 00:39     标题: vbs访问Access数据库查询语句中where报错是什么原因

本帖最后由 pcl_test 于 2016-7-21 17:51 编辑
  1. Dim objConnection                          'CONNECTION对象实例
  2. Dim objRecordSet                                   'RECORDSET对象实例        
  3. Dim objCommand                                '命令对象实例
  4. Dim strConnectionString                        '连接字符串
  5. Dim Tsql                                       'sql操作
  6. Dim MyArray()                                  '数组(存储表有多少列名)
  7. ' ********************************************************************
  8. ' 函数说明:连接数据库;
  9. ' 参数说明:(1)strDBType(数据库类型:如ORACEL;DB2;SQL;ACCESS)
  10. '           (2)strDBAlias(数据库别名)
  11. '           (3)strUID(用户名)
  12. '           (4)strPWD(密码)
  13. '           (5)strIP(数据库IP地址:仅SQL SERVER 使用)
  14. '           (6)strLocalHostName(本地主机名:仅SQL SERVER 使用)
  15. '           (7)strDataSource(数据源:仅ACCESS使用;如d:\yysc.mdb)
  16. ' 返回结果:无
  17. ' 调用方法: ConnectDatabase(strDBType, strDBAlias, strUID, strPWD, strIP, strLocalHostName, strDataSource)
  18. ' ********************************************************************
  19. Sub ConnectDatabase(strDBType, strDBAlias, strUID, strPWD, strIP, strLocalHostName, strDataSource)
  20.     Set objConnection = CreateObject("ADODB.CONNECTION")                '1 - 建立CONNECTION对象的实例
  21.      
  22.     Select Case UCase(Trim(strDBType))
  23.         Case "ORACLE"
  24.             strConnectionString = "Driver={Microsoft ODBC for Oracle};Server=" & strDBAlias & ";Uid="_
  25.                 & strUID & ";Pwd=" & strPWD & ";"                                '2 - 建立连接字符串
  26.             objConnection.Open strConnectionString                                '3 - 用Open 方法建立与数据库连接
  27.         Case "DB2"
  28.             strConnectionString = "Driver={IBM DB2 ODBC DRIVER};DBALIAS=" & strDBAlias & ";Uid="_
  29.                 & strUID & ";Pwd=" & strPWD & ";"                                
  30.             objConnection.Open strConnectionString                                
  31.         Case "SQL"
  32.              strConnectionString = "DRIVER=SQL Server; SERVER=" & strIP & "; UID=" & strUID & "; PWD="_
  33.                  & strPWD & "; APP=Microsoft Office 2003;WSID=" & strLocalHostName & "; DATABASE=" & strDBAlias & ";"
  34.             objConnection.Open strConnectionString                                            
  35.         Case "ACCESS"
  36.             strConnectionString = "provider=Microsoft.ACE.OLEDB.12.0;data source=" & strDataSource &_
  37.                ";Jet OLEDB:Database Password=" & strPWD & ";" 'win7X64位 access驱动用
  38.             'strConnectionString = "provider=microsoft.jet.oledb.4.0;data source=" & strDataSource &_
  39.             '    ";Jet OLEDBatabase Password=" & strPWD & ";" ’'winXP access驱动用
  40.             objConnection.Open strConnectionString                                                  
  41.         Case Else
  42.             MsgBox "输入的数据库类型格式有误" & vbCrLf & "支持的数据库类型格式:ORACLE;DB2;SQL;ACCESS;EXCEL"
  43.     End Select
  44.      
  45.     If (objConnection.State = 0) Then
  46.         MsgBox "连接数据库失败!"
  47.     End If
  48.      
  49. End Sub
  50. ' ********************************************************************
  51. ' 函数说明:查询数据库(查询单列);
  52. ' 参数说明:  (1)strSql:SQL语句
  53. '           (2)strFieldName:字段名
  54. '           (3)str_Array_QueryResult:数组名(用来返回单列查询结果)
  55. ' 返回结果:  intArrayLength:查询数据库返回的记录行数
  56. '           str_Array_QueryResult:数组名(用来返回单列查询结果)
  57. ' 调用方法: intArrayLength = QueryDatabase(strSql, strFieldName, str_Array_QueryResult)
  58. ' ********************************************************************
  59. Function QueryDatabase(strSql, strFieldName, str_Array_QueryResult)
  60.     Dim intArrayLength                                                                                     '数组长度
  61.      Dim i
  62.     i = 0   
  63.     str_Array_QueryResult = Array()                                '重新初始化数组为一个空数组
  64.      
  65.     Set objRecordSet = CreateObject("ADODB.RECORDSET")                '4 - 建立RECORDSET对象实例
  66.     Set objCommand = CreateObject("ADODB.COMMAND")              '5 - 建立COMMAND对象实例
  67.     objCommand.ActiveConnection = objConnection
  68.     objCommand.CommandText = strSql
  69.         objRecordSet.CursorLocation = 3
  70.         objRecordSet.Open objCommand                            '6 - 执行SQL语句,将结果保存在RECORDSET对象实例中
  71.      
  72.     intArrayLength = objRecordSet.RecordCount                  '将查询结果的行数作为数组的长度
  73.      
  74.     If intArrayLength > 0 Then
  75.             ReDim str_Array_QueryResult(intArrayLength-1)
  76.             
  77.             Do While NOT objRecordSet.EOF                                                '将数据库查询的列值赋值给数组            
  78.                 str_Array_QueryResult(i) = objRecordSet(strFieldName)
  79.                 MsgBox str_Array_QueryResult(i)
  80.                 objRecordSet.MoveNext
  81.                 i = i + 1
  82.             Loop
  83.     Else
  84.             'ReDim str_Array_QueryResult(0)      
  85.             'str_Array_QueryResult(0) = ""     
  86.     End If
  87.     QueryDatabase = intArrayLength
  88. End Function
  89. ' ********************************************************************
  90. ' 函数说明:返回符合查询结果的列的长度
  91. ' 参数说明:(1)strSql:SQL语句
  92. ' 返回结果:返回符合查询结果的列的长度
  93. ' 调用方法: MaxLength = GetLenOfField(strSql)
  94. ' ********************************************************************
  95. Function GetLenOfField(strSql)
  96.     '如果SQL语句为空,则默认返回的列长度为0,结束函数;否则返回列的实际长度
  97.     If strSql = "" Then
  98.         GetLenOfField  = 0
  99.                 Exit Function
  100.     Else
  101.             Set objRecordSet = CreateObject("ADODB.RECORDSET")                        '4 - 建立RECORDSET对象实例
  102.             Set objCommand = CreateObject("ADODB.COMMAND")              '5 - 建立COMMAND对象实例
  103.             objCommand.ActiveConnection = objConnection
  104.             objCommand.CommandText = strSql
  105.                 objRecordSet.CursorLocation = 3
  106.                 objRecordSet.Open objCommand                                '6 - 执行SQL语句,将结果保存在RECORDSET对象实例中
  107.             
  108.             GetLenOfField = objRecordSet.RecordCount                              '返回符合查询结果的列的长度
  109.          
  110.                 Set objCommand = Nothing        
  111.                 Set objRecordSet = Nothing
  112.         End If
  113. End Function
  114. ' ********************************************************************
  115. ' 函数说明:返回符合查询结果的行的长度
  116. ' 参数说明:(1)strSql:SQL语句
  117. ' 返回结果:无
  118. ' 调用方法: count=GetLenght(strSql)
  119. ' ********************************************************************
  120. Function  GetLenght(strSql)
  121.         Dim objCommand
  122.         Dim objField        
  123.          
  124. If strSql = "" Then
  125.         GetLenght  = 0
  126.                 Exit Function
  127.     Else
  128.         Set objCommand = CreateObject("ADODB.COMMAND")
  129.         Set objRecordSet = CreateObject("ADODB.RECORDSET")
  130.         objCommand.CommandText = strSql
  131.         objCommand.ActiveConnection = objConnection
  132.         Set objRecordSet = objCommand.Execute
  133.         ii=0
  134.         Do Until objRecordSet.EOF
  135.                     For Each objField In objRecordSet.Fields
  136.                             ii=ii+1
  137.                     Next
  138.                     objRecordSet.MoveNext
  139.                     Debug.WriteLine
  140.         Loop
  141.          
  142.         GetLenght = ii
  143.         Set objCommand = Nothing
  144.         Set objRecordSet = Nothing
  145. End If                 
  146. End Function
  147. ' ********************************************************************
  148. ' 函数说明:返回符合查询结果的表的名称
  149. ' 参数说明:(1)strSql:SQL语句
  150. ' 返回结果:无
  151. ' 调用方法: Array()=GetArray(strSql)
  152. ' ********************************************************************
  153. Sub  GetArray(strSql)
  154.         Dim objCommand
  155.         Dim objField        
  156.         GetdataArray = Array()
  157.         hh = GetLenOfField(strSql) '列长
  158.         ll = GetLenght(strSql)     '行长
  159.         Set objCommand = CreateObject("ADODB.COMMAND")
  160.         Set objRecordSet = CreateObject("ADODB.RECORDSET")
  161.         objCommand.CommandText = strSql
  162.         objCommand.ActiveConnection = objConnection
  163.         Set objRecordSet = objCommand.Execute
  164.         Set objExcel = CreateObject("Excel.Application")
  165.         Set objWorkBook = objExcel.Workbooks.Open("d:\\1.xls")
  166.         Set objWorkSheet = objWorkBook.Sheets(1)
  167.         objExcel.Visible = False
  168.         k=1
  169.         ReDim GetdataArray(ll)
  170.         Do Until objRecordSet.EOF
  171.                     For Each objField In objRecordSet.Fields
  172.                     If k Mod (ll/hh)<> 0 Then
  173.                         GetdataArray(k-1)=objField.Name
  174.                         k=k+1
  175.                         Else
  176.                             GetdataArray(k-1)=objField.Name
  177.                             Exit Do
  178.                     End If
  179.                     Next
  180.                     objRecordSet.MoveNext
  181.         Loop
  182.          
  183.         For i=1 To ll/hh
  184.            objWorkSheet.cells(1,i)=GetdataArray(i-1)
  185.         Next
  186.         objExcel.Workbooks(1).Save
  187.         objExcel.Workbooks(1).Close
  188.         objExcel.Quit
  189.         Set objExcel = Nothing
  190.         Set objWorkBook = Nothing
  191.         Set objWorkSheet = Nothing
  192.         Set objCommand = Nothing
  193.         Set objRecordSet = Nothing              
  194. End Sub  
  195. ' ********************************************************************
  196. ' 函数说明:更新数据库;包括INSERT、DELETE 和 UPDATE操作
  197. ' 参数说明:(1)strSql:SQL语句
  198. ' 返回结果:无
  199. ' 调用方法: UpdateDatabase(strSql)
  200. ' ********************************************************************
  201. Sub UpdateDatabase(strSql)
  202.         Dim objCommand
  203.         Dim objField        
  204.         hh = GetLenOfField(strSql) '列长
  205.         ll = GetLenght(strSql)     '行长
  206.         Set objCommand = CreateObject("ADODB.COMMAND")
  207.         Set objRecordSet = CreateObject("ADODB.RECORDSET")
  208.         objCommand.CommandText = strSql
  209.         objCommand.ActiveConnection = objConnection
  210.         Set objRecordSet = objCommand.Execute
  211.         Set objExcel = CreateObject("Excel.Application")
  212.         Set objWorkBook = objExcel.Workbooks.Open("d:\\1.xls")
  213.         Set objWorkSheet = objWorkBook.Sheets(1)
  214.         objExcel.Visible = True
  215.          
  216.         i=1
  217.         ii=1
  218.         Do While NOT objRecordSet.EOF                                                '将数据库查询的列值赋值给EXECL            
  219.                 For ii=1 To ll/hh
  220.                 objWorkSheet.cells(i+1,ii) = objRecordSet(ii-1)
  221.                 Next
  222.                 objRecordSet.MoveNext
  223.                 i = i + 1
  224.             Loop
  225.          
  226.         objExcel.Workbooks(1).Save
  227.         'objExcel.Workbooks(1).Close
  228.         'objExcel.Quit
  229.         Set objExcel = Nothing
  230.         Set objWorkBook = Nothing
  231.         Set objWorkSheet = Nothing
  232.         Set objCommand = Nothing
  233.         Set objRecordSet = Nothing
  234.                  
  235. End Sub
  236. ' ********************************************************************
  237. ' 函数说明:关闭数据库连接;
  238. ' 参数说明:无
  239. ' 返回结果:无
  240. ' 调用方法: CloseDatabase()
  241. ' ********************************************************************
  242. Sub CloseDatabase()
  243.     objRecordSet.Close
  244.     objConnection.Close
  245.      
  246.     Set objCommand = Nothing
  247.     Set objRecordSet = Nothing
  248.     Set objConnection = Nothing
  249. End Sub
  250. Dim data1,data2
  251. data1= InputBox("请输入开始日期","提示","2016-06-01")
  252. If IsEmpty(data1) Then WScript.Quit
  253.     'MsgBox data1  显示输入日期
  254. data2= InputBox("请输入结束日期","提示","2016-07-01")
  255. If IsEmpty(data2) Then WScript.Quit
  256.     'MsgBox data2
  257.    
  258.    
  259.    
  260. Tsql ="select rfkh ,xfje From  lssj where xfzl='消费' and xfsj between '" & data1 & "' and '"& data2 &"'"  'dtmTargetDate >= dtmStartDate AND dtmTargetDate <= dtmEndDate
  261. 'Tsql ="select a.姓名 , a.当前余额,b.xf  from (select rfkh,ryxm as 姓名 ,rfye as 当前余额 From  ryxx) a left join "_
  262. ' &"(select rfkh ,max(xfje) as xf  From  lssj where xfzl='消费' and xfsj between '" & data1 & "' and '"& data2 &"' group by rfkh) b on a.rfkh=b.rfkh "
  263. 'Tsql= Tsql&"(select rfkh ,sum(xfje) as 本月增款金额 From  lssj "&"  "
  264. 'Tsql= Tsql&"where xfzl='增款' and xffs='现金交费' and  xfsj between '" & data1 & "' and '" & data2 &"' group by rfkh) c on a.rfkh=c.rfkh join  "&"  "
  265. 'Tsql= Tsql&"(select rfkh ,sum(xfje) 总消费金额 From  lssj "&"  "
  266. 'Tsql= Tsql&"where xfzl='消费' group by rfkh) x on a.rfkh=x.rfkh join  "&"  "
  267. 'Tsql= Tsql&"(select rfkh ,sum(xfje) 总增款金额 From  lssj  "&"  "
  268. 'Tsql= Tsql&"where xfzl='增款' and xffs='现金交费' group by rfkh) z on a.rfkh=z.rfkh where a.姓名 <>'院'  order by a.姓名"
  269. 'Call ConnectDatabase("ORACLE","longtj","ltjn","ltjn","","","") '数据连接操作
  270. Call ConnectDatabase("ACCESS","","","","","","D:\Program Files\小麦科技消费系统\database\xf.mdb") '数据连接操作
  271. Call GetArray(Tsql)
  272. Call UpdateDatabase(Tsql)
复制代码

作者: vaste    时间: 2016-7-21 16:08

Tsql ="select rfkh ,xfje From  lssj where xfzl='消费' and xfsj between '" & data1 & "' and '"& data2 &"'"  'dtmTargetDate >= dtmStartDate AND dtmTargetDate <= dtmEndDate

这句出错?

Tsql ="select * From  lssj where xfzl='消费' and xfsj between '" & data1 & "' and '"& data2 &"'"  'dtmTargetDate >= dtmStartDate AND dtmTargetDate <= dtmEndDate

这样就ok了




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2