【发布时间】:2014-11-26 12:06:42
【问题描述】:
Oracle 的documentation 有一个关于如何在Java 中插入大型BLOB 的示例。是否可以在 C# 中做同样的事情?
【问题讨论】:
Oracle 的documentation 有一个关于如何在Java 中插入大型BLOB 的示例。是否可以在 C# 中做同样的事情?
【问题讨论】:
流式回答:
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 Timeout和Connection Lifetime,因为通过网络传输这么大的文件需要很长时间(我猜,我不知道您的设置)。
【讨论】:
FOR UPDATE 从数据库中读取 BLOB 列,然后使用阅读器获取 OracleBlob,例如:OracleBlob BLOB1 = reader.GetOracleBlob(int_blob_columnnumber); 并使用BLOB1.Write(data, index, lenght) 然后...(使用交易)
是的,像这样设置你的参数:
var param = cmd.Parameters.Add("blobInParam", OracleDbType.Blob);
param.Direction = ParameterDirection.Input;
// Assign Byte Array to Oracle Parameter
param.Value = blobData;
【讨论】:
CLOBs 需要有偶数字节! BLOBs 不是!