Recently I have come across with an issue when updating Oracle database from SQL data-reader. It does not update the table because of conversion failure and I was getting error message like this.
Here is the on click event code that I was trying to use.
Protected Sub btnPublish_Click(sender As Object, e As System.EventArgs)
'Connect to the database and bring back the image contents & MIME type for the specified picture
Using myConnection As New SqlConnection(ConfigurationManager.ConnectionStrings("ApplicationServices").ConnectionString)
Const ora As String = "SELECT * FROM rtt_trails WHERE trail_id = @trail_id"
Dim myCommand As New SqlCommand(ora, myConnection)
myCommand.Parameters.AddWithValue("@trail_id", Request.QueryString("tid"))
myConnection.Open()
Dim myReader As SqlDataReader = myCommand.ExecuteReader
If myReader.Read Then
'Connect to the database and insert a new record into Products
Using myOraConn As New OracleConnection(ConfigurationManager.ConnectionStrings("ratisDev").ConnectionString)
Try
Dim facCommand As New OracleCommand("ratis.ratis_lite.RL_UPDATE_TRL")
facCommand.Connection = myOraConn
'command type
facCommand.CommandType = CommandType.StoredProcedure
facCommand.Parameters.Add("P_TRAIL_ID", OracleType.Number).Value = Convert.ToInt32(myReader("TRAIL_ID"))
facCommand.Parameters.Add("P_FAC_ID", OracleType.Number).Value = Convert.ToInt32(myReader("FAC_ID"))
facCommand.Parameters.Add("P_FAC_ASSET_DESC", OracleType.VarChar).Value = myReader("FAC_ASSET_DESC")
facCommand.Parameters.Add("P_FAC_ASSET_CONDITION", OracleType.VarChar).Value = myReader("FAC_ASSET_CONDITION")
facCommand.Parameters.Add("P_FAC_ASSET_STATUS", OracleType.VarChar).Value = myReader("FAC_ASSET_STATUS")
facCommand.Parameters.Add("P_FAC_LOCATION", OracleType.VarChar).Value = myReader("FAC_LOCATION").ToString()
facCommand.Parameters.Add("P_FAC_REPLACEMENT_COST", OracleType.Number).Value = myReader("FAC_REPLACEMENT_COST")
facCommand.Parameters.Add("P_FAC_LONGITUDE_DEC", OracleType.Number).Value = myReader("FAC_LONGITUDE_DEC")
facCommand.Parameters.Add("P_FAC_LATITUDE_DEC", OracleType.Number).Value = myReader("FAC_LATITUDE_DEC")
facCommand.Parameters.Add("P_FAC_UNIVERSAL_ACCESS", OracleType.VarChar).Value = myReader("FAC_UNIVERSAL_ACCESS")
facCommand.Parameters.Add("P_FAC_COMMENTS", OracleType.VarChar).Value = myReader("FAC_COMMENTS")
facCommand.Parameters.Add("P_FAC_LAST_UPDATED", OracleType.DateTime).Value = ratislite.ToDateOrNull(myReader("FAC_LAST_UPDATED"))
facCommand.Parameters.Add("P_FAC_UPDATE_BY", OracleType.VarChar).Value = ratislite.ToStringOrNull(myReader("FAC_UPDATE_BY"))
facCommand.Parameters.Add("P_FAC_REVISED_COST", OracleType.Number).Value = myReader("FAC_REVISED_COST")
facCommand.Parameters.Add("P_FAC_REASON_COST_REVISED", OracleType.VarChar).Value = myReader("FAC_REASON_COST_REVISED")
facCommand.Parameters.Add("P_FACILITY_GROUP", OracleType.VarChar).Value = myReader("FACILITY_GROUP")
facCommand.Parameters.Add("P_TRAIL_LENGTH", OracleType.Number).Value = myReader("TRAIL_LENGTH")
facCommand.Parameters.Add("P_TRAIL_WIDTH", OracleType.Number).Value = myReader("TRAIL_WIDTH")
facCommand.Parameters.Add("P_TRAIL_TYPE", OracleType.VarChar).Value = myReader("TRAIL_TYPE")
facCommand.Parameters.Add("P_MARKERS", OracleType.VarChar).Value = myReader("MARKERS")
facCommand.Parameters.Add("P_CLASSIFICATION", OracleType.VarChar).Value = myReader("CLASSIFICATION")
facCommand.Parameters.Add("P_START_POINT", OracleType.VarChar).Value = myReader("START_POINT")
facCommand.Parameters.Add("P_END_POINT", OracleType.VarChar).Value = myReader("END_POINT")
facCommand.Parameters.Add("P_SURFACE", OracleType.VarChar).Value = myReader("SURFACE")
facCommand.Parameters.Add("P_DESIGN", OracleType.VarChar).Value = myReader("DESIGN")
facCommand.Parameters.Add("P_LATITUDE_START_POINT", OracleType.Number).Value = myReader("LATITUDE_START_POINT")
facCommand.Parameters.Add("P_LONGITUDE_START_POINT", OracleType.Number).Value = myReader("LONGITUDE_START_POINT")
facCommand.Parameters.Add("P_LATITUDE_END_POINT", OracleType.Number).Value = myReader("LATITUDE_END_POINT")
facCommand.Parameters.Add("P_LONGITUDE_END_POINT", OracleType.Number).Value = myReader("LONGITUDE_END_POINT")
facCommand.Parameters.Add("P_BICYCLE_CLASS", OracleType.VarChar).Value = myReader("BICYCLE_CLASS")
facCommand.Parameters.Add("P_TRAILHEAD", OracleType.VarChar).Value = myReader("TRAILHEAD")
facCommand.Parameters.Add("P_INTERP_SIGNAGE", OracleType.VarChar).Value = myReader("INTERP_SIGNAGE")
facCommand.Parameters.Add("P_OVERNIGHT", OracleType.VarChar).Value = myReader("OVERNIGHT")
facCommand.Parameters.Add("P_LENGTH_T1", OracleType.Number).Value = myReader("LENGTH_T1")
facCommand.Parameters.Add("P_LENGTH_T2", OracleType.Number).Value = myReader("LENGTH_T2")
facCommand.Parameters.Add("P_LENGTH_T3", OracleType.Number).Value = myReader("LENGTH_T3")
facCommand.Parameters.Add("P_TRK_NAME", OracleType.VarChar).Value = myReader("TRK_NAME")
facCommand.Parameters.Add("P_INTERNAL_PATHS", OracleType.VarChar).Value = myReader("INTERNAL_PATHS")
facCommand.Parameters.Add(New OracleParameter("rs", OracleType.Number)).Direction = ParameterDirection.Output
myOraConn.Open()
'execute insert command
facCommand.ExecuteNonQuery()
Dim count As Integer = 0
count = facCommand.Parameters("rs").Value
'log record if record is published successfully
If count > 0 Then
msg.InnerHtml = "This asset has been published to RecData"
msg.Attributes.Add("class", "sync")
ratislite.log_user("RTT_FACILITY_TRAILS", myReader("TRAIL_ID"), myReader("FAC_TYPE"), "Published: Updated trail and facility tables")
'change the sync flag to yes
dsUpdateSync.Update()
Else
msg.InnerHtml = "This asset cannot be published, either this record has been updated by another user or there must be some other issue/s."
msg.Attributes.Add("class", "error")
End If
'close connection
myOraConn.Close()
Catch ex As Exception
msg.InnerHtml = ex.ToString() ' "Sorry the record cannot be published, please make sure you are connected to DEC network." 'ex.ToString()
msg.Attributes.Add("class", "error")
Finally
'finally bind the data again
FormView1.DataBind()
End Try
End Using
End If
myReader.Close()
myConnection.Close()
End Using
End Sub
It is basically load the dataset in sqlDataReader and bind the variables in Oracle command parameters. It works fine when the last updated field (date) is not empty but it does not work when the field in null. I have tried to use custom function to convert the DBNull to null field but no luck. Here is the function I have tried but did not work –
Public Shared Function ToDateOrNull(ByVal value As String) As Object
If Not IsDBNull(value) Then
Return Date.Parse(value).Date
End If
Return OracleDateTime.Null.IsNull
'DBNull.Value
End Function
I am not sure what I did wrong there. Now I have changed the parameter line with very simple condition like below –
facCommand.Parameters.Add(“P_FAC_LAST_UPDATED”, OracleType.DateTime).Value = ratislite.ToDateOrNull(myReader(“FAC_LAST_UPDATED”))
to
facCommand.Parameters.Add("P_FAC_LAST_UPDATED", OracleType.DateTime).Value = If(myReader("FAC_LAST_UPDATED"), DBNull.Value)
It works fine for me and I can see the update pushed to Oracle Database.


