本帖最后由 user3000 于 2012-4-27 23:42 编辑
回复 2# netegg
_accessQueryStr 除了确认该字符串在数据库存在外, 完全没有别的用处吧?
它是: 数据存在, 则返回字符串本身!
我说的精确查找应当如我下面的函数:
(考虑不周, 已取消隐藏, 请用心给予回复!)
#Region
#cs
; 函数名 _accessQueryStrEX , 作用: 按已知字段值, 获取该行特定字段的数据.
应该还要加上字段名的判断, 如果第4个参数, 设置了不存在的字段字, 会返回空值!
; 参数说明: 1, $DB_Path 数据库文件(非脚本目录下需列出绝对路径)
2, $DB_Table 要查询的数据表名
3, $Finds 查询条件, 有格式要求. 接受数组, 类似: Local $Finds[3] = ['pcname', 'pc001', 'pcoo2']
或字符串, 类似: Local $Finds = 'PCName|PC001|PC002'
其中: PCName 为字段(列)名 , pc001 和 pc002 为该字段下某一行的数值)
4, $return_Columns = '*' 要求查询后返回的字段(列)的数据, 默认是所有字段
如上面的查询条件, 将返回跟 pc001 及 pc002 有关的那行(所有字段)的所有数据.
5, $password = Default 数据库的密码, 默认是不用密码的方式打开数据库.
6, $CloseDB = True 查询结束是否关闭已打开的数据库. 默认操作是关闭. ; 不知道有用不?
查询成功:
返回一数组: $Array[n][2]
$Array[0][0] 查询到的数据串数量
$Array[1][0] ... $Array[n][0] 有关字段名的字符串, 以 '|' 字符分隔,
$Array[1][1] ... $Array[n][1] 有关各行数据的字符串, 也是以 '|' 分开.
查询失败:
返回 -1 并设置 @errer
@errer 1 打开数据库失败
@errer 2 设置的查找条件有误?
@errer 3 第3个参数错误, 符合格式要求
N 维2#ce
#endregion
$query = _accessQueryStrEX(@ScriptDir & "\sys1.mdb", 'group1', 'PCName|ooo|PC001|pc002|pc003', 'PcName,IPaddress', 123)
If Not @error Then
MsgBox(0, 'number', $query[0][0])
For $i = 1 To $query[0][0]
MsgBox(0, $query[$i][0], $query[$i][1])
Next
Else
MsgBox(0, 'err', @error)
EndIf
Func _accessQueryStrEX($DB_Path, $DB_Table, $Finds, $return_Columns = '*', $password = Default, $CloseDB = True)
$oADO = _OpenDaTaBase($DB_Path, $password)
$rs = ObjCreate("ADODB.recordset")
$rs.ActiveConnection = $oADO
If IsObj($rs) = 0 Then Return SetError(1, 0, -1)
Local $find, $row
If IsArray($Finds) Then
$row = UBound($Finds)
If $row = 1 Then Return SetError(3, 0, -1) ; 错误的查找条件参数
$find = ' where ' & $Finds[0] & " in ('" & $Finds[1] & "'"
For $i = 2 To UBound($Finds) - 1
$find &= ",'" & $Finds[$i] & "'"
Next
$find &= ')'
ElseIf StringInStr($Finds, '|') Then
$s = StringSplit($Finds, '|')
$row = $s[0]
$find = ' where ' & $s[1] & " in ('" & $s[2] & "'"
For $i = 3 To $s[0]
$find &= ",'" & $s[$i] & "'"
Next
$find &= ')'
Else
Return SetError(3, 0, -1) ; 错误的查找条件参数
; Chr(42 * 星号, 代表查询并返回所有列
EndIf
$sql = "select " & $return_Columns & " from " & $DB_Table & $find
$rs.Open($sql, $oADO)
If $rs.bof Or $rs.eof Then Return SetError(2, 0, -1) ; 查找失败, 可能是查找的条件不正确
Local $return[$row][2], $count = 0
While Not $rs.BOF And Not $rs.EOF
$count += 1
If $count == $row Then ExitLoop
;If @error Then ExitLoop
For $x In $rs.Fields
If $x.name <> '' And $x.value <> '' Then
$return[$count][0] &= $x.name & Chr(124) ; Chr(124) 垂直线
$return[$count][1] &= $x.value & Chr(124)
EndIf
Next
$return[$count][0] = StringTrimRight($return[$count][0], 1)
$return[$count][1] = StringTrimRight($return[$count][1], 1)
$rs.MOVENEXT
WEnd
$return[0][0] = $count
If $CloseDB Then
$rs.Close
$oADO.Close
EndIf
Return $return
EndFunc ;==>_accessQueryStrEX
;#cs
Func _adoProvider() ; 获取当前系统的 Access 数据库驱动版本
Local $oProvider = "Microsoft.Jet.OLEDB.4.0; "
Local $objCheck = ObjCreate("Access.application")
If IsObj($objCheck) Then
Local $oVersion = $objCheck.Version
If StringLeft($oVersion, 2) == "12" Then $oProvider = "Microsoft.ACE.OLEDB.12.0; "
EndIf
Return $oProvider
EndFunc ;==>_adoProvider
;#ce
Func _OpenDaTaBase($DB_Path, $password = Default)
Local $oADO = 'ADODB.Connection'
If IsObj($oADO) Then
$oADO = ObjGet('', $oADO)
Else
$oADO = ObjCreate("ADODB.Connection")
$oADO.Provider = _adoProvider()
If $password = Default Then
$oADO.Open($DB_Path)
Else
$oADO.Open("Data Source=" & $DB_Path & ";Jet Oledb:Database Password=" & $password)
EndIf
EndIf
Return $oADO
EndFunc ;==>_OpenDaTaBase
以下是可作测试用的带密码的数据库文件:
|