繁体   English   中英

ORA-22288:文件或LOB操作FILEOPEN失败系统找不到指定的路径

[英]ORA-22288: file or LOB operation FILEOPEN failed The system cannot find the path specified

我有一个有三列的表

表名是BFILETABEL

FILEID (number) //number data type
FILENAME (varchar2)
FILEDATA (BFILE) //Data type is BFILE

在我的C#代码中,我试图创建一个目录,然后将其插入表格行

private void bFileInsertFileInOracle(string fileName)
        {
        string[] getFileNameFromAddress = fileName.Split('\\');

        myConnection.Open();
        OracleCommand createFolder = new OracleCommand();
        createFolder.Connection = myConnection;

        createFolder.CommandText = "CREATE OR REPLACE DIRECTORY bfileimages AS 'C:\\TEMP\\bfileimages'";
        createFolder.ExecuteNonQuery();

        String strSQL = "INSERT INTO BFILETABEL VALUES (" + bFileFileIDS + ",'" + fileName + "', BFILENAME('BFILEIMAGES', '" + getFileNameFromAddress[getFileNameFromAddress.Length - 1] + "'))";

        OracleCommand cm = new OracleCommand();
        cm.Connection = myConnection;
        cm.CommandText = strSQL;
        cm.ExecuteNonQuery();

        myConnection.Close();
        }

其中“fileName”是图像文件的路径。 执行时不会显示异常。 我的意思是没有例外显示用户权限异常,没有显示任何内容。 但是当我选择该文件并打开它时会生成异常

ORA-22288: file or LOB operation FILEOPEN failed
The system cannot find the path specified.

该功能的代码是

        private void bFileShow_Click(object sender, EventArgs e)
        {
        int getNumber = Convert.ToInt16(BFileTextboxImgID.Text);

        myConnection.Open();
        OracleCommand ocmd = new OracleCommand("select * from BFILETABEL where fileid=" + getNumber + "", myConnection);
        ocmd.InitialLOBFetchSize = 2;
        OracleDataReader rd = ocmd.ExecuteReader();
        rd.Read();
        OracleBFile getBlob = rd.GetOracleBFile(2);
        getBlob.OpenFile();   // exception occurs at that line 
        if (getBlob.FileExists)
            {
            label1.Text = getBlob.FileName.ToString(); 
            getBlob.OpenFile();
            byte[] buffer = new byte[100];

            getBlob.Seek(0, SeekOrigin.Begin);
            getBlob.Read(buffer, 0, 100);
            MemoryStream ms = new MemoryStream(buffer);
            blobPictureBox.Image = new Bitmap(ms);
            }
        myConnection.Close();
        }

我假设您的代码中的文件已经位于c:\\ temp目录中。 因此,您只将c:\\ temp中的现有文件与Oracle上的bfile指针相关联。 如果您没有该文件已存在于目标文件夹中,请使用存储过程中列出的代码(如下所示)从C#插入。 此代码取自我们开发的Invantive Vision文档管理系统,但您可以随意使用我们代码的这一部分。 上传后,您需要在bfile表中插入指针。

进一步检查您是否正在使用ODP.Net和一些最新版本。 它解决了很多常见问题。

也总是在insert语句中编写列列表。 当Oracle变得狂野,并且您的列被重新排序时,插入将神奇地失败或具有有趣的效果:

String strSQL = "INSERT INTO BFILETABEL VALUES (" + bFileFileIDS + ",'" + fileName + "', BFILENAME('BFILEIMAGES', '" + getFileNameFromAddress[getFileNameFromAddress.Length - 1] + "'))";

String strSQL =“INSERT INTO BFILETABEL (COLUMN1,COLUMN2,COLUMN3,COLUMN4) VALUES(”+ bFileFileIDS +“,”“+ fileName +”',BFILENAME('BFILEIMAGES','“+ getFileNameFromAddress [getFileNameFromAddress.Length - 1] + “'))”;

建议使用带参数的东西替换插入语句(重复执行时更快)或正确转义值。 也许某人使用带有引号的文件名,这会导致解析SQL时出错。

在目录中上传blob的示例:

procedure write_blob_to_file
( p_directory varchar2
, p_filename  varchar2
, p_blob      blob
)
as
  l_fh                       utl_file.file_type;
  l_blob_length              integer;
  l_buffer                   raw(32767);
  l_chunk_size               binary_integer := 32767;
  l_blob_position            integer := 1;
begin
  l_blob_length := dbms_lob.getlength(p_blob);
  l_fh := utl_file.fopen(p_directory, p_filename, 'wb', l_chunk_size);
  --
  -- Write the BLOB to file in chunks
  --
  while l_blob_position <= l_blob_length
  loop
    if l_blob_position + l_chunk_size - 1 > l_blob_length
    then
      l_chunk_size := l_blob_length - l_blob_position + 1;
    end if;
    dbms_lob.read(p_blob, l_chunk_size, l_blob_position, l_buffer);
    utl_file.put_raw(l_fh, l_buffer, true);
    l_blob_position := l_blob_position + l_chunk_size;
  end loop;
  utl_file.fclose(l_fh);
exception
  when others
  then
    --
    -- Close file if necessary.
    -- Ignore any errors.
    --
    begin
      if utl_file.is_open(l_fh)
      then
        utl_file.fclose(l_fh);
      end if;
    exception
      when others
      then
        null;
    end;
    --
    rollback;
    itgen_error_handler.add_to_inner_stack;
    raise;
end;

我希望这可以帮助你。

它的工作原理我将文件放在C:\\ TEMP中。 我的意思是,例如,如果用户想要上传“blue hills.jpg”。 我在C:\\ TEMP中复制文件,然后我执行类似的查询

CREATE or REPLACE DIRECTORY directoryName as 'C:\TEMP'

插入查询是

INSERT INTO table_name VALUEs ('1',BFILENAME('DIRECTORYNAME','blue hills.jpg'))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM