ADO Tools: Difference between revisions
		
		
		
		Jump to navigation
		Jump to search
		
| No edit summary Tag: Manual revert | |||
| (12 intermediate revisions by 3 users not shown) | |||
| Line 1: | Line 1: | ||
| = List all installed OLE DB providers = | = List all installed OLE DB providers = | ||
| This tool lists all available providers installed on the computer. You get the registry key, the name of the provider (as to be used in the connection string)  | This tool ('''last update:''' 2024-08-13) lists all available providers installed on the computer. You get   | ||
| * the registry key,   | |||
| * the name of the provider (as to be used in the connection string), | |||
| * the description of the provider, | |||
| * the path of the provider DLL, | |||
| * the version of the DLL (taken from the file properties), | |||
| * the last modification date/time of the DLL (taken from the file properties). | |||
| Idea taken from http://www.motobit.com/help/RegEdit/sa117.htm | Idea taken from http://www.motobit.com/help/RegEdit/sa117.htm | ||
| <syntaxhighlight lang="autoit"> | <syntaxhighlight lang="autoit"> | ||
| #include <Constants.au3> | #include <Constants.au3> | ||
| #include < | #include <Debug.au3> | ||
| _ADO_OLEDBProvidersList() | |||
| ProgressOn( | |||
| ; Count the number of keys | Func _ADO_OLEDBProvidersList() | ||
| While 1 | 	Local $sKey = "HKCR\CLSID" | ||
| 	Local $iIndexReg = 1, $iIndexResult = 0 | |||
| 	Local $iMax = 100000, $iMin = 1, $iPrevious = $iMin, $iCurrent = $iMax / 2 | |||
| 	Local $aResult[200][6] | |||
| 	ProgressOn("OLE DB Providers", "Processing the Registry", "", Default, Default, $DLG_MOVEABLE) | |||
| 	AutoItSetOption("ExpandEnvStrings", 1) | |||
| 	; Count the number of keys | |||
| 	While 1 | |||
| 		RegEnumKey($sKey, $iCurrent) | |||
| 		If @error = -1 Then ; Requested subkey (key instance) out of range | |||
| WEnd | 			$iMax = $iCurrent | ||
| ; Process registry | 			$iCurrent = Int(($iMin + $iMax) / 2) | ||
| While 1 | 			$iPrevious = $iMax | ||
| 		Else | |||
| 			If $iPrevious <= ($iCurrent + 1) And $iPrevious >= ($iCurrent - 1) Then ExitLoop | |||
| 			$iMin = $iCurrent | |||
| 			$iCurrent = Int(($iMin + $iMax) / 2) | |||
| 			$iPrevious = $iMin | |||
| 		EndIf | |||
| 	WEnd | |||
| 	Local $iPercent = 0 | |||
| 	Local $sKeyValue = '' | |||
| 	; Process registry | |||
| 	While 1 | |||
| 		If Mod($iIndexReg, 10) = 0 Then | |||
| 			$iPercent = Int($iIndexReg * 100 / $iCurrent) | |||
| WEnd | 			ProgressSet($iPercent, $iIndexReg & " keys of " & $iCurrent & " processed (" & $iPercent & "%)") | ||
| ProgressOff() | 		EndIf | ||
| ReDim $aResult[$iIndexResult][ | 		$sSubKey = RegEnumKey($sKey, $iIndexReg) | ||
| 		If @error Then ExitLoop | |||
| 		$sKeyValue = RegRead($sKey & "\" & $sSubKey, "OLEDB_SERVICES") | |||
| 		If @error = 0 Then | |||
| 			$aResult[$iIndexResult][0] = $sKey & "\" & $sSubKey                                   ; Registry Key | |||
| 			$aResult[$iIndexResult][1] = RegRead($sKey & "\" & $sSubKey, "")                      ; OLE DB Provider | |||
| 			$aResult[$iIndexResult][2] = RegRead($sKey & "\" & $sSubKey & "\OLE DB Provider", "") ; Description | |||
| 			$aResult[$iIndexResult][3] = RegRead($sKey & "\" & $sSubKey & "\InprocServer32", "")  ; DLL file | |||
| 			If $aResult[$iIndexResult][3] <> "" Then | |||
| 				$aResult[$iIndexResult][4] = _FileGetProperty($aResult[$iIndexResult][3], "Dateiversion") | |||
| 				$aResult[$iIndexResult][5] = _FileGetProperty($aResult[$iIndexResult][3], "Änderungsdatum") | |||
| 			EndIf | |||
| 			$iIndexResult += 1 | |||
| 		EndIf | |||
| 		$iIndexReg += 1 | |||
| 	WEnd | |||
| 	ProgressOff() | |||
| 	ReDim $aResult[$iIndexResult][UBound($aResult, 2)] | |||
| 	_DebugArrayDisplay($aResult, "OLE DB Providers", "", 0, Default, "Registry key|OLE DB Provider|Description|DLL|DLL Version|DLL last modified") | |||
| EndFunc   ;==>_ADO_OLEDBProvidersList | |||
| ;=============================================================================== | |||
| ; Function Name.....: _FileGetProperty | |||
| ; Description.......: Returns a property or all properties for a file. | |||
| ; Version...........: 1.0.2 | |||
| ; Change Date.......: 05-16-2012 | |||
| ; AutoIt Version....: 3.2.12.1+ | |||
| ; Parameter(s)......: $FGP_Path - String containing the file path to return the property from. | |||
| ;                     $FGP_PROPERTY - [optional] String containing the name of the property to return. (default = "") | |||
| ;                     $iPropertyCount - [optional] The number of properties to search through for $FGP_PROPERTY, or the number of items | |||
| ;                                       returned in the array if $FGP_PROPERTY is blank. (default = 300) | |||
| ; Requirements(s)...: None | |||
| ; Return Value(s)...: Success: Returns a string containing the property value. | |||
| ;                     If $FGP_PROPERTY is blank, a two-dimensional array is returned: | |||
| ;                         $av_array[0][0] = Number of properties. | |||
| ;                         $av_array[1][0] = 1st property name. | |||
| ;                         $as_array[1][1] = 1st property value. | |||
| ;                         $av_array[n][0] = nth property name. | |||
| ;                         $as_array[n][1] = nth property value. | |||
| ;                     Failure: Returns an empty string and sets @error to: | |||
| ;                       1 = The folder $FGP_Path does not exist. | |||
| ;                       2 = The property $FGP_PROPERTY does not exist or the array could not be created. | |||
| ;                       3 = Unable to create the "Shell.Application" object $objShell. | |||
| ; Author(s).........: - Simucal <Simucal@gmail.com> | |||
| ;                     - Modified by: Sean Hart <autoit@hartmail.ca> | |||
| ;                     - Modified by: teh_hahn <sPiTsHiT@gmx.de> | |||
| ;                     - Modified by: BrewManNH | |||
| ; URL...............: http://www.autoitscript.com/forum/topic/34732-udf-getfileproperty/page__view__findpost__p__557571 | |||
| ; Note(s)...........: Modified the script that teh_hahn posted at the above link to include the properties that | |||
| ;                     Vista and Win 7 include that Windows XP doesn't. Also removed the ReDims for the $av_ret array and | |||
| ;                     replaced it with a single ReDim after it has found all the properties, this should speed things up. | |||
| ;                     I further updated the code so there's a single point of return except for any errors encountered. | |||
| ;                     $iPropertyCount is now a function parameter instead of being hardcoded in the function itself. | |||
| ;=============================================================================== | |||
| Func _FileGetProperty($FGP_Path, $FGP_PROPERTY = "", $iPropertyCount = 500) | |||
| 	If $FGP_PROPERTY = Default Then $FGP_PROPERTY = "" | |||
| 	$FGP_Path = StringRegExpReplace($FGP_Path, '["'']', "") ; strip the quotes, if any from the incoming string | |||
| 	If Not FileExists($FGP_Path) Then Return SetError(1, 0, "") ; path not found | |||
| 	Local Const $objShell = ObjCreate("Shell.Application") | |||
| 	If @error Then Return SetError(3, 0, "") | |||
| 	Local Const $FGP_File = StringTrimLeft($FGP_Path, StringInStr($FGP_Path, "\", 0, -1)) | |||
| 	Local Const $FGP_Dir = StringTrimRight($FGP_Path, StringLen($FGP_File) + 1) | |||
| 	Local Const $objFolder = $objShell.NameSpace($FGP_Dir) | |||
| 	Local Const $objFolderItem = $objFolder.Parsename($FGP_File) | |||
| 	Local $Return = "", $iError = 0 | |||
| 	If $FGP_PROPERTY Then | |||
| 		For $I = 0 To $iPropertyCount | |||
| 			If $objFolder.GetDetailsOf($objFolder.Items, $I) = $FGP_PROPERTY Then | |||
| 				$Return = $objFolder.GetDetailsOf($objFolderItem, $I) | |||
| 			EndIf | |||
| 		Next | |||
| 		If $Return = "" Then | |||
| 			$iError = 2 | |||
| 		EndIf | |||
| 	Else | |||
| 		Local $av_ret[$iPropertyCount + 1][2] = [[0]] | |||
| 		For $I = 1 To $iPropertyCount | |||
| 			If $objFolder.GetDetailsOf($objFolder.Items, $I) Then | |||
| 				$av_ret[$I][0] = $objFolder.GetDetailsOf($objFolder.Items, $I - 1) | |||
| 				$av_ret[$I][1] = $objFolder.GetDetailsOf($objFolderItem, $I - 1) | |||
| ;~              $av_ret[0][0] += 1 | |||
| 				$av_ret[0][0] = $I | |||
| 			EndIf | |||
| 		Next | |||
| 		ReDim $av_ret[$av_ret[0][0] + 1][2] | |||
| 		If Not $av_ret[1][0] Then | |||
| 			$iError = 2 | |||
| 			$av_ret = $Return | |||
| 		Else | |||
| 			$Return = $av_ret | |||
| 		EndIf | |||
| 	EndIf | |||
| 	Return SetError($iError, 0, $Return) | |||
| EndFunc   ;==>_FileGetProperty | |||
| </syntaxhighlight> | </syntaxhighlight> | ||
| Line 51: | Line 153: | ||
| = List all properties of an open ADO connection = | = List all properties of an open ADO connection = | ||
| This tool lists all properties for an open connection. | |||
| <syntaxhighlight lang="autoit"> | <syntaxhighlight lang="autoit"> | ||
| #include <Array.au3> | #include <Array.au3> | ||
| #include <MsgBoxConstants.au3> | #include <MsgBoxConstants.au3> | ||
| If @error Then Exit MsgBox($MB_ICONERROR, "Error", "Error " & @error & " creating the connection object!") | _Example_ListProperties() | ||
| Func _Example_ListProperties() | |||
| 	Local $oADOConnection = ObjCreate("ADODB.Connection") ; Create a connection object | |||
| $oADOConnection.Open($sADOConnectionString)  | 	If @error Then Exit MsgBox($MB_ICONERROR, "Error", "Error " & @error & " creating the connection object!") | ||
| If @error Then Exit MsgBox($MB_ICONERROR, "Error", "Error " & @error & " opening  | |||
| 	; Open the connection | |||
| For $ | 	Local $sADOConnectionString = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' & @ScriptDir & ';Extended Properties="Text;HDR=NO;FMT=Delimited(,)"' | ||
| 	$oADOConnection.Open($sADOConnectionString) | |||
| 	If @error Then Exit MsgBox($MB_ICONERROR, "Error", "Error " & @error & " opening the connection object!") | |||
| Next | 	Local $aProperties = _ADO_Connection_PropertiesToArray($oADOConnection) | ||
| $ | 	_ArrayDisplay($aProperties, "ADO connection - List of properties", "", 0, Default, "Name|Type|Value|Attributes") | ||
| EndFunc    ;==>_Example_ListProperties | |||
| Func _ADO_Connection_PropertiesToArray(ByRef $oConnection) | |||
| 	; Property Object (ADO) | |||
| 	; https://msdn.microsoft.com/en-us/library/windows/desktop/ms677577(v=vs.85).aspx | |||
| 	Local $oProperties_coll = $oConnection.Properties | |||
| 	Local $aProperties[$oProperties_coll.count][4] | |||
| 	Local $iIndex = 0 | |||
| 	For $oProperty_enum In $oProperties_coll | |||
| 		$aProperties[$iIndex][0] = $oProperty_enum.Name | |||
| 		$aProperties[$iIndex][1] = $oProperty_enum.Type | |||
| 		$aProperties[$iIndex][2] = $oProperty_enum.Value | |||
| 		$aProperties[$iIndex][3] = $oProperty_enum.Attributes | |||
| 		$iIndex += 1 | |||
| 	Next | |||
| 	$oProperties_coll = Null | |||
| 	Return $aProperties | |||
| EndFunc    ;==>_ADO_Connection_PropertiesToArray | |||
| </syntaxhighlight> | </syntaxhighlight> | ||
| Result: | |||
| [[File:ADO_Connection_Properties.jpg||Connection Properties]] | |||
| [[Category:ADO]] | [[Category:ADO]] | ||
Latest revision as of 19:52, 13 August 2024
List all installed OLE DB providers
This tool (last update: 2024-08-13) lists all available providers installed on the computer. You get
- the registry key,
- the name of the provider (as to be used in the connection string),
- the description of the provider,
- the path of the provider DLL,
- the version of the DLL (taken from the file properties),
- the last modification date/time of the DLL (taken from the file properties).
Idea taken from http://www.motobit.com/help/RegEdit/sa117.htm
#include <Constants.au3>
#include <Debug.au3>
_ADO_OLEDBProvidersList()
Func _ADO_OLEDBProvidersList()
	Local $sKey = "HKCR\CLSID"
	Local $iIndexReg = 1, $iIndexResult = 0
	Local $iMax = 100000, $iMin = 1, $iPrevious = $iMin, $iCurrent = $iMax / 2
	Local $aResult[200][6]
	ProgressOn("OLE DB Providers", "Processing the Registry", "", Default, Default, $DLG_MOVEABLE)
	AutoItSetOption("ExpandEnvStrings", 1)
	; Count the number of keys
	While 1
		RegEnumKey($sKey, $iCurrent)
		If @error = -1 Then ; Requested subkey (key instance) out of range
			$iMax = $iCurrent
			$iCurrent = Int(($iMin + $iMax) / 2)
			$iPrevious = $iMax
		Else
			If $iPrevious <= ($iCurrent + 1) And $iPrevious >= ($iCurrent - 1) Then ExitLoop
			$iMin = $iCurrent
			$iCurrent = Int(($iMin + $iMax) / 2)
			$iPrevious = $iMin
		EndIf
	WEnd
	Local $iPercent = 0
	Local $sKeyValue = ''
	; Process registry
	While 1
		If Mod($iIndexReg, 10) = 0 Then
			$iPercent = Int($iIndexReg * 100 / $iCurrent)
			ProgressSet($iPercent, $iIndexReg & " keys of " & $iCurrent & " processed (" & $iPercent & "%)")
		EndIf
		$sSubKey = RegEnumKey($sKey, $iIndexReg)
		If @error Then ExitLoop
		$sKeyValue = RegRead($sKey & "\" & $sSubKey, "OLEDB_SERVICES")
		If @error = 0 Then
			$aResult[$iIndexResult][0] = $sKey & "\" & $sSubKey                                   ; Registry Key
			$aResult[$iIndexResult][1] = RegRead($sKey & "\" & $sSubKey, "")                      ; OLE DB Provider
			$aResult[$iIndexResult][2] = RegRead($sKey & "\" & $sSubKey & "\OLE DB Provider", "") ; Description
			$aResult[$iIndexResult][3] = RegRead($sKey & "\" & $sSubKey & "\InprocServer32", "")  ; DLL file
			If $aResult[$iIndexResult][3] <> "" Then
				$aResult[$iIndexResult][4] = _FileGetProperty($aResult[$iIndexResult][3], "Dateiversion")
				$aResult[$iIndexResult][5] = _FileGetProperty($aResult[$iIndexResult][3], "Änderungsdatum")
			EndIf
			$iIndexResult += 1
		EndIf
		$iIndexReg += 1
	WEnd
	ProgressOff()
	ReDim $aResult[$iIndexResult][UBound($aResult, 2)]
	_DebugArrayDisplay($aResult, "OLE DB Providers", "", 0, Default, "Registry key|OLE DB Provider|Description|DLL|DLL Version|DLL last modified")
EndFunc   ;==>_ADO_OLEDBProvidersList
;===============================================================================
; Function Name.....: _FileGetProperty
; Description.......: Returns a property or all properties for a file.
; Version...........: 1.0.2
; Change Date.......: 05-16-2012
; AutoIt Version....: 3.2.12.1+
; Parameter(s)......: $FGP_Path - String containing the file path to return the property from.
;                     $FGP_PROPERTY - [optional] String containing the name of the property to return. (default = "")
;                     $iPropertyCount - [optional] The number of properties to search through for $FGP_PROPERTY, or the number of items
;                                       returned in the array if $FGP_PROPERTY is blank. (default = 300)
; Requirements(s)...: None
; Return Value(s)...: Success: Returns a string containing the property value.
;                     If $FGP_PROPERTY is blank, a two-dimensional array is returned:
;                         $av_array[0][0] = Number of properties.
;                         $av_array[1][0] = 1st property name.
;                         $as_array[1][1] = 1st property value.
;                         $av_array[n][0] = nth property name.
;                         $as_array[n][1] = nth property value.
;                     Failure: Returns an empty string and sets @error to:
;                       1 = The folder $FGP_Path does not exist.
;                       2 = The property $FGP_PROPERTY does not exist or the array could not be created.
;                       3 = Unable to create the "Shell.Application" object $objShell.
; Author(s).........: - Simucal <Simucal@gmail.com>
;                     - Modified by: Sean Hart <autoit@hartmail.ca>
;                     - Modified by: teh_hahn <sPiTsHiT@gmx.de>
;                     - Modified by: BrewManNH
; URL...............: http://www.autoitscript.com/forum/topic/34732-udf-getfileproperty/page__view__findpost__p__557571
; Note(s)...........: Modified the script that teh_hahn posted at the above link to include the properties that
;                     Vista and Win 7 include that Windows XP doesn't. Also removed the ReDims for the $av_ret array and
;                     replaced it with a single ReDim after it has found all the properties, this should speed things up.
;                     I further updated the code so there's a single point of return except for any errors encountered.
;                     $iPropertyCount is now a function parameter instead of being hardcoded in the function itself.
;===============================================================================
Func _FileGetProperty($FGP_Path, $FGP_PROPERTY = "", $iPropertyCount = 500)
	If $FGP_PROPERTY = Default Then $FGP_PROPERTY = ""
	$FGP_Path = StringRegExpReplace($FGP_Path, '["'']', "") ; strip the quotes, if any from the incoming string
	If Not FileExists($FGP_Path) Then Return SetError(1, 0, "") ; path not found
	Local Const $objShell = ObjCreate("Shell.Application")
	If @error Then Return SetError(3, 0, "")
	Local Const $FGP_File = StringTrimLeft($FGP_Path, StringInStr($FGP_Path, "\", 0, -1))
	Local Const $FGP_Dir = StringTrimRight($FGP_Path, StringLen($FGP_File) + 1)
	Local Const $objFolder = $objShell.NameSpace($FGP_Dir)
	Local Const $objFolderItem = $objFolder.Parsename($FGP_File)
	Local $Return = "", $iError = 0
	If $FGP_PROPERTY Then
		For $I = 0 To $iPropertyCount
			If $objFolder.GetDetailsOf($objFolder.Items, $I) = $FGP_PROPERTY Then
				$Return = $objFolder.GetDetailsOf($objFolderItem, $I)
			EndIf
		Next
		If $Return = "" Then
			$iError = 2
		EndIf
	Else
		Local $av_ret[$iPropertyCount + 1][2] = [[0]]
		For $I = 1 To $iPropertyCount
			If $objFolder.GetDetailsOf($objFolder.Items, $I) Then
				$av_ret[$I][0] = $objFolder.GetDetailsOf($objFolder.Items, $I - 1)
				$av_ret[$I][1] = $objFolder.GetDetailsOf($objFolderItem, $I - 1)
;~              $av_ret[0][0] += 1
				$av_ret[0][0] = $I
			EndIf
		Next
		ReDim $av_ret[$av_ret[0][0] + 1][2]
		If Not $av_ret[1][0] Then
			$iError = 2
			$av_ret = $Return
		Else
			$Return = $av_ret
		EndIf
	EndIf
	Return SetError($iError, 0, $Return)
EndFunc   ;==>_FileGetProperty
Result:
List all properties of an open ADO connection
This tool lists all properties for an open connection.
#include <Array.au3>
#include <MsgBoxConstants.au3>
_Example_ListProperties()
Func _Example_ListProperties()
	Local $oADOConnection = ObjCreate("ADODB.Connection") ; Create a connection object
	If @error Then Exit MsgBox($MB_ICONERROR, "Error", "Error " & @error & " creating the connection object!")
	; Open the connection
	Local $sADOConnectionString = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' & @ScriptDir & ';Extended Properties="Text;HDR=NO;FMT=Delimited(,)"'
	$oADOConnection.Open($sADOConnectionString)
	If @error Then Exit MsgBox($MB_ICONERROR, "Error", "Error " & @error & " opening the connection object!")
	Local $aProperties = _ADO_Connection_PropertiesToArray($oADOConnection)
	_ArrayDisplay($aProperties, "ADO connection - List of properties", "", 0, Default, "Name|Type|Value|Attributes")
	
EndFunc    ;==>_Example_ListProperties
Func _ADO_Connection_PropertiesToArray(ByRef $oConnection)
	; Property Object (ADO)
	; https://msdn.microsoft.com/en-us/library/windows/desktop/ms677577(v=vs.85).aspx
	Local $oProperties_coll = $oConnection.Properties
	Local $aProperties[$oProperties_coll.count][4]
	Local $iIndex = 0
	For $oProperty_enum In $oProperties_coll
		$aProperties[$iIndex][0] = $oProperty_enum.Name
		$aProperties[$iIndex][1] = $oProperty_enum.Type
		$aProperties[$iIndex][2] = $oProperty_enum.Value
		$aProperties[$iIndex][3] = $oProperty_enum.Attributes
		$iIndex += 1
	Next
	$oProperties_coll = Null
	Return $aProperties
EndFunc    ;==>_ADO_Connection_PropertiesToArray
Result:

