2017-03-01 2 views
0

ich ein kleines Projekt, wo ich versuche, einige Werte in Oracle über Speichervorgang von einer vb.net SchnittstelleFehler bei der Ausführung einer gespeicherten Oracle-Prozedur

Hier einzufügen sind die Codes:

Oracle-Codes

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 Codes

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 

Wenn ich die VB-Code bin Ausführung receiv I Der folgende Fehler bei CATCH, aber die Zeichenfolge, die ich in "strCmd" erzeuge funktioniert gut, wenn ich es direkt in Oracle lege.

ORA-00900: invalid SQL statement

Kann mir bitte jemand helfen, das zu debuggen?

Vielen Dank, Mikcutu.

HINWEIS: Ich habe auch mit parametrisierte Abfrage versucht, Code unten:

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 
+2

Welche Fehler und wo sie auftreten - und damit meine ich nicht nur in Ihrem 'Versuchen Catch'? –

+1

Zusätzlich zu Alex Ms Anfrage für weitere Informationen, kann der Datenbankserver das Verzeichnis D: \ docs sehen? (Z. B. versuchen Sie nicht, auf ein Verzeichnis auf Ihrem Clientcomputer zuzugreifen, das der Datenbankserver nicht zugeordnet hat) – Boneist

+0

[Verwenden Sie parametrisierte Abfragen.] (Http://stackoverflow.com/q/811481/1509264) – MT0

Antwort

0

Am Ende fand ich die Lösung. Selbst wenn ich die parametrisierte Abfrage ausprobiert habe, habe ich sie nicht korrekt verwendet (ich habe keine Werte für die Parameter angegeben. Ich habe sie nur definiert). Hier ist die Lösung:

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 
Verwandte Themen