Backend sent unrecognized response type: u Error with Postgres 9.3 and npgsql - postgresql

I upgraded my server yesterday from Postgres 9.1 to 9.3 and since then I've been getting an error: Backend sent unrecognized response type: u
I'm using npgsql to connect from my application to the server.
I remember that I used to get this error a while back and I haven't seen it in a while.
A full line from my log is:
Backend sent unrecognized response type: u
INSERT INTO stockcodes_rating (item_code,rating,price_range,user_id,timestamp_of_rating) VALUES ('10245684','5','Reasonable','10832',now())
My code for the procedure is:
Public Function InsertRating(ByVal Stockcode As String, ByVal Rating As Integer, ByVal PriceRange As String, ByVal UserId As String) As String
Dim objDBWrite As dlNpgSQL
objDBWrite = New dlNpgSQL("PostgreConnectionStringWrite", ConfigurationManager.AppSettings("CurrentDatabase"))
tmpSQL = "INSERT INTO stockcodes_rating (item_code,rating,price_range,user_id,timestamp_of_rating) VALUES " & _
"('" & Stockcode.ToUpper & "','" & Rating & "','" & PriceRange & "','" & UserId & "',now())"
Try
objDBWrite.ExecuteQuery(tmpSQL)
Catch ex As Exception
objDBWrite.CloseConnection()
Return ex.Message
Finally
objDBWrite.CloseConnection()
End Try
Return "Success"
End Function
My code for the dlNpgSQLclass is:
Imports Npgsql
Public Class dlNpgSQL
Dim _sqlConnection As NpgsqlConnection
Dim _sqlCommand As NpgsqlCommand
Dim _sqlDataAdapter As NpgsqlDataAdapter
Dim _dataset As DataSet
Public Sub New()
On Error GoTo ErrZ
_sqlConnection = New NpgsqlConnection(ConfigurationManager.ConnectionStrings("PostgreRemoteConnectionString").ConnectionString)
Exit Sub
End Sub
Public Sub New(ByVal WhichConnectionString As String)
On Error GoTo ErrZ
_sqlConnection = New NpgsqlConnection(ConfigurationManager.ConnectionStrings(WhichConnectionString).ConnectionString)
Exit Sub
End Sub
Public Sub New(ByVal WhichConnectionString As String, ByVal WhichDB As String)
On Error GoTo ErrZ
_sqlConnection = New NpgsqlConnection(ConfigurationManager.ConnectionStrings(WhichConnectionString).ConnectionString & "database=" & WhichDB & ";")
Exit Sub
End Sub
Public Function OpenConnection() As NpgsqlConnection
Try
If _sqlConnection.State = ConnectionState.Closed Then
_sqlConnection.Open()
End If
Catch ex As Exception
End Try
Return _sqlConnection
End Function
Public Sub CloseConnection()
Try
If _sqlConnection.State = ConnectionState.Open Then
_sqlConnection.Close()
End If
Catch ex As Exception
End Try
End Sub
Public Function GetDataSet(ByVal strQuery As String) As DataSet
'NpgsqlEventLog.Level = LogLevel.Normal
'NpgsqlEventLog.LogName = ("c:\npgsql.log")
'NpgsqlEventLog.EchoMessages = True
_dataset = New DataSet
Try
_sqlDataAdapter = New NpgsqlDataAdapter(strQuery, OpenConnection)
_sqlDataAdapter.Fill(_dataset)
Catch ex As Exception
End Try
Return _dataset
End Function
Public Function ReleaseDataSet(ByRef ds As DataSet) As Boolean
Try
ds.Clear()
ds.Dispose()
Catch ex As Exception
End Try
Return True
End Function
Public Function ExecuteQuery(ByVal strQuery As String) As String
'NpgsqlEventLog.Level = LogLevel.Normal
'NpgsqlEventLog.LogName = ("c:\npgsql.log")
'NpgsqlEventLog.EchoMessages = True
Dim RecordsReturned As String = ""
Try
_sqlCommand = New NpgsqlCommand(strQuery, OpenConnection)
RecordsReturned = _sqlCommand.ExecuteNonQuery()
Catch ex As Exception
Return ""
End Try
Return RecordsReturned
End Function
Public Function isR(ByVal tmpDs As DataSet, Optional ByVal tablename As Integer = 0) As Boolean
Try
If tmpDs.Tables.Count > 0 Then
If tmpDs.Tables(0).Rows.Count > 0 Then
isR = True
Else
isR = False
End If
End If
Catch ex As Exception
isR = False
End Try
End Function
End Class

What version of npgsql are you using? You probably need to upgrade to 2.0.14.3.
Better yet, try out the 2.1.0-beta1 which is quite stable and about to be released.

The same thing happened to me using Npgsql 2.0.12.0 sharing the connection between threads. Making a new connection in each thread was the solution!

Related

Updated Yahoo Weather API - .NET

I'm trying to implement the newest yahoo weather API in a .NET application (the one we were using was discontinued in favor of this new one): https://developer.yahoo.com/weather/documentation.html#commercial
Their only examples are in PHP and Java. I've done my best to convert the Java example to .NET but I still am getting a "401 - Unauthorized" response. I've gone over my code several times and cannot find any problems so I'm hoping someone else will be able to see where I went wrong. Code is below.
Private Sub _WeatherLoader_DoWork(sender As Object, e As DoWorkEventArgs)
Try
Dim oauth As New OAuth.OAuthBase
Dim forecastRssResponse As query
Dim appId As String = My.Settings.YahooAppID
Dim consumerKey As String = My.Settings.YahooAPIConsumerKey
Dim yahooUri As String = String.Format("{0}?location=billings,mt&format=xml", YAHOO_WEATHER_API_BASE_ENDPOINT)
Dim oAuthTimestamp As Integer = oauth.GenerateTimeStamp()
Dim oAuthNonce As String = oauth.GenerateNonce()
Dim parameters As New List(Of String)
Try
parameters.Add(String.Format("oauth_consumer_key={0}", consumerKey))
parameters.Add(String.Format("oauth_nonce={0}", oAuthNonce))
parameters.Add("oauth_signature_method=HMAC-SHA1")
parameters.Add(String.Format("oauth_timestamp={0}", oAuthTimestamp.ToString()))
parameters.Add("oauth_version=1.0")
' Encode the location
parameters.Add(String.Format("location={0}", HttpUtility.UrlEncode("billings,mt", Encoding.UTF8)))
parameters.Add("format=xml")
' Sort parameters ascending
parameters = parameters.OrderBy(Function(item) item).ToList()
Dim i As Integer = 0
Dim builder As New StringBuilder()
Do While (i < parameters.Count())
builder.Append(String.Format("{0}{1}", If(i > 0, "&", String.Empty), parameters(i)))
i += 1
Loop
Dim signatureString As String = String.Format("GET&{0}&{1}", HttpUtility.UrlEncode(YAHOO_WEATHER_API_BASE_ENDPOINT, Encoding.UTF8), HttpUtility.UrlEncode(builder.ToString(), Encoding.UTF8))
Dim oAuthSignature As String = _CreateOauthSignature(signatureString)
Dim authorizationLine As String = String.Format("OAuth oauth_consumer_key={0}, oauth_nonce={1}, oauth_timestamp={2}, oauth_signature_method=HMAC-SHA1, oauth_signature={3}, oauth_version=1.0", consumerKey, oAuthNonce, oAuthTimestamp, oAuthSignature)
Dim forecastRequest As WebRequest = WebRequest.Create(yahooUri)
forecastRequest.Headers.Add("Authorization", authorizationLine)
forecastRequest.Headers.Add("Yahoo-App-Id", appId)
' Cast to HttpWebRequest to set ContentType through property
CType(forecastRequest, HttpWebRequest).ContentType = "text/xml"
Dim forecastResponse As WebResponse = forecastRequest.GetResponse()
If forecastResponse IsNot Nothing Then
Using responseStream As Stream = forecastResponse.GetResponseStream()
Dim rssDoc As New XmlDocument()
rssDoc.Load(responseStream)
forecastRssResponse = rssDoc.OuterXml().FromXml(Of query)()
End Using
e.Result = forecastRssResponse
End If
Catch ex As Exception
e.Result = Nothing
LoadingManually = False
End Try
Catch ex As Exception
modMain.SendDevErrorEmail(ex, "_WeatherLoader_DoWork in WeatherWidget", "Catch around dowork code in fired from refresh timer event in wether widget")
e.Result = Nothing
LoadingManually = False
End Try
End Sub
Private Function _CreateOauthSignature(baseInfo As String) As String
Dim secretKey As String = String.Format("{0}&", My.Settings.YahooAPIConsumerSecretKey)
Dim encoding As New System.Text.ASCIIEncoding()
Dim keyBytes As Byte() = encoding.GetBytes(secretKey)
Dim messageBytes As Byte() = encoding.GetBytes(baseInfo)
Dim hashMessage As Byte()
Using hmac As New HMACSHA1(keyBytes)
hashMessage = hmac.ComputeHash(messageBytes)
End Using
Return Convert.ToBase64String(hashMessage)
End Function
After painstakingly creating a Java app, pasting in the Java example and stepping through it I found that the issue is in a poorly implemented URL Decode function on the receiving end.
In the Java app, URL Encode uses upper case characters while in .NET HTTPUtility.URLEncode uses lower case characters. This is enough to throw off your signature and cause a 401 - Unauthorized error.
My solution was to create a string extension method that will URL Encode in upper case:
<Extension>
Public Function UppercaseURLEncode(ByVal sourceString As String) As String
Dim temp As Char() = HttpUtility.UrlEncode(sourceString).ToCharArray()
For i As Integer = 0 To temp.Length - 2
If temp(i).ToString().Equals("%", StringComparison.OrdinalIgnoreCase) Then
temp(i + 1) = Char.ToUpper(temp(i + 1))
temp(i + 2) = Char.ToUpper(temp(i + 2))
End If
Next
Return New String(temp)
End Function
Using this extension method my signature gets created exactly like the one in the Java app and I am able to retrieve the response.
Hope this helps other .net programmers with this issue!

The commit transaction request has no corresponding begin transaction using ADO.net

I want to update the records batch wise in SqlTransaction. In every batch i am updating 50 records. If any one record fails to update i want rollback those 50 records. I have written this code in while loop. But i am getting following error randomly.
'The commit transaction request has no corresponding begin transaction'.
Following is my code:
Dim _completed as Integer=0
Dim sqlCon As SqlClient.SqlConnection = Nothing
Dim sqlTransaction As SqlClient.SqlTransaction = Nothing
Dim lstq as List(of SqlCommand) 'It contains list of update queries
sqlCon = New SqlClient.SqlConnection(AIMSCommon.sqlServerConnection)
sqlCon.Open()
While True
Dim _res = lstq.Skip(_completed).Take(40)
If _res.Count = 0 Then Exit While
If sqlCon.State <> ConnectionState.Open Then
sqlCon = New SqlClient.SqlConnection(AIMSCommon.sqlServerConnection)
sqlCon.Open()
End If
Try
sqlTransaction = sqlCon.BeginTransaction()
For Each cls In _res
Try
cls.Connection = sqlCon
cls.Transaction = sqlTransaction
Dim i As Integer = cls.ExecuteNonQuery()
cls.Dispose()
Catch ex As Exception
If cls IsNot Nothing Then
cls.Dispose()
End If
Throw ex
End Try
Next
sqlTransaction.Commit()
sqlTransaction.Dispose()
sqlTransaction = Nothing
_completed += _res.Count
Catch ex As Exception
sqlCon.Close()
sqlCon.Dispose()
If sqlTransaction IsNot Nothing Then
sqlTransaction.Rollback()
sqlTransaction.Dispose()
End If
If sqlCon IsNot Nothing Then
sqlCon.Close()
sqlCon.Dispose()
End If
End Try
End While
If sqlCon IsNot Nothing Then
sqlCon.Close()
sqlCon.Dispose()
End If

VB.NET How can I detect if an iPhone is plugged in?

I need to detect if an iPhone is plugged in. I don't know how to make that in VB.NET. I tried to play around with WMI but I'm just a beginner.
Can everyone help me?
I tried this but it only detects Mass Storage
Public Class Form1
Private WithEvents m_MediaConnectWatcher As ManagementEventWatcher
Public USBDriveName As String
Public USBDriveLetter As String
Public Sub StartDetection()
' __InstanceOperationEvent will trap both Creation and Deletion of class instances
Dim query2 As New WqlEventQuery("SELECT * FROM __InstanceOperationEvent WITHIN 1 " _
& "WHERE TargetInstance ISA 'Win32_DiskDrive'")
m_MediaConnectWatcher = New ManagementEventWatcher
m_MediaConnectWatcher.Query = query2
m_MediaConnectWatcher.Start()
End Sub
Private Sub Arrived(ByVal sender As Object, ByVal e As System.Management.EventArrivedEventArgs) Handles m_MediaConnectWatcher.EventArrived
Dim mbo, obj As ManagementBaseObject
' the first thing we have to do is figure out if this is a creation or deletion event
mbo = CType(e.NewEvent, ManagementBaseObject)
' next we need a copy of the instance that was either created or deleted
obj = CType(mbo("TargetInstance"), ManagementBaseObject)
Select Case mbo.ClassPath.ClassName
Case "__InstanceCreationEvent"
If obj("InterfaceType") = "USB" Then
MsgBox(obj("Caption") & " (Drive letter " & GetDriveLetterFromDisk(obj("Name")) & ") has been plugged in")
Else
MsgBox(obj("InterfaceType"))
End If
Case "__InstanceDeletionEvent"
If obj("InterfaceType") = "USB" Then
MsgBox(obj("Caption") & " has been unplugged")
If obj("Caption") = USBDriveName Then
USBDriveLetter = ""
USBDriveName = ""
End If
Else
MsgBox(obj("InterfaceType"))
End If
Case Else
MsgBox("nope: " & obj("Caption"))
End Select
End Sub
Private Function GetDriveLetterFromDisk(ByVal Name As String) As String
Dim oq_part, oq_disk As ObjectQuery
Dim mos_part, mos_disk As ManagementObjectSearcher
Dim obj_part, obj_disk As ManagementObject
Dim ans As String = ""
' WMI queries use the "\" as an escape charcter
Name = Replace(Name, "\", "\\")
' First we map the Win32_DiskDrive instance with the association called
' Win32_DiskDriveToDiskPartition. Then we map the Win23_DiskPartion
' instance with the assocation called Win32_LogicalDiskToPartition
oq_part = New ObjectQuery("ASSOCIATORS OF {Win32_DiskDrive.DeviceID=""" & Name & """} WHERE AssocClass = Win32_DiskDriveToDiskPartition")
mos_part = New ManagementObjectSearcher(oq_part)
For Each obj_part In mos_part.Get()
oq_disk = New ObjectQuery("ASSOCIATORS OF {Win32_DiskPartition.DeviceID=""" & obj_part("DeviceID") & """} WHERE AssocClass = Win32_LogicalDiskToPartition")
mos_disk = New ManagementObjectSearcher(oq_disk)
For Each obj_disk In mos_disk.Get()
ans &= obj_disk("Name") & ","
Next
Next
Return ans.Trim(","c)
End Function
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
StartDetection()
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
m_MediaConnectWatcher.Stop()
Application.Exit()
End Sub
End Class

How to call a value of an object property from a class in a text box?using VBA

I have the following property in my clsdata class:
Public Property Get PatientCount() As Long
PatientCount = UBound(maobjPatient)
End Property
I also have this function in my class:
Private Function CountNonEmptyLines(ByVal strfile As String) As Long
Dim intFile As Integer
Dim strLine As String
Dim lngcount As Long
intFile = FreeFile
Open strfile For Input As intFile
lngcount = 0&
Do While Not EOF(intFile)
Line Input #intFile, strLine
If Len(strLine) > 0 Then
lngcount = lngcount + 1
End If
Loop
Close #intFile
CountNonEmptyLines = lngcount
End Function
the code of InputData is the following:
Public Sub InputData()
Dim blnLoaded As Boolean
Dim path As String
Dim file As String
Dim lnglines As Long
path = MyForm.TextPath
file = MyForm.TextFile
If LoadData(path, file) = False Then
MsgBox FileErrorString
Else
blnLoaded = LoadData(path, file)
End If
End Sub
and the code of LoadData is:
Private Function LoadData( _
ByVal strPath As String, _
ByVal strfile As String) _
As Boolean
Dim strPathFile As String
Dim lngRows As Long
LoadData = False
EraseData
InitialiseState
strPathFile = strPath & "\" & strfile
If Not FileExists(strPathFile) Then
Exit Function
End If
lngRows = CountNonEmptyLines(strPathFile)
If lngRows = 0 Then
Exit Function
End If
If Not LoadPatientLines(strPathFile, lngRows) Then
Exit Function
End If
mFileError = leNOERROR
LoadData = True
End Function
In my form I have a button which loads some data from a file:
Private Sub CmdLoad_Click()
Dim myData As New clsData
Call myData.InputData
End Sub
I also have a textbox:
Private Sub TextEntries_Change()
End Sub
How can I have the value of PatientCount or the lngcount from countnonemptylines function, in my textbox when I click CmdLoad, something like TextEntries.text=...?
As follow up from comments, this one works:
TextEntries.text = myData.PatientCount

SSIS Script transformation error using ADO.NET

I'm getting an error that states Incorrect syntax near ')'. when executing my SSIS package. The error is being thrown by a Script transformation component in the DFT. From what I can tell it is being thrown by the sqlReader = sqlCmd.ExecuteReader() line. I have been looking at it for days now and can't seem to figure out what is causing the error. I've included the contents of the script component below. Anyone have any ideas?
Imports System
Imports System.Data
Imports System.Math
Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper
Imports Microsoft.SqlServer.Dts.Runtime.Wrapper
Imports System.Data.SqlClient
Public Class ScriptMain
Inherits UserComponent
Dim connMgr As IDTSConnectionManager90
Dim sqlConn As SqlConnection
Dim sqlCmd As SqlCommand
Dim sqlParam As SqlParameter
Public Overrides Sub AcquireConnections(ByVal Transaction As Object)
connMgr = Me.Connections.connTalisma
sqlConn = CType(connMgr.AcquireConnection(Nothing), SqlConnection)
End Sub
Public Overrides Sub PreExecute()
sqlCmd = New SqlCommand("SELECT Name FROM dbo.Category WHERE CatID = #catid)", sqlConn)
sqlParam = New SqlParameter("#catid", SqlDbType.Int)
sqlCmd.Parameters.Add(sqlParam)
End Sub
Public Overrides Sub ReleaseConnections()
connMgr.ReleaseConnection(sqlConn)
End Sub
Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)
Dim sqlReader As SqlDataReader
Dim delimitedField As String = Row.FinalCallReason
Dim delimiter As String = ";"
Dim tempField As String
If Not (String.IsNullOrEmpty(delimitedField)) Then
Dim DelimitedListArray() As String = delimitedField.Split(New String() {delimiter}, StringSplitOptions.RemoveEmptyEntries)
For Each item As String In DelimitedListArray
sqlCmd.Parameters("#catid").Value = CInt(item)
MsgBox(item)
Try
sqlReader = sqlCmd.ExecuteReader()
tempField = tempField + ";" + sqlReader.GetString(0)
Catch e As Exception
MsgBox("Error: " + e.Message)
End Try
Next
End If
Row.FinalCallReason = tempField
End Sub
End Class
In the following section of the code, change #catid) to #catid in the SqlCommand object initialization statement.
Remove the parentheses. It is not needed. The parentheses is causing the query to fail and hence the error message Incorrect syntax near ')'.
Public Overrides Sub PreExecute()
sqlCmd = New SqlCommand("SELECT Name FROM dbo.Category WHERE CatID = #catid)", sqlConn)
sqlParam = New SqlParameter("#catid", SqlDbType.Int)
sqlCmd.Parameters.Add(sqlParam)
End Sub