【问题标题】:Inserting large BLOB into Oracle database将大型 BLOB 插入 Oracle 数据库
【发布时间】:2014-11-26 12:06:42
【问题描述】:

Oracle 的documentation 有一个关于如何在Java 中插入大型BLOB 的示例。是否可以在 C# 中做同样的事情?

【问题讨论】:

    标签: c# oracle blob


    【解决方案1】:

    流式回答:

    string path = @"D:\testfile.txt";
    System.IO.FileStream myStream = new System.IO.FileStream(@path, FileMode.Open);
    
    BinaryReader binaryReader = new BinaryReader(myStream);
    byte[] data = binaryReader.ReadBytes((int)myStream.Length); //read the stream into byte
    
    String sql =  "INSERT INTO testblob (testid, testblob) VALUES (100, :blobtodb)";       
    
    OracleCommand cmd = new OracleCommand();
    cmd.CommandText = sql; // Set the sql-command
    cmd.Connection = con; //con is an OracleConnection, create it before
    
    OracleParameter param = cmd.Parameters.Add("blobtodb", OracleDbType.Blob); //Add the parameter for the blobcolumn
    param.Direction = ParameterDirection.Input; 
    
    param.Value = data; //Asign the Byte Array to the parameter
    cmd.ExecuteNonQuery(); //You are done!
    

    这应该适用于每个流;)


    对于(超过)1TB 的文件:

    警告:对大文件使用 OPs 解决方案,因为内存中很难有 1TB ;)

    老实说,我不知道,这么大的文件我不能在这里尝试。然而BLOBs 是specified by Oracle 与:Maximum size: (4 GB - 1) * DB_BLOCK_SIZE initialization parameter (8 TB to 128 TB)。因此,从数据库方面它应该可以工作。 但是您可能需要注意Connection TimeoutConnection Lifetime,因为通过网络传输这么大的文件需要很长时间(我猜,我不知道您的设置)。

    【讨论】:

    • 实际上我想我找到了我要找的东西 - 你需要创建一个 OracleBlob,将你的大内容流式传输到其中(Oracle 会将其流式传输到数据库中),然后将 OracleBlob 作为参数分配到连接,此时它实际上被写入表中
    • 嗯,好吧,听起来不错。确定上述方法也行不通吗?我通常也会做的是,使用阅读器,在查询结束时使用FOR UPDATE 从数据库中读取 BLOB 列,然后使用阅读器获取 OracleBlob,例如:OracleBlob BLOB1 = reader.GetOracleBlob(int_blob_columnnumber); 并使用BLOB1.Write(data, index, lenght) 然后...(使用交易)
    • 我这里的主要问题是如何插入一个不可能完全保存在内存中的 blob。
    • 是的,很难在内存中保存 1 TB ...您可以发布一个工作示例吗?
    • 我会尽快让它真正运作良好。感谢您的建议和cmets!
    【解决方案2】:

    是的,像这样设置你的参数:

    var param = cmd.Parameters.Add("blobInParam", OracleDbType.Blob);
    param.Direction = ParameterDirection.Input;   
    
    // Assign Byte Array to Oracle Parameter
    param.Value = blobData;
    

    【讨论】:

    • 而且我在脑海中认为字节必须始终是偶数,对吧? 只是补充,也许值得了解
    • 不能老实说我见过这种限制;但这并不意味着它不存在!
    • 怎么给blob设置二进制流,比如OutputStream outstream = blob.setBinaryStream(1L); ?
    • @AllanElder 这是我的错误,只有CLOBs 需要有偶数字节! BLOBs 不是!
    • 啊.. 有道理,每个字符 2 个字节。
    猜你喜欢
    • 1970-01-01
    • 2017-03-23
    • 1970-01-01
    • 2011-02-01
    • 2020-02-25
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 2019-09-25
    相关资源
    最近更新 更多