Microsoft MVP성태의 닷넷 이야기
How to read BLOB from Dataset into buffer? [링크 복사], [링크+제목 복사],
조회: 11155
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

다음은 microsoft.public.dotnet.framework.adonet 에 올라왔던 질문과 대답입니다.
BLOB 데이터를 읽고 쓰는 것에 대한 내용을 달고 있습니다.

Here is some code that uses a buffer for reading and writing blobs to
SQL Server (only the reading code is in the docs). This was posted by
Doug Rothaus a couple of months ago.

 -- Andy

From: "Doug Rothaus \(MSFT\)" <douglasr@nospam.com>
References: <0ba101c17ed1$329f4d50$a4e62ecf@tkmsftngxa06>
Subject: Re: Image Column Data In SQL Server
Date: Fri, 7 Dec 2001 13:48:01 -0800
Message-ID: <umw0rj2fBHA.848@tkmsftngp03>

Here's some sample code that is included in the release documentation
for the .NET Frameworks in a topic called "Obtaining BLOB Values from
a Database". The code reads bitmaps from the pubs database and writes
them to disk. I did a quick test on an Excel file and no problems
occurred. See if it works for your situation.

As far as writing BLOBs are concerned, there is no topic for the
release docs, but I have some working code that writes to SQL Server
2000 that you can review. I'll include it as well. Again, it's hard
coded to read a bitmap file. I tested it with Excel as well and no
problems occurred.

I gathered from your previous posts that you prefer VB.NET. Let me
know if you want the C# version.

Doug Rothaus
douglasr@microsoft.com
------------------------------------------------------
This posting is provided "AS IS" with no warranties, and confers no
rights.

--- obtaining BLOB values ---

Dim pubsConn As SqlConnection = New SqlConnection("Data
Source=localhost;Integrated Security=SSPI;Initial Catalog=pubs;")
Dim logoCMD As SqlCommand = New SqlCommand("SELECT pub_id, logo FROM
pub_info", pubsConn)

Dim fs As FileStream ' Writes the BLOB to a file
(*.bmp).
Dim bw As BinaryWriter ' Streams the binary data to the
FileStream object.

Dim bufferSize As Integer = 100 ' The size of the BLOB buffer.
Dim outbyte(bufferSize - 1) As Byte ' The BLOB byte() buffer to be
filled by GetBytes.
Dim retval As Long ' The bytes returned from
GetBytes.
Dim startIndex As Long = 0 ' The starting position in the
BLOB output.

Dim pub_id As String = "" ' The publisher id to use in the
file name.

' Open the connection and read data into the DataReader.
pubsConn.Open()
Dim myReader As SqlDataReader =
logoCMD.ExecuteReader(CommandBehavior.SequentialAccess)

Do While myReader.Read()
  ' Get the publisher id, which must occur before getting the logo.
  pub_id = myReader.GetString(0)

  ' Create a file to hold the output.
  fs = New FileStream("logo" & pub_id & ".bmp", FileMode.OpenOrCreate,
FileAccess.Write)
  bw = New BinaryWriter(fs)

  ' Reset the starting byte for a new BLOB.
  startIndex = 0

  ' Read bytes into outbyte() and retain the number of bytes returned.
  retval = myReader.GetBytes(1, startIndex, outbyte, 0, bufferSize)

  ' Continue reading and writing while there are bytes beyond the size
of the buffer.
  Do While retval = bufferSize
    bw.Write(outbyte)
    bw.Flush()

    ' Reposition the start index to the end of the last buffer and
fill the buffer.
    startIndex = startIndex + bufferSize
    retval = myReader.GetBytes(1, startIndex, outbyte, 0, bufferSize)
  Loop

  ' Write the remaining buffer.
  bw.Write(outbyte)
  bw.Flush()

  ' Close the output file.
  bw.Close()
  fs.Close()
Loop

' Close the reader and the connection.
myReader.Close()
pubsConn.Close()

--- end obtaining BLOB values ---

--- writing BLOB values ---

Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.IO

Public Class ChunkImage

    Public Shared Sub Main()
    
        '*
        '* CREATE TABLE Images (
        '* ImageID int IDENTITY (1, 1) NOT NULL ,
        '* Picture image NULL
        '* ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
        '* GO
        '*
        '* ALTER TABLE Images WITH NOCHECK ADD
        '* CONSTRAINT PK_Images PRIMARY KEY CLUSTERED
        '* (
        '* ImageID
        '* ) ON [PRIMARY]
        '* GO
        '*

  ''''''''''''''''''''''''''''''''''''''
  '' Command to insert new image record

  Dim conn As SqlConnection = New SqlConnection("Data
Source=localhost;Integrated Security=SSPI;Initial Catalog=Test;")

  Dim AddImage As SqlCommand = New SqlCommand("INSERT INTO Images
(Picture) Values(0x0);" & _
                                              "SELECT @Identity =
SCOPE_IDENTITY();" & _
                                              "SELECT @Pointer =
TEXTPTR(Picture) FROM Images WHERE ImageID = @Identity", conn)
  Dim pointer As SqlParameter = AddImage.Parameters.Add("@Pointer",
SqlDbType.Binary, 16)
  pointer.Direction = ParameterDirection.Output
  Dim id As SqlParameter = AddImage.Parameters.Add("@Identity",
SqlDbType.Int)
  id.Direction = ParameterDirection.Output



  ''''''''''''''''''''''''''''''''''''''
  '' Command to append image data

  Dim bufferLen As Integer = 128

  Dim AppendToImage As SqlCommand = New SqlCommand("UPDATETEXT
Images.Picture @Pointer @Offset 0 @Bytes", conn)
  Dim ptr As SqlParameter = AppendToImage.Parameters.Add("@Pointer",
SqlDbType.Binary, 16)
  Dim img_data As SqlParameter =
AppendToImage.Parameters.Add("@Bytes", SqlDbType.Binary, bufferLen)
  Dim offset As SqlParameter = AppendToImage.Parameters.Add("@Offset",
SqlDbType.Int)
  offset.Value = 0


  '''''''''''''''''''''''''''''''''''''
  '' Add Image record and retrieve image idenity and pointer

  conn.Open()
  AddImage.ExecuteNonQuery()

  Console.WriteLine("Image added. ImageID = " & id.Value)

  ptr.Value = pointer.Value 'image pointer


  ''''''''''''''''''''''''''''''''''''
  '' Read image in and write to database 128 bytes at a time

  Dim fileName As string = "logoimage.bmp"

  Dim fs As FileStream = New FileStream(fileName, FileMode.Open,
FileAccess.Read)
  Dim br As BinaryReader = New BinaryReader(fs)

  Dim buffer() As Byte = br.ReadBytes(bufferLen)
  Dim offset_ctr As Integer = 0

  Do While buffer.Length > 0
   img_data.Value = buffer
   AppendToImage.ExecuteNonQuery()
   offset_ctr += bufferLen
   offset.Value = offset_ctr
   buffer = br.ReadBytes(bufferLen)
  Loop

  conn.Close()

  br.Close()
  fs.Close()
    End Sub
End Class

--- end writing BLOB values ---








[최초 등록일: ]
[최종 수정일: 6/30/2004]


비밀번호

댓글 작성자
 




... 31  32  33  34  35  36  37  38  39  40  41  [42]  43  44  45  ...
NoWriterDateCnt.TitleFile(s)
134정성태11/15/200511185Microsoft SQL Server Management Studio Express - Community Technical Preview (CTP) November 2005 [1]
242정성태4/19/200611566    답변글 정식 릴리스 - Microsoft SQL Server Management Studio Express
243정성태4/19/200610837    답변글 Microsoft SQL Server 2005 Express Edition Toolkit
245정성태4/19/200611378    답변글 Microsoft SQL Server 2005 Express Edition Service Pack 1
133정성태10/30/200511362VS.NET TS 버전을 제외하고 전부 나왔습니다. ^^
132정성태10/28/200511672IE Script 에서 ADO.Stream 개체를 사용 허가 유무를 지정.
131정성태10/27/200511078ASP.NET Spiced: AJAX
130정성태10/26/200512626RSA In JavaScript [1]파일 다운로드1
128정성태10/25/200511233Connecting to MS SQL Server from Unix파일 다운로드1
129정성태10/25/200511053    답변글 [추가]: SQL Server 2005 JDBC Driver Beta 2 Now Available
173정성태1/20/200610884        답변글 정식 릴리스: Microsoft SQL Server 2005 JDBC Driver
127정성태10/21/20051130364-bit Windows ; 언제, 그리고 왜 써야 할까?
126정성태10/19/200511750WSE(Web Services Enhancements) 3.0의 새로운 기능
125정성태10/14/200511719Cluster 가능한 StateServer 세션 관리자
124정성태10/14/200511826MapPoint Web Service SDK Version 4.0 for Visual Studio .NET 2003
123정성태10/14/200511493alpha release of the Python programming language for the .NET platform
161정성태1/3/200611478    답변글 [추가]: Beta release
184정성태8/12/200612034    답변글 Beta3 까지. ^^
190정성태3/10/200611376    답변글 Beta 4
221정성태3/31/200611575    답변글 Beta 5
246정성태4/21/200611504    답변글 Beta 6
295정성태5/24/200610541    답변글 Beta 7
122정성태10/13/200511317Determine whether service packs are installed on the .NET Framework
121정성태10/12/200510890.NET Reference Guide - 웹
120정성태11/14/200511449VS.NET Automation 과 VSIP
119정성태10/9/200510964Internet Information Services (IIS) 6.0 Resource Kit Tools (English)
... 31  32  33  34  35  36  37  38  39  40  41  [42]  43  44  45  ...