У меня есть следующая процедура в Oracle:
CREATE OR REPLACE PROCEDURE usp_Templates_InsertImage(
p_FileImage blob,
p_FileSize number DEFAULT null,
p_ImageFileName varchar2 DEFAULT null, cur OUT SYS_REFCURSOR)
AS
v_CompanyId nvarchar2(10); v_RecDate date;
BEGIN
select company_id, rec_date into v_CompanyId, v_RecDate
from uvw_Templates_Load_MainRecData;
insert into tblTemplateImages(CompanyID,RecDate,FileImage,FileSize,ImageFileName,CreateUser,CreateDate,LastModifiedUser,LastModifiedDate)
values( v_CompanyId, v_RecDate,to_blob(p_FileImage),p_FileSize,p_ImageFileName,USER,SYSTIMESTAMP,USER,SYSTIMESTAMP );-- returning id into v_id;
open cur for select tblTemplateImages_seq1.currval from dual;
END;
И в таблице ' tblTemplateImages ' выше, столбец FileImage имеет тип Blob .
Чтобы вызвать процедуру и вставить значение, я написал следующий код в VB.Net и сделал необходимые ссылки:
Try
If Not System.IO.File.Exists(vsFile) Then Exit Try
Dim Buffer As Byte() = System.IO.File.ReadAllBytes(vsFile)
Using conn As OracleConnection = New OracleConnection(_ConnectionString)
Using cmd As OracleCommand = New OracleCommand("usp_Templates_InsertImage", conn)
With cmd
.CommandType = CommandType.StoredProcedure
Dim param1 As OracleParameter = New OracleParameter()
param1.Direction = ParameterDirection.Input
param1.OracleType = OracleType.Blob
param1.ParameterName = "p_FileImage"
param1.Value = Buffer
.Parameters.Add(param1)
Dim param2 As OracleParameter = New OracleParameter()
param2.Direction = ParameterDirection.Input
param2.OracleType = OracleType.Number
param2.ParameterName = "p_FileSize"
param2.Value = Buffer.Length
.Parameters.Add(param2)
Dim sFileName = Right(vsFile, Len(vsFile) - vsFile.LastIndexOf("\") - 1)
Dim param3 As OracleParameter = New OracleParameter()
param3.Direction = ParameterDirection.Input
param3.OracleType = OracleType.VarChar
param3.ParameterName = "p_ImageFileName"
param3.Value = sFileName
.Parameters.Add(param3)
Dim param4 As OracleParameter = New OracleParameter()
param4.Direction = ParameterDirection.Output
param4.OracleType = OracleType.Cursor
param4.ParameterName = "cur"
.Parameters.Add(param4)
conn.Open()
nRetVal = CInt(.ExecuteScalar)
End With
End Using
End Using
Catch ex As Exception
TLS.Log.AddAsync(vsLogEntry:=ex.Message, veLogType:=ApplicationLogger.AppLogger.eLoggerType.Error, vsCodeSource:=SOURCE_CLASS & ".SaveTemplateImage")
End Try
где vsFile имеет тип string и содержит файл .xlsx ("C: \ Projects \ TemplateLoad \ Load \ AALBERTSINDUSTRIESNVORDEUR025 20190319.xlsx")
Длина буфера становится 378367 (Buffer.Length)и sFileName - «AALBERTSINDUSTRIESNVORDEUR025 20190319.xlsx» [отмечено при запуске программы].
При выполнении вышеуказанного кода VB.Net, в строке nRetVal = CInt (.ExecuteScalar) , япоявляется следующая ошибка:
ORA-01460: запрошено невыполненное или необоснованное преобразование
Может кто-нибудь помочь мне решить эту проблему?