當前位置:編程學習大全網 - 編程語言 - 網絡編程高手進入!!!!

網絡編程高手進入!!!!

DataReader的默認行為是,壹旦整個數據行可用,就將傳入的數據作為行加載。但是,二進制大型對象(BLOB)需要區別對待,因為它們可能包含數十億字節的數據,但壹行數據不可能包含這麽多數據。命令。ExecuteReader方法有壹個重載,該重載將使用CommandBehavior參數修改DataReader的默認行為。您可以通過傳遞commandbehavior來修改DataReader的默認行為。對ExecuteReader方法的sequentialaccess,以便DataReader可以在按順序收到數據後立即加載數據,而不是加載數據行。這是加載BLOB或其他大數據結構的理想解決方案。請註意,這種行為可能因數據源而異。例如,從Microsoft Access返回壹個BLOB將導致整個BLOB被加載到內存中,而不是按照接收數據的順序加載數據。

當設置DataReader使用SequentialAccess時,壹定要註意訪問返回字段的順序。DataReader的默認行為是在整行可用時立即加載整行,這使您能夠在讀取下壹行之前以任意順序訪問返回的字段。但是,使用SequentialAccess時,必須按順序訪問DataReader返回的不同字段。例如,如果查詢返回三列,而第三列是壹個BLOB,則在訪問第三個字段中的BLOB數據之前,必須返回第壹個和第二個字段的值。如果在訪問第壹個或第二個字段之前訪問第三個字段,則第壹個和第二個字段的值將不再可用。這是因為SequentialAccess修改了DataReader以按順序返回數據,當DataReader讀取的數據超過特定數據時,數據將不可用。

當訪問BLOB字段中的數據時,使用DataReader的GetBytes或GetChars類型的訪問器,這將用數據填充數組。您也可以使用GetString獲取字符數據,但是為了節省系統資源,您可能不希望將整個BLOB值加載到壹個字符串變量中。您可以指定要返回的特定數據緩沖區大小,以及從返回的數據中讀取的第壹個字節或字符的起始位置。GetBytes和GetChars將返回壹個long值,該值表示返回的字節數或字符數。如果將空數組傳遞給GetBytes或GetChars,則返回的長整型值將是BLOB中的字符總數。您可以選擇在數組中指定壹個索引作為讀取數據的起始位置。

以下示例從Microsoft SQL Server中的pubs示例數據庫返回出版商ID和徽標。發布者ID (pub_id)是壹個字符字段,而徽標是壹個圖形,即壹個BLOB。因為徽標字段是位圖,所以此示例使用GetBytes返回二進制數據。請註意,由於必須按順序訪問字段,因此在訪問徽標之前,將訪問當前數據行的發布者ID。

[Visual Basic]

dim pubs conn As SqlConnection = New SqlConnection(" Data Source = localhost;綜合安全= SSPI;初始目錄=酒館;”)

dim logo cmd As SqlCommand = New SqlCommand(" SELECT pub _ id,logo FROM pub_info ",pubsConn)

“Dim fs As FileStream”將BLOB寫入文件(*。bmp)。

Dim bw As BinaryWriter '將二進制數據流式傳輸到FileStream對象。

dim buffer size As Integer = 100 ' BLOB緩沖區的大小。

dim out Byte(buffer size-1)As Byte '要由GetBytes填充的BLOB byte()緩沖區。

Dim retval As Long '從GetBytes返回的字節。

dim startIndex As Long = 0 ' BLOB輸出中的起始位置。

Dim pub_id As String = " "要在文件名中使用的發布者id。

打開連接並將數據讀入DataReader。

pubsConn。打開()

dim my reader As sqldata reader = logo cmd。ExecuteReader(CommandBehavior。順序訪問)

在我朗讀的時候做。閱讀()

獲取發布者id,它必須在獲取徽標之前出現。

pub_id = myReader。GetString(0)

創建壹個文件來保存輸出。

fs =新文件流。發布標識& amp".bmp ",文件模式。OpenOrCreate,FileAccess。寫)

bw =新二進制編寫器(fs)

重置新BLOB的起始字節。

startIndex = 0

將字節讀入outbyte()並保留返回的字節數。

retval = myReader。GetBytes(1,startIndex,outbyte,0,bufferSize)

當有超過緩沖區大小的字節時,繼續讀寫。

Do While retval = bufferSize

bw。寫入(輸出字節)

bw。齊平()

將起始索引重新定位到最後壹個緩沖區的末尾,並填充該緩沖區。

startIndex += bufferSize

retval = myReader。GetBytes(1,startIndex,outbyte,0,bufferSize)

寫入剩余的緩沖區。

bw。Write(outbyte,0,retval - 1)

bw。齊平()

關閉輸出文件。

bw。關閉()

fs。關閉()

關閉閱讀器和連接。

我的讀者。關閉()

pubsConn。關閉()

[C#]

SqlConnection pubsConn = new SqlConnection(" Data Source = localhost;綜合安全= SSPI;初始目錄=酒館;”);

SqlCommand logo cmd = new SqlCommand(" SELECT pub _ id,logo FROM pub_info ",pubs conn);

FileStream fs//將BLOB寫入文件(*。bmp)。

BinaryWriter bw//將BLOB流式傳輸到FileStream對象。

int buffer size = 100;BLOB緩沖區的大小。

byte[]outbyte = new byte[buffer size];//要由GetBytes填充的BLOB byte[]緩沖區。

長retval//從GetBytes返回的字節。

long startIndex = 0;BLOB輸出中的開始位置。

string pub _ id =//要在文件名中使用的發布者id。

//打開連接並將數據讀入DataReader。

pubsConn。open();

SqlDataReader myReader = logoCMD。ExecuteReader(CommandBehavior。sequential access);

而(myReader。Read())

{

//獲取發布者id,該id必須在獲取徽標之前出現。

pub_id = myReader。GetString(0);

//創建壹個文件來保存輸出。

fs = new FileStream(" logo "+pub _ id+")。bmp ",文件模式。OpenOrCreate,FileAccess。寫);

bw = new binary writer(fs);

//重置新BLOB的起始字節。

startIndex = 0;

//將字節讀入outbyte[]並保留返回的字節數。

retval = myReader。GetBytes(1,startIndex,outbyte,0,buffer size);

//當有超出緩沖區大小的字節時,繼續讀寫。

while (retval == bufferSize)

{

bw。寫(outbyte);

bw。flush();

//將起始索引重新定位到最後壹個緩沖區的末尾,並填充該緩沖區。

startIndex+= buffer size;

retval = myReader。GetBytes(1,startIndex,outbyte,0,buffer size);

}

//寫入剩余的緩沖區。

bw。Write(outbyte,0,(int)retval-1);

bw。flush();

//關閉輸出文件。

bw。close();

fs。close();

}

//關閉讀取器和連接。

我的讀者。close();

pubsConn。close();

  • 上一篇:少兒編程可以不學玄學編程嗎?
  • 下一篇:描寫櫻花的作文
  • copyright 2024編程學習大全網