原創|使用教程|編輯:郝浩|2013-05-08 11:04:29.000|閱讀 672 次
概述:dotConnect for Oracle中的LOB是一種數據類型,主要用于存儲大對象。在Oracle中存在三種LOB數據類型分別是BLOB、CLOB和DBCLOB,今天主要來看一下這個BLOB和CLOB類型。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
LOB基本概念:
LOB是一種數據類型,主要用于存儲大對象。在Oracle中存在三種LOB數據類型分別是BLOB:Binary Large Object、CLOB:Character Large Object、DBCLOB:Double-byte Character Large Object,今天主要來看一下這個BLOB和CLOB類型。
BLOB 數據的使用
二進制數據一般都會表現為字節流或是緩沖區。dotConnect for Oracle允許用最方便的方式操縱BLOB數據。你可以使用OracleLob。值屬性或使用OracleLob.Read()和OracleLob.Write()方法來傳輸數據到或是來自服務器,兩種方法下面都有雨示例。值得注意的是當OracleLob.LobType屬性是OracleDbType.Blob時,這個OracleLob.Value被視為字節數組,OracleDbType.Clob以及OracleDbType.NClob將會被一字符串視為OracleLob.Value。
下一個示例程序顯示如何從硬盤上傳文件到服務器以及下載下來。要執行這些程序,你必須創建一個表,如下:
CREATE TABLE PICTURES (
ID NUMBER(12),
PICNAME VARCHAR2(20),
PICTURE BLOB
)
[C#]
static void UploadBlob(OracleConnection myConnection)
{
//Open file on disk
FileStream fs = new FileStream("D:\\Tmp\\test.bmp", FileMode.Open, FileAccess.Read);
BinaryReader r = new BinaryReader(fs);
myConnection.Open();
//Create temporary BLOB
OracleLob myLob = new OracleLob(myConnection,OracleDbType.Blob);
int streamLength = (int)fs.Length;
//Transfer data to server
myLob.Write(r.ReadBytes(streamLength), 0, streamLength);
//Perform INSERT
OracleCommand myCommand = new OracleCommand(
"INSERT INTO Pictures (ID, PicName, Picture) VALUES(1,'pict1',:Pictures)", myConnection);
OracleParameter myParam = myCommand.Parameters.Add("Pictures", OracleDbType.Blob);
myParam.OracleValue = myLob;
try
{
Console.WriteLine(myCommand.ExecuteNonQuery() + " rows affected.");
}
finally
{
myConnection.Close();
r.Close();
fs.Close();
}
}
static void DownloadBlob(OracleConnection myConnection)
{
OracleCommand myCommand = new OracleCommand("SELECT * FROM Pictures", myConnection);
myConnection.Open();
OracleDataReader myReader = myCommand.ExecuteReader(System.Data.CommandBehavior.Default);
try
{
while (myReader.Read())
{
//Obtain OracleLob directly from OracleDataReader
OracleLob myLob = myReader.GetOracleLob(myReader.GetOrdinal("Picture"));
if (!myLob.IsNull)
{
string FN = myReader.GetString(myReader.GetOrdinal("PicName"));
//Create file on disk
FileStream fs = new FileStream("D:\\Tmp\\" + FN + ".bmp", FileMode.Create);
//Use buffer to transfer data
byte[] b = new byte[myLob.Length];
//Read data from database
myLob.Read(b,0,(int)myLob.Length);
//Write data to file
fs.Write(b,0,(int)myLob.Length);
fs.Close();
Console.WriteLine(FN + " downloaded.");
}
}
}
finally
{
myReader.Close();
myConnection.Close();
}
}
[Visual Basic]
Public Sub UploadBlob(ByVal myConnection As OracleConnection)
'Open file on disk
Dim fs As FileStream = New FileStream("D:\Tmp\test.bmp", FileMode.Open, FileAccess.Read)
Dim r As BinaryReader = New BinaryReader(fs)
myConnection.Open()
'Create temporary BLOB
Dim myLob As OracleLob = New OracleLob(myConnection, OracleDbType.Blob)
Dim streamLength As Int32 = fs.Length
'Transfer data to server
myLob.Write(r.ReadBytes(streamLength), 0, streamLength)
'Perform INSERT
Dim myCommand As OracleCommand = New OracleCommand(
"INSERT INTO Pictures (ID, PicName, Picture) VALUES(1,'pict1',:Pictures)", myConnection)
Dim myParam As OracleParameter = myCommand.Parameters.Add("Pictures", OracleDbType.Blob)
myParam.OracleValue = myLob
Try
Console.WriteLine(myCommand.ExecuteNonQuery() & " rows affected.")
Finally
myConnection.Close()
r.Close()
fs.Close()
End Try
End Sub
Public Sub DownloadBlob(ByVal myConnection As OracleConnection)
Dim myCommand As New OracleCommand("SELECT * FROM Pictures", myConnection)
myConnection.Open()
Dim myReader As OracleDataReader = & _
myCommand.ExecuteReader(System.Data.CommandBehavior.Default)
Try
While myReader.Read()
Dim myLob As OracleLob = myReader.GetOracleLob(myReader.GetOrdinal("Picture"))
If Not myLob.IsNull Then
Dim FN As String = myReader.GetString(myReader.GetOrdinal("PicName"))
Dim fs As FileStream = New FileStream("D:\Tmp\" + FN + ".bmp", FileMode.Create)
Dim w As BinaryWriter = New BinaryWriter(fs)
w.Write(myLob.Value)
w.Close()
fs.Close()
Console.WriteLine(String.Concat(FN, " downloaded."))
End If
End While
Finally
myReader.Close()
myConnection.Close()
End Try
End Sub
CLOB 數據使用
CLOB 數據的使用和BLOB數據是一樣的,區別就在于Value屬性的表現。當從OracleLob.Value讀取時,CLOB和NCLO數據類型,會得到字符串。數據是透明的解碼,所以你不必擔心字符集。如果需要原始數據,可以使用 OracleLob的里流媒體功能,那是OracleLob.Read 和OracleLob.Write的方法。請注意,由于OracleLob.Value是一個只讀屬性,你可以只用OracleLob.Write方法將數據寫入到的LOB中,但是并沒有執行編碼。
For example consider this table definition.
CREATE TABLE ClobTable (
Id NUMBER,
Name VARCHAR2(30),
Value CLOB
)
如果您需要執行簡單的任務,如獲取記錄集,在大多數情況下,你不需要知道oraclelob。當在fetch 上調用OracleDataReader.GetValue時,將會得到一組字節用于BLOB列以及用于CLOB one的字符串。此外你可以使用OracleDataReader.GetChars、 OracleDataReader.GetBytes得到LOB值塊。示例如下:
[C#]
...
OracleCommand oraCommand = new OracleCommand("SELECT * FROM ClobTable", oraConnection);
OracleDataReader reader = oraCommand.ExecuteReader();
while (reader.Read())
Console.WriteLine(reader.GetValue(2));
...
[Visual Basic]
...
Dim oraCommand As OracleCommand = new OracleCommand( _
"SELECT * FROM ClobTable", oraConnection)
Dim reader As OracleDataReader = oraCommand.ExecuteReader()
while (reader.Read())
Console.WriteLine(reader.GetValue(2))
end while
...
使用OracleLob對象也可以達到一樣的效果:
[C#]
...
OracleCommand oraCommand = new OracleCommand("SELECT * FROM ClobTable", oraConnection);
OracleDataReader reader = oraCommand.ExecuteReader();
OracleLob clob;
while (reader.Read()) {
clob = reader.GetOracleLob(2);
Console.WriteLine(clob.Value);
}
...
[Visual Basic]
...
Dim oraCommand As OracleCommand = new OracleCommand( _
"SELECT * FROM ClobTable", oraConnection)
Dim reader As OracleDataReader = oraCommand.ExecuteReader()
Dim clob As OracleLob
while (reader.Read())
clob = reader.GetOracleLob(2)
Console.WriteLine(clob.Value)
end while
...
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@ke049m.cn
文章轉載自:慧都控件