大对象 BFILE¶
神通的 BFILE 数据类型是一种 LOB 数据类型,包含对最大2GB的二进制数据的引用.神通的 BFILE 不同于其他 LOB 数据类型的主要特征在于它的数据存储是在数据库服务器所在机器的操作系统的物理文件中,而不是数据库服务器中.BFILE 数据类型应该用于引用尺寸较大的 LOB,因此要将该数据类型存储在数据库中非常不切实际.另外与使用 LOB. 数据类型相比,使用 BFILE 数据类型会有更多的客户端、服务器的通信开销. 如果只是获取整个对象的少量数据,则以 BFILE 方式访问会更加有效. 否则如需获取整个对象,则以访问驻留在数据库中的 LOB 更为有效.
操作方法¶
神通的BFILE类型在程序中被称为
OscarBFile.每个非空
OscarBFile 对象都与两个定义物理文件位置的实体关联:一个DIRECTORY对象, 它是文件系统中一个目录的数据库别名.
基础物理文件的文件名,位于DIRECTORY所指定的目录中.
创建了 BFILE 之后, 就可以使用 ExecuteReader 或 ExecuteScalar
方法, 通过调用 GetOscarBFile 方法获取 OscarBFile 对象,
并检索对应的引用定位器.
任何使用Read或Seek方法访问已经关闭的OscarBFile的操作都会自动重新打开一个OscarBFile流.
注意: 由于 BFILE 类型是只读的, 因此不支持 WRITE 方法,包括从System.IO.Stream继承的BeginWrite,EndWrite和WriteByte方法.
操作示例¶
OscarCommand command = connection.CreateCommand();
command.CommandText = "CREATE OR REPLACE DIRECTORY TestDir AS 'c:\\\\bfiles'";
command.ExecuteNonQuery();
command.CommandText = "CREATE TABLE TestTable(col1 number, col2 BFILE)";
command.ExecuteNonQuery();
command.CommandText = "INSERT INTO TestTable VALUES ('2', BFILENAME('TESTDIR', 'File.jpg'))";
command.ExecuteNonQuery();
command.CommandText = "SELECT * FROM TestTable";
byte[] buffer = new byte[100];
using (OscarDataReader dataReader = command.ExecuteReader())
{
if (dataReader.Read())
{
using (OscarBFile BFile = dataReader.GetOscarBFile(1))
{
BFile.Seek(0, SeekOrigin.Begin);
BFile.Read(buffer, 0, 100);
}
}
}
引用