We've updated to Preview version 16.2.24.3624+. I wanted to add the new ADO SQL v2 Sensor to replace our depricated old ADO SQL Sensors, but I get the error message "An item with the same key has already been added." everytime, no matter what connection string I use (Postgres, MS SQL, ...). Is there any way to fix it?
Article Comments
Hello,
We are able to reproduce this in the PRTG stable and Preview version and can confirm this is a current bug. We will be providing a fix for the same in a few days.
Please bear with us.
May, 2016 - Permalink
If anyone needs a ADO SQL sensor right now, I wrote a VBScript:
On Error Resume Next
Set objDBCommunicator = new DBCommunicator
Set objArgs = Wscript.Arguments
Set objConnection = CreateObject("ADODB.Connection")
Set objRecordSet = CreateObject("ADODB.RecordSet")
strPRTGStart = "<prtg>"
strPRTGEnde = "</prtg>"
Class DBCommunicator
Public Function DBConnect(StrCon)
On Error Resume Next
objConnection.Open StrCon
If Err.Number = 0 then
DBConnect = True
Else
DBConnect = False
End If
End Function
Public Function QueryDB(StrQuery)
objRecordSet.Open StrQuery, objConnection
If Err.Number = 0 then
Do Until objRecordSet.EOF
For each objField in objRecordSet.Fields
If objField.Name = "" Then
'Wscript.Echo "Wert" & " = " & objField.Value
QueryDB = QueryDB & " <result>" & VBCRLF
QueryDB = QueryDB & " <channel>" & strChannelNameCount & "</channel>" & VBCRLF
QueryDB = QueryDB & " <value>" & objField.Value & "</value>" & VBCRLF
QueryDB = QueryDB & " </result>" & VBCRLF
'Wscript.Echo QueryDB
Else
'Wscript.Echo objField.Name & " = " & objField.Value
QueryDB = QueryDB & " <result>" & VBCRLF
QueryDB = QueryDB & " <channel>" & objField.Name & "</channel>" & VBCRLF
QueryDB = QueryDB & " <value>" & objField.Value & "</value>" & VBCRLF
QueryDB = QueryDB & " </result>" & VBCRLF
'Wscript.Echo QueryDB
End If
Next
objRecordSet.MoveNext
loop
Else
QueryDB = QueryDB & " <error>1</error>" & VBCRLF
QueryDB = QueryDB & " <text>Database Connect failed, please check parameters: " & chr(34) & "ADO SQL connectstring" & chr(34) & " , " & chr(34) & "SQL Query" & chr(34) & " , " & chr(34) & "Channel Name for Count" & chr(34) & "</text>" & VBCRLF
End If
End Function
Public Function DBdisConnect
objRecordSet.close
objConnection.close
End Function
End Class
'########################################
'objArgs(0)=Connectstring - "Provider=SQLOLEDB;Integrated Security=SSPI;Persist Security Info=False;Data Source=Server\Instance;Initial Catalog=DB;"
'objArgs(1)=SQL Query - "select count(*) Schema.Computers;"
'objArgs(2)=Channel Name when Count in Query - "PCs"
Wscript.Echo "Number of parameters: " & objArgs.Count
Wscript.Echo ""
If objArgs.Count < 2 then
strPRTGError = strPRTGError & " <error>1</error>" & VBCRLF
strPRTGError = strPRTGError & " <text>Not enough parameters, please add or check parameters: " & chr(34) & "(Required) ADO SQL connectstring" & chr(34) & " , " & chr(34) & "(Required) SQL Query" & chr(34) & " , " & chr(34) & "(Optional) Channel Name for Count" & chr(34) & "</text>" & VBCRLF
ElseIf objArgs.Count = 2 then
If InStr(LCase(objArgs(1)), "count(*)", 1) = True Then
strPRTGError = strPRTGError & " <error>1</error>" & VBCRLF
strPRTGError = strPRTGError & " <text>Count(*) in parameters, please add or check parameters: " & chr(34) & "(Required) ADO SQL connectstring" & chr(34) & " , " & chr(34) & "(Required) SQL Query" & chr(34) & " , " & chr(34) & "(Optional) Channel Name for Count" & chr(34) & "</text>" & VBCRLF
Else
strConnectString = objArgs(0)
strSQLQuery = objArgs(1)
strChannelNameCount = ""
strResult=objDBCommunicator.DBConnect(strConnectString)
If strResult <> True Then
strPRTGError = strPRTGError & " <error>1</error>" & VBCRLF
strPRTGError = strPRTGError & " <text>Database connect failed, please check parameters: " & chr(34) & "(Required) ADO SQL connectstring" & chr(34) & " , " & chr(34) & "(Required) SQL Query" & chr(34) & " , " & chr(34) & "(Optional) Channel Name for Count" & chr(34) & "</text>" & VBCRLF
ElseIf strResult = True Then
strPRTGChannnel = objDBCommunicator.QueryDB(strSQLQuery)
objDBCommunicator.DBdisConnect
End If
End If
ElseIf objArgs.Count = 3 then
strConnectString = objArgs(0)
strSQLQuery = objArgs(1)
strChannelNameCount = objArgs(2)
strResult=objDBCommunicator.DBConnect(strConnectString)
If strResult <> True Then
strPRTGError = strPRTGError & " <error>1</error>" & VBCRLF
strPRTGError = strPRTGError & " <text>Database Connect failed, please check parameters: " & chr(34) & "(Required) ADO SQL connectstring" & chr(34) & " , " & chr(34) & "(Required) SQL Query" & chr(34) & " , " & chr(34) & "(Optional) Channel Name for Count" & chr(34) & "</text>" & VBCRLF
ElseIf strResult = True Then
strPRTGChannnel = objDBCommunicator.QueryDB(strSQLQuery)
objDBCommunicator.DBdisConnect
End If
End If
If InStr(strPRTGError,"<error>1</error>") Then
strPRTG = strPRTGError
ElseIf InStr(strPRTGChannnel,"<error>1</error>") Then
strPRTG = strPRTGChannnel
Else
strPRTG = strPRTGChannnel
End If
wscript.echo strPRTGStart
wscript.echo strPRTG
wscript.echo strPRTGEnde
Maybe it helps as long as we wait for the fix.
May, 2016 - Permalink
Hello,
We released the PRTG version 16.2.24.3791/3792 yesterday evening with the bigfix for the SQL v2 sensors. Please update to this version to solve the issue.
May, 2016 - Permalink
Please go to the sensor's settings, and Configure the "DEBUG OPTION" "Write sensor result to disk(Filename: Result of Sensor [ID].txt" The log will be written on the probe that monitors that sensor under (%ProgramData%\Paessler\PRTG Network Monitor\Logs (Sensors)) and send the result file to Support@paessler.com Please refer to this kB-article.
Oct, 2016 - Permalink
Same issue here.
May, 2016 - Permalink