Provider type could not be represented as a .NET type OracleTypeException - sql

So I have an application that is writing to an oracle database, then another that is reading the data from the same database.
When I get to the line Dim msgTime As TimeSpan = reader.GetTimeSpan(2), I get an exception (see below).
The Oracle Documentation says that INTERVAL DAY TO SECOND (which is how I'm storing the data in the DB) can be converted to timespan (see here)
Does anyone know what causes this exception, and how to avoid it?
Thanks.
Exception:
Oracle.DataAccess.Types.OracleTypeException
Provider type could not be represented as a .NET type
at Oracle.DataAccess.Types.TimeSpanConv.GetTimeSpan(OpoITLValCtx* pValCtx, OracleDbType oraType)
at Oracle.DataAccess.Client.OracleDataReader.GetTimeSpan(Int32 i)
at MyProgram.pollDatabase(Object sender, DoWorkEventArgs e)
Write to DB code:
Dim oCommand As New OracleCommand("INSERT INTO LOGTABLE(PK, MID,MDATE,MTIME,STATUS,SEVERITY,ORIGQ,MESSAGE) VALUES (:pk, :msgid, :msgdate, :msgtime, :status, :severity, :message)")
oCommand.Parameters.Add("pk", OracleDbType.Varchar2, Guid.NewGuid().ToString().Substring(0, 12), ParameterDirection.Input)
oCommand.Parameters.Add("msgid", OracleDbType.Varchar2, message.MessageID, ParameterDirection.Input)
oCommand.Parameters.Add("msgdate", OracleDbType.Date, putDateSQL, ParameterDirection.Input)
oCommand.Parameters.Add("msgtime", OracleDbType.IntervalDS, putTimeSQL, ParameterDirection.Input)
oCommand.Parameters.Add("status", OracleDbType.Varchar2, "NEW", ParameterDirection.Input)
oCommand.Parameters.Add("severity", OracleDbType.Varchar2, messageSeverity, ParameterDirection.Input)
oCommand.Parameters.Add("message", OracleDbType.Clob, clob, ParameterDirection.Input)
Read from DB Code:
Dim conn As OracleConnection = New OracleConnection(oradb)
Dim oCommand As New OracleCommand("SELECT MID,MDATE,MTIME,STATUS,SEVERITY, ORIGQ, MESSAGE FROM LOGTABLE")
oCommand.CommandType = CommandType.Text
oCommand.Connection = conn
oCommand.Connection.Open()
Dim reader As Oracle.DataAccess.Client.OracleDataReader = oCommand.ExecuteReader()
If reader.HasRows Then
While reader.Read()
Try
Dim messageID As String = reader.GetString(0)
Dim msgDate As Date = reader.GetDateTime(1)
If Not reader.IsDBNull(2) Then
Dim msgTime As TimeSpan = reader.GetTimeSpan(2)
End If
Dim msgStatus As String = reader.GetString(3)
Dim msgSeverity As String = reader.GetString(4)
Dim msgOrigin As String = reader.GetString(5)
Dim msgContent As String = reader.GetString(6)
Catch ex As Exception
Console.Out.WriteLineAsync(ex.Message)
End Try
End While
End If

I needed to use Dim msgTimeInterval As Oracle.DataAccess.Types.OracleIntervalDS = reader.GetOracleIntervalDS(2) instead of Dim msgTime As TimeSpan = reader.GetTimeSpan(2)

Related

Oracle.ManagedDataAccess Procedures with Date as a Parameter causing exception

create or replace PROCEDURE PROCEDURE_ONE(
T1_CURSOR OUT SYS_REFCURSOR,
Date_Start_P in Date Default sysdate
)
as
begin
OPEN T1_CURSOR FOR ...
This works when testing with Oracle SQL Developer
My VB.Net code doesn't like the parameter
Private Function Load_Aging_Stock() As DataTable
Try
Dim dba As New Data_Access_Class
Dim strSQL As String = "JOHN.PROCEDURE_ONE"
Dim dt As DataTable
Dim cmd As OracleCommand = dba.CreateStoredProcCommand(strSQL)
Dim oracleParameter(1) As OracleParameter
oracleParameter(0) = New OracleParameter()
oracleParameter(1) = New OracleParameter()
cmd.BindByName = True
With cmd
oracleParameter(0) = cmd.Parameters.Add("T1_Cursor", dbType:=Oracle.ManagedDataAccess.Client.OracleDbType.RefCursor, ParameterDirection.Output)
'.Parameters.Add("T1_CURSOR", OracleClient.OracleType.Cursor).Direction = ParameterDirection.Output
If Me.chk_No_Date_Start.Checked = False Then
Dim tmpDate As String = CDate(Me.dt_Start_Date.Text.Trim).ToString("yyyy-MM-dd")
oracleParameter(1) = cmd.Parameters.Add("Date_Start_P", dbType:=Oracle.ManagedDataAccess.Client.OracleDbType.Varchar2, val:=tmpDate, ParameterDirection.Input)
'.Parameters.Add("Date_Start_P", OracleClient.OracleType.DateTime).Value = Me.dt_Start_Date.Text
End If
End With
dt = dba.ExecuteSelectCmdDataTbl(cmd)
Return dt
Catch ex As Exception
Dim Err As New SS_Errors("frm__Report", "Load_Report", ex)
Return Nothing
End Try
End Function
I've also tried the same code but replaced Varchar2 with Date and both times, I get the same exception
One of the identified items was in an invalid format.
Don't pass the string as parameter value, just use the Date value, i.e.
oracleParameter(1) = cmd.Parameters.Add("Date_Start_P", dbType:=OracleDbType.Date, val:=CDate(Me.dt_Start_Date.Text.Trim), ParameterDirection.Input)

PostgreSQL: VB.NET ODBC UPDATE not working properly

VB.NET 2019
Postgre 10
Postgre ODBC
Source data in DBeaver:
https://i86.fastpic.ru/big/2019/0716/b9/_8741664f3e9495646d995a9d96b846b9.png
Tried to change SQL state, change parameters passing:
'Dim command As New Odbc.OdbcCommand("UPDATE public.v8users SET Data = #data WHERE ID = #id", Connection) 'MSSQL syntax
'Dim command As New Odbc.OdbcCommand("UPDATE public.v8users SET data = ?, name = ? WHERE id = ?", Connection)
'Dim command As New Odbc.OdbcCommand("UPDATE public.v8users SET data = ?data WHERE id = ?id", Connection) 'MySQL syntax
'Dim command As New Odbc.OdbcCommand("UPDATE public.v8users SET data = ? WHERE id = decode(encode(?, 'hex'), 'hex')", Connection) 'PostgreSQL syntax
'command.Parameters.Add(New Odbc.OdbcParameter("#id", SQLUser.ID))
'command.Parameters.Add(New Odbc.OdbcParameter("#data", NewBytes))
'command.Parameters.Add(New Odbc.OdbcParameter("id", SqlDbType.Binary)).Value = SQLUser.ID
'command.Parameters.Add(New Odbc.OdbcParameter("data", SqlDbType.Binary)).Value = NewBytes
'command.Parameters.Add(New Odbc.OdbcParameter("name", Odbc.OdbcType.Binary)).Value = NewBytes
Structure SQLUser
Dim ID As Byte()
Dim IDStr As String
Dim Name As String
Dim Descr As String
Dim Data As Byte()
Dim DataStr As String
Dim PassHash As String
Dim PassHash2 As String
Dim AdmRole As String
Dim KeySize As Integer
Dim KeyData As Byte()
End Structure
Dim a
Dim Connection = New Odbc.OdbcConnection("Driver={PostgreSQL Unicode};Server=192.168.2.10;Database=TestPurp;Uid=<correct>;Pwd=<correct>;UseServerSidePrepare=1;ReadOnly=0")
Dim command As New Odbc.OdbcCommand("UPDATE public.v8users SET data = ? WHERE id = ?", Connection)
command.Parameters.Clear()
command.Parameters.Add(New Odbc.OdbcParameter("id", Odbc.OdbcType.Binary)).Value = SQLUser.ID
command.Parameters.Add(New Odbc.OdbcParameter("data", Odbc.OdbcType.Binary)).Value = NewBytes
a = command.ExecuteNonQuery()
a = 0, expect a = 1
Try adding the Parameters in the same order as they appear in the Update statement. First add data then id.
command.Parameters.Add(New Odbc.OdbcParameter("data", Odbc.OdbcType.Binary)).Value = NewBytes
command.Parameters.Add(New Odbc.OdbcParameter("id", Odbc.OdbcType.Binary)).Value = SQLUser.ID
This works the same way in Access with the OleDb provider.

DBNull value for parameter is not supported. Table-valued parameters cannot be DBNull

I am currently trying to pass a two table value parameters from a .net application to a database.
The error that I am getting is
DBNull value for parameter '#StageNotes' is not supported. Table-valued parameters cannot be DBNull.
I have checked that the parameter value is not null when I pass it, and the error that I get is not a sqlException, rather just a general Exception that passes this error back
The parameters are declared like so
Dim stageNotesparamTable2SQL As New SqlParameter("#StageNotes", SqlDbType.Structured)
Dim responsesParamTable2SQL As New SqlParameter("#Responses", SqlDbType.Structured)
and the values are assigned like this
Dim responseTable = ResponsesToDt()
responsesParamTable2SQL.Value = responseTable
Dim stageTable = StageNotesToDt()
stageNotesparamTable2SQL.Value = stageTable
The parameters are declared in the stored proc like this
#StageNotes [App].[StageNotesTableType] READONLY,
#Responses [app].QuestionResponseTableType READONLY,
When debugging I see that the stageNotesparamTable2SQL.Value is showing that there is a datatable in there and has the data so it is definitely not null.
I would be grateful if anyone could help me with this.
thanks
-- edit ---
Protected Function ResponsesToDt() As DataTable
Dim dt As New DataTable()
dt.Columns.Add("CheckId", GetType(Integer))
dt.Columns.Add("QuestionId", GetType(Integer))
dt.Columns.Add("AnswerId", GetType(Integer))
dt.Columns.Add("StaffNumber", GetType(String)).MaxLength = 15
Dim dictValues = _dicOfControlsAndValues.Where(Function(x) x.Key.Contains("ddl_Stage_"))
For Each item In dictValues
Dim ddlIdBreakDown = item.Key.ToString().Split("_").ToList
Dim checkid As Integer = item.Key.ToString().Split("_").Last
Dim questionId As Integer = Convert.ToInt16(ddlIdBreakDown(4))
Dim answerId As Integer = Convert.ToInt16(item.Value)
Dim staffNumber As String = GetLoggedOnStaffNumber()
dt.Rows.Add(checkid, questionId, answerId, staffNumber)
Next
Return dt
End Function
Protected Function StageNotesToDt() As DataTable
Dim dt As New DataTable
dt.Columns.Add("CheckId", GetType(Integer))
dt.Columns.Add("StageId", GetType(Integer))
dt.Columns.Add("StageNotes", GetType(String))
dt.Columns.Add("ModifiedDate", GetType(String))
Dim dictValues = _dicOfControlsAndValues.Where(Function(x) x.Key.Contains("textArea_Stage"))
For Each item In dictValues
Dim stageNote As String = String.Empty
Dim ddlIdBreakDown = item.Key.ToString().Split("_").ToList
If String.IsNullOrEmpty(item.Value.ToString()) Then
stageNote = "."
Else
stageNote = item.Value.ToString()
End If
Dim checkid As Integer = item.Key.ToString().Split("_").Last
Dim stageId As Integer = Convert.ToInt16(ddlIdBreakDown(2))
Dim stageNotes As String = stageNote
Dim modifiedDate As DateTime = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss")
dt.Rows.Add(checkid, stageId, stageNotes, modifiedDate)
Next
Return dt
End Function
-- edit 2 --
DAL.ExecCommand("[App].[usp_SaveCheckDetails]", "",
checkIdParam,
userIdParam,
caseNoteParam,
checkNoteParam,
checkCompletedParam,
CheckFeedbackSentToUserId,
stageNotesparamTable2SQL,
responsesParamTable2SQL)
Then the DAL im having to call.
The DAL is a shared repo that Im not able to edit at the moment:
Public Function ExecCommand(ByVal spName As String, ByVal connStringName As String, ByVal ParamArray SPParms() As SqlClient.SqlParameter) As Boolean
Dim SqlConnection As New SqlConnection
Dim sqlCommand As New SqlClient.SqlCommand
Dim returnCode As Boolean = False
Try
If connStringName <> "" Then
SqlConnection.ConnectionString = ConfigurationManager.ConnectionStrings(connStringName).ConnectionString
Else
SqlConnection.ConnectionString = ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString
End If
sqlCommand.CommandType = CommandType.StoredProcedure
sqlCommand.CommandText = spName
For Each p As SqlParameter In SPParms
If p.Direction <> ParameterDirection.Output Then
If Not p.Value.GetType() = GetType(Integer) Then
If p.Value.ToString() = "" OrElse p.Value = Nothing Then
p.Value = DBNull.Value
End If
End If
End If
sqlCommand.Parameters.Add(p)
Next
sqlCommand.Connection = SqlConnection
SqlConnection.Open()
sqlCommand.ExecuteNonQuery()
returnCode = True
Catch sqlEx As SqlException
HelpersErrorHandling.WriteAppLogEntry(Me.GetType().Name, System.Reflection.MethodBase.GetCurrentMethod().ToString, sqlEx)
Catch ex As Exception
If Not ex.Message.ToString().Contains("Thread was being aborted") Then
HelpersErrorHandling.WriteAppLogEntry(Me.GetType().Name, System.Reflection.MethodBase.GetCurrentMethod().ToString, ex)
End If
Finally
Try
sqlCommand.Parameters.Clear()
sqlCommand.Dispose()
SqlConnection.Close()
SqlConnection.Dispose()
Catch ex As Exception
HelpersErrorHandling.WriteAppLogEntry(Me.GetType().Name, System.Reflection.MethodBase.GetCurrentMethod().ToString, ex)
End Try
End Try
Return returnCode
End Function

When I try to pull nvarchar column value that has an emojis stored in it, the data in VB.net it displays as '??'

When I try to pull the emoji value from the database using VB.net the emoji is displayed as '??'
Is there some sort of conversion I need to do in my stored procedure?
Private Function DisplayEmoji(input As String) As String
Dim output As New StringBuilder()
Dim enumerator = StringInfo.GetTextElementEnumerator(input)
While enumerator.MoveNext()
Dim chunk As String = enumerator.GetTextElement()
If Char.IsSurrogatePair(chunk, 0) Then
output.Append("<img src=""" + "https://abs.twimg.com/emoji/v1/72x72/" + Char.ConvertToUtf32(chunk, 0).ToString("x") + ".png"" style=""height:1.5em; width:1.5em;"">")
Else
output.Append(chunk)
End If
End While
Return output.ToString()
End Function
Or insert your image Blob type and read sql.
Dim filePath As String = Server.MapPath("APP_DATA/test.png")
Dim filename As String = Path.GetFileName(filePath)
Dim fs As FileStream = New FileStream(filePath, FileMode.Open, FileAccess.Read)
Dim br As BinaryReader = New BinaryReader(fs)
Dim bytes As Byte() = br.ReadBytes(Convert.ToInt32(fs.Length))
br.Close()
fs.Close()
Insert to Database yor image
Dim strQuery As String = "insert into tblFiles(Name, ContentType, Data) values (#Name, #ContentType, #Data)"
Dim cmd As SqlCommand = New SqlCommand(strQuery)
cmd.Parameters.Add("#Name", SqlDbType.VarChar).Value = filename
cmd.Parameters.Add("#ContentType", SqlDbType.VarChar).Value = "image/png"
cmd.Parameters.Add("#Data", SqlDbType.Binary).Value = bytes
InsertUpdateData(cmd)
InsertUpdateData
Public Function InsertUpdateData(ByVal cmd As SqlCommand) As Boolean
Dim strConnString As String = System.Configuration.
ConfigurationManager.ConnectionStrings("conString").ConnectionString
Dim con As New SqlConnection(strConnString)
cmd.CommandType = CommandType.Text
cmd.Connection = con
Try
con.Open()
cmd.ExecuteNonQuery()
Return True
Catch ex As Exception
Response.Write(ex.Message)
Return False
Finally
con.Close()
con.Dispose()
End Try
End Function

Oracle error ORA-01008 inside VB.NET code

Why am I getting this Oracle error when executing this VB.NET code?
Ora-01008: all variables not bound
Dim szSQLEvt As String = ""
Dim sbEvt As New StringBuilder
sbEvt.Append("INSERT INTO WORKORDERHISTORY (WORKORDERNUMBER, WORKORDEREVENT, EVENTDATE, USERNAME) ")
sbEvt.Append("VALUES(:EvtWorkOrderNumber, :WorkOrderEvent, :EventDate, :EvtUsername) ")
szSQLEvt = sbEvt.ToString
Dim cmdEvt As New OracleCommand
cmdEvt.BindByName = True
cmdEvt.Connection = conn
cmdEvt.CommandText = szSQLEvt
cmdEvt.Parameters.Add(":EvtWorkOrderNumber", Oracle.DataAccess.Client.OracleDbType.Varchar2)
cmdEvt.Parameters.Item(":EvtWorkOrderNumber").Value = szNewWONum
cmdEvt.Parameters.Add(":WorkOrderEvent", Oracle.DataAccess.Client.OracleDbType.Varchar2)
cmdEvt.Parameters.Item(":WorkOrderEvent").Value = "assigned"
cmd.Parameters.Add(":EventDate", Oracle.DataAccess.Client.OracleDbType.Date)
cmd.Parameters.Item(":EventDate").Value = Today
cmd.Parameters.Add(":EvtUsername", Oracle.DataAccess.Client.OracleDbType.Varchar2)
cmd.Parameters.Item(":EvtUsername").Value = szCurrUser
If conn.State <> ConnectionState.Open Then conn.Open()
cmdEvt.ExecuteNonQuery()
conn.Close()