"ORA-01460: 轉換請求無法實現或不合理"及C#操作Blob總結


class BlobDemo
{
    private static readonly string ConnectionString =
           "Data Source=Tcco;User ID=scott;Password=tiger;";
    public void AddWithProcedure(string file)
        {
            if (File.Exists(file) == false)
            {
                return;
            }
            string strSql = "AddPhoto";
            using (OracleConnection conn = new OracleConnection(ConnectionString))
            {
                conn.Open();
                OracleCommand cmd = new OracleCommand(strSql, conn);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add(new OracleParameter("vPhoto", OracleType.Blob));
                cmd.Parameters[0].Value = File.ReadAllBytes(file);//A
                cmd.ExecuteNonQuery();
            }
        }
    //方法1
    public void AddWithSqlText(string file)
        {
            if (File.Exists(file) == false)
            {
                return;
            }
            //string strSql = "begin insert into blobdemo(Photo) values(:Photo);end;";//B
            string strSql = "insert into blobdemo(Pno,Photo) values(pno.nextval,:Photo)";

            using (OracleConnection conn = new OracleConnection(ConnectionString))
            {
                conn.Open();
                OracleCommand cmd = new OracleCommand(strSql, conn);
                cmd.Parameters.Add(new OracleParameter(":Photo", OracleType.Blob));
                cmd.Parameters[0].Value = File.ReadAllBytes(file);
                cmd.ExecuteNonQuery();
            }
        }
    //方法2
    public void AddWithProcedure2(string file)
        {
            if (File.Exists(file) == false)
            {
                return;
            }
            string strSql = "AddPhoto";
            using (OracleConnection conn = new OracleConnection(ConnectionString))
            {
                conn.Open();
                OracleCommand cmd = new OracleCommand(strSql, conn);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add(new OracleParameter("vPhoto", OracleType.Blob));

                byte[] arr = null;
                using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.Read))
                {
                    arr = new byte[fs.Length];
                    fs.Read(arr, 0, arr.Length);
                }
                //生成OracleLob類型
                OracleCommand cmd2 = conn.CreateCommand();

                OracleTransaction tx;
                tx = conn.BeginTransaction();

                cmd2.Transaction = tx;
                cmd2.CommandText = "declare xx blob; begin dbms_lob.createtemporary(xx, false, 0); :tempblob := xx; end;";
                cmd2.Parameters.Add(new OracleParameter("tempblob", OracleType.Blob));
                cmd2.Parameters["tempblob"].Direction = ParameterDirection.Output;

                cmd2.ExecuteNonQuery();

                OracleLob tempLob;

                tempLob = (OracleLob)cmd2.Parameters["tempblob"].Value;
                tempLob.BeginBatch(OracleLobOpenMode.ReadWrite);
                tempLob.Write(arr, 0, arr.Length);
                tempLob.EndBatch();
                //tx.Commit();

                cmd.Parameters[0].Value = tempLob;
                cmd.Transaction = tx;

                cmd.ExecuteNonQuery();
            }
        }
}

在調用存儲過程(腳本如下)時出現上述錯誤AddPhoto,原因:
A處語句將byte[]數組賦給參數,在存儲過程執行時,應該有一個轉換(猜測):暫且稱為byte[]到blob的轉換,
而這個轉換應該是plsql完成的,如果數組長度大於32767(外來,未證實)的話,就會報上述錯誤。
那么怎樣避免這個錯誤呢?

方法1:不用存儲過程,用sql語句
 
注:但不能有多個語句,如B處,否則還是報上述錯誤。
方法2:還是用存儲過程,但在賦值前將byte[]轉換成OracleLob類型

--創建表
create table BLOBDEMO
(
  PHOTO BLOB,
  PNO   NUMBER(18)
)
--創建序列
create sequence PNO
minvalue 1
maxvalue 9999999999999999999999999
start with 27
increment by 1
nocache;
--創建存儲過程
create or replace procedure AddPhoto
(vPhoto in blob)
is
l_pno number(18);
begin
select pno.nextval into l_pno from dual;
insert into BlobDemo(pno,Photo) values(l_pno,vPhoto);
end;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM