ошибка при выполнении хранимой процедуры Oracle

У меня есть небольшой проект, в котором я пытаюсь вставить некоторые значения в Oracle через процедуру хранения из интерфейса vb.net.

Вот коды:

Коды Oracle

CREATE SEQUENCE my_doc_seq INCREMENT BY 1 START WITH 1 MAXVALUE 999999 MINVALUE 1;
/
CREATE TABLE MY_DOC 
   (ID NUMBER PRIMARY KEY, 
    FILE_NAME VARCHAR2(255 BYTE), 
    UPLOAD_DATE VARCHAR2(10 BYTE), 
    FILESIZE VARCHAR2(20 BYTE), 
    FILETYPE VARCHAR2(5 BYTE), 
    CONTENT BFILE, 
    CREATION_DATE DATE DEFAULT SYSDATE NOT NULL ENABLE, 
    MODIFICATION_DATE DATE, 
    ACCESSED_DATE DATE)
/
CREATE INDEX MY_DOC_IDX ON MY_DOC (CONTENT) INDEXTYPE IS CTXSYS.CONTEXT ;
/
CREATE OR REPLACE DIRECTORY DOCUMENTS AS 'D:\docs';
/
create or replace PROCEDURE put_file
 (
  p_file_name         IN my_doc.file_name%TYPE,
  p_upload_date       IN my_doc.upload_date%TYPE,
  p_filesize          IN my_doc.filesize%TYPE,
  p_filetype          IN my_doc.filetype%TYPE,
  p_creation_date     IN my_doc.creation_date%TYPE, 
  p_modification_date IN my_doc.modification_date%TYPE, 
  p_accessed_date     IN my_doc.accessed_date%TYPE
) AS
 BEGIN
   INSERT INTO my_doc (id, file_name, upload_date, filesize, filetype, content, creation_date, modification_date, accessed_date)
   VALUES (my_doc_seq.NEXTVAL, p_file_name, p_upload_date, p_filesize, p_filetype, BFILENAME('DOCUMENTS',p_file_name), p_creation_date, p_modification_date, p_accessed_date);
   COMMIT;

END;

Коды VB.NET

Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    Try
        Dim strFolder As String = "D:\docs\"
        Dim connectionString As String = "Data Source=orcl;Persist Security Info=True;User ID=my_user;Password=my_password"
        Dim connection As New OracleConnection(connectionString)
        Dim fso As New Scripting.FileSystemObject()
        Dim oFolder As Scripting.Folder = fso.GetFolder(strFolder)

        connection.Open()

        For Each oFile As String In Directory.GetFiles(strFolder)
        Dim strCmd As String = "licenta.put_file('" & New FileInfo(oFile).Name & "', " & _
        "SYSDATE, '" & _
        New FileInfo(oFile).Length & "', '" & _
        New FileInfo(oFile).Extension & "', '" & _
        New FileInfo(oFile).CreationTime.ToString("dd-MMM-yyyy") & "', '" & _
        New FileInfo(oFile).LastWriteTime.ToString("dd-MMM-yyyy") & "', '" & _
        New FileInfo(oFile).LastAccessTime.ToString("dd-MMM-yyyy") & "')"

        Dim cmd As New OracleCommand
        cmd.Connection = connection

        cmd.CommandText = strCmd
        cmd.CommandType = CommandType.Text

        Dim temp As Integer = cmd.ExecuteNonQuery()

        If temp > 0 Then
            MessageBox.Show("File name " & New FileInfo(oFile).Name & " inserted!")
        Else
            MessageBox.Show("An error occurred, file name " & New FileInfo(oFile).Name & " not inserted!")
        End If

        MessageBox.Show("strCmd= " & strCmd)
        Next

        connection.Close()
        strFolder = Nothing
        Catch

        End Try
    End Sub

Когда я выполняю код VB, я получаю следующую ошибку в CATCH, но строка, которую я генерирую в "strCmd", отлично работает, когда я помещаю ее непосредственно в Oracle.

ORA-00900: неверный оператор SQL

Кто-нибудь может помочь мне отладить это, пожалуйста?

Большое спасибо, Миккуту.

ПРИМЕЧАНИЕ. Я также пробовал использовать параметризованный запрос, код ниже:

Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    Try
        Dim strFolder As String = "D:\docs\"
        Dim connectionString As String = "Data Source=orcl;Persist Security Info=True;User ID=my_user;Password=my_password"
        Dim connection As New OracleConnection(connectionString)
        Dim fso As New Scripting.FileSystemObject()
        Dim oFolder As Scripting.Folder = fso.GetFolder(strFolder)

        connection.Open()

        For Each oFile As String In Directory.GetFiles(strFolder)

            Dim cmd As New OracleCommand
            cmd.Connection = connection

            cmd.Parameters.Add(New FileInfo(oFile).Name, OracleDbType.Varchar2, 255).Direction = ParameterDirection.Input
            cmd.Parameters.Add(Date.Now().ToString("dd-MMM-yyyy"), OracleDbType.Date).Direction = ParameterDirection.Input
            cmd.Parameters.Add(ToString(New FileInfo(oFile).Length), OracleDbType.Int64).Direction = ParameterDirection.Input
            cmd.Parameters.Add(New FileInfo(oFile).Extension, OracleDbType.Varchar2, 5).Direction = ParameterDirection.Input
            cmd.Parameters.Add(New FileInfo(oFile).CreationTime.ToString("dd-MMM-yyyy"), OracleDbType.Date).Direction = ParameterDirection.Input
            cmd.Parameters.Add(New FileInfo(oFile).LastWriteTime.ToString("dd-MMM-yyyy"), OracleDbType.Date).Direction = ParameterDirection.Input
            cmd.Parameters.Add(New FileInfo(oFile).LastAccessTime.ToString("dd-MMM-yyyy"), OracleDbType.Date).Direction = ParameterDirection.Input

            cmd.CommandText = "put_file"
            cmd.CommandType = CommandType.StoredProcedure
            Dim temp As Integer = cmd.ExecuteNonQuery()

            If temp > 0 Then
                MessageBox.Show("File name " & New FileInfo(oFile).Name & " inserted!")
            Else
                MessageBox.Show("An error occurred, file name " & New FileInfo(oFile).Name & " not inserted!")
            End If
          connection.Close()
            strFolder = Nothing
    Catch
End Try
End Sub

person mikcutu    schedule 01.03.2017    source источник
comment
Какая ошибка и где она возникает - я имею в виду не только в вашем Try Catch?   -  person Ally    schedule 01.03.2017
comment
Может ли сервер базы данных видеть каталог D: \ docs помимо запроса Alex M? (То есть вы не пытаетесь получить доступ к каталогу на своем клиентском компьютере, который сервер базы данных не сопоставил)   -  person Boneist    schedule 01.03.2017
comment
comment
@Alex M. Я добавил код ошибки   -  person mikcutu    schedule 01.03.2017
comment
@Boneist, Да, база данных может видеть каталог D: \ doc, так как строка strCmd может быть успешно выполнена в базе данных   -  person mikcutu    schedule 01.03.2017
comment
@ MT0, я также пробовал параметризованный запрос:   -  person mikcutu    schedule 01.03.2017
comment
@ MT0, с параметризованным запросом, у меня другая ошибка: ORA-01400: невозможно вставить NULL в (MY_DOC.CREATION_DATE) ORA-06512: в PUT_FILE, строка 12 ORA-06512: в строке 1   -  person mikcutu    schedule 01.03.2017


Ответы (1)


В конце концов, я нашел решение. Даже если я попробовал параметризованный запрос, я использовал его неправильно (не предоставил значения для параметров. Я просто определил их). Вот решение:

Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    Try
        Dim strFolder As String = "D:\docs\"
        Dim connectionString As String = "Data Source=orcl;Persist Security Info=True;User ID=my_user;Password=my_password"
        Dim connection As New OracleConnection(connectionString)
        Dim fso As New Scripting.FileSystemObject()
        Dim oFolder As Scripting.Folder = fso.GetFolder(strFolder)

        connection.Open()

        For Each oFile As String In Directory.GetFiles(strFolder)

            Dim cmd As New OracleCommand
            cmd.Connection = connection

            cmd.Parameters.Add("p_file_name", OracleDbType.Varchar2, 255).Direction = ParameterDirection.Input
            cmd.Parameters("p_file_name").Value = New FileInfo(oFile).Name

            cmd.Parameters.Add("p_upload_date", OracleDbType.Date).Direction = ParameterDirection.Input
            cmd.Parameters("p_upload_date").Value = Date.Now()

            cmd.Parameters.Add("p_filesize", OracleDbType.Int64).Direction = ParameterDirection.Input
            cmd.Parameters("p_filesize").Value = New FileInfo(oFile).Length

            cmd.Parameters.Add("p_filetype", OracleDbType.Varchar2, 5).Direction = ParameterDirection.Input
            cmd.Parameters("p_filetype").Value = New FileInfo(oFile).Extension

            cmd.Parameters.Add("p_creation_date", OracleDbType.Date).Direction = ParameterDirection.Input
            cmd.Parameters("p_creation_date").Value = New FileInfo(oFile).CreationTime

            cmd.Parameters.Add("p_modification_date", OracleDbType.Date).Direction = ParameterDirection.Input
            cmd.Parameters("p_modification_date").Value = New FileInfo(oFile).LastWriteTime

            cmd.Parameters.Add("p_accessed_date", OracleDbType.Date).Direction = ParameterDirection.Input
            cmd.Parameters("p_accessed_date").Value = New FileInfo(oFile).LastAccessTime

            cmd.CommandText = "put_file"
            cmd.CommandType = CommandType.StoredProcedure
            Dim temp As Integer = cmd.ExecuteNonQuery()

            If temp > 0 Then
                MessageBox.Show("File name " & New FileInfo(oFile).Name & " inserted!")
            Else
                MessageBox.Show("An error occurred, file name " & New FileInfo(oFile).Name & " not inserted!")
            End If

            connection.Close()
            strFolder = Nothing
        Next
    Catch
    End Try
End Sub
person mikcutu    schedule 02.03.2017