Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将大BLOB插入Oracle数据库_C#_Oracle_Blob - Fatal编程技术网

C# 将大BLOB插入Oracle数据库

C# 将大BLOB插入Oracle数据库,c#,oracle,blob,C#,Oracle,Blob,Oracle有一个关于如何在Java中插入大blob的示例。是否可以在C#中执行相同的操作?是的,将参数设置为: var param = cmd.Parameters.Add("blobInParam", OracleDbType.Blob); param.Direction = ParameterDirection.Input; // Assign Byte Array to Oracle Parameter param.Value = blobData; 一个带有流的答案: str

Oracle有一个关于如何在Java中插入大blob的示例。是否可以在C#中执行相同的操作?

是的,将参数设置为:

var param = cmd.Parameters.Add("blobInParam", OracleDbType.Blob);
param.Direction = ParameterDirection.Input;   

// Assign Byte Array to Oracle Parameter
param.Value = blobData;

一个带有流的答案:

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;)

老实说,我不知道,我不能用这么大的文件在这里尝试。但是,
BLOB
s具有:
最大大小:(4 GB-1)*DB_BLOCK_大小初始化参数(8 TB到128 TB)
。所以从数据库的角度来看,它应该是可行的。
但是,您可能需要注意连接超时和连接寿命,因为通过网络传输如此大的文件需要很长时间(我想,我不知道您的设置)。

而且我脑子里想,字节必须始终是偶数,对吗?。只是补充一下,也许值得一提的是,我不能诚实地说我见过这种局限性;但这并不意味着它不在那里!如何将二进制流设置为blob,例如OutputStream outstream=blob.setBinaryStream(1L)@AllanElder这是我的一个错误,只有
CLOB
s需要偶数个字节<代码>水滴s不!啊。。这很有意义,每个字符有2个字节。事实上我想我找到了我要找的-你需要创建一个OracleBlob,将你的大内容流式传输到它(Oracle将把它流式传输到db),然后将OracleBlob作为参数分配给连接,在这一点上它会被实际写入tableMhm好的,听起来不错。确定上述方法也不起作用吗?我通常也会这样做,使用阅读器,在查询结束时使用
从数据库中读取BLOB列进行更新,然后使用阅读器获取OracleBlob,如:
oracleblob1=reader.GetOracleBlob(int\u BLOB\u columnnumber)并使用
BLOB1。写入(数据、索引、长度)
然后。。。(使用事务)我这里的主要问题是如何插入不可能完全保存在内存中的blob。是的,很难在内存中保存1 TB。。。那么你可以发布一个有效的例子吗?我会尽快让它真正发挥作用。感谢您的建议和评论!