Re: streaming binary data from sql 2005
- From: stcheng@xxxxxxxxxxxxxxxxxxxx (Steven Cheng[MSFT])
- Date: Fri, 25 Nov 2005 02:38:14 GMT
Thanks for your response Param,
Regarding on developing IIS components through managed code in .net 2.0,
seems there hasn't detailed public reference. I'll contact some other IIS
experts to see whether they have any information on this. Also, for
developing raw ISAPI extension or filters, here're some reference:
#Taking the SplashDiving into ISAPI Programming
http://www.microsoft.com/mind/0197/isapi.asp
#ISAPI Extensions: Creating a DLL to Enable HTTP-based File Uploads with IIS
http://msdn.microsoft.com/msdnmag/issues/01/10/Upload/default.aspx
Steven Cheng
Microsoft Online Support
Get Secure! www.microsoft.com/security
(This posting is provided "AS IS", with no warranties, and confers no
rights.)
--------------------
| From: <param@xxxxxxxxxxxxxxxx>
| References: <unE2osD8FHA.3416@xxxxxxxxxxxxxxxxxxxx>
<elPATQF8FHA.2192@xxxxxxxxxxxxxxxxxxxx>
<OvBSy1J8FHA.808@xxxxxxxxxxxxxxxxxxxx>
<06TH7xN8FHA.3380@xxxxxxxxxxxxxxxxxxxxx>
| Subject: Re: streaming binary data from sql 2005
| Date: Thu, 24 Nov 2005 08:24:43 -0600
| Lines: 238
| X-Priority: 3
| X-MSMail-Priority: Normal
| X-Newsreader: Microsoft Outlook Express 6.00.2900.2527
| X-RFC2646: Format=Flowed; Original
| X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2527
| Message-ID: <O3nORLQ8FHA.3760@xxxxxxxxxxxxxxxxxxxx>
| Newsgroups: microsoft.public.dotnet.framework.aspnet
| NNTP-Posting-Host: corp2.lazardgroup.com 70.182.148.88
| Path: TK2MSFTNGXA02.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP14.phx.gbl
| Xref: TK2MSFTNGXA02.phx.gbl
microsoft.public.dotnet.framework.aspnet:360730
| X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet
|
| Steve, do you have some links to some samples on how to develop an isapi
| filter in .net 2.0? I have never attempted that before and dont know
where
| to begin. We are working on a large app where pdf files have to be
securely
| stored in a sql database & streamed down to users in their browser. We
are
| expecting upto 10,000+ simultaneous users at any given time.
|
| TIA!
|
| "Steven Cheng[MSFT]" <stcheng@xxxxxxxxxxxxxxxxxxxx> wrote in message
| news:06TH7xN8FHA.3380@xxxxxxxxxxxxxxxxxxxxxxxx
| > Hi Param,
| >
| > I think the Buffering Bruce mentioned means the OutputBuffer setting for
| > asp.net web page. We can set it in the @Page directive like:
| >
| > <%@Page ..... Buffer="true". .... %>
| >
| > or in code through:
| >
| > Page_load(...)
| > {
| > Response.BufferOutput = true;
| > }
| >
| > The default should be ture. Setting Buffer can help us buffer the
response
| > data at serversdie so as to flush them once all the data is complete.
| > However, this will cause the server memory be comsumed seriously when
lots
| > of request executing for large data downloading.....
| >
| > Also, I think it'll be better to implement file download in raw IIS
isapi
| > filter or extension and seems .NET 2.0 support developing IIS isapi
| > components through managed code..
| >
| > Thanks,
| >
| > Steven Cheng
| > Microsoft Online Support
| >
| > Get Secure! www.microsoft.com/security
| > (This posting is provided "AS IS", with no warranties, and confers no
| > rights.)
| >
| >
| >
| > --------------------
| > | From: <param@xxxxxxxxxxxxxxxx>
| > | References: <unE2osD8FHA.3416@xxxxxxxxxxxxxxxxxxxx>
| > <elPATQF8FHA.2192@xxxxxxxxxxxxxxxxxxxx>
| > | Subject: Re: streaming binary data from sql 2005
| > | Date: Wed, 23 Nov 2005 20:19:04 -0600
| > | Lines: 156
| > | X-Priority: 3
| > | X-MSMail-Priority: Normal
| > | X-Newsreader: Microsoft Outlook Express 6.00.2900.2527
| > | X-RFC2646: Format=Flowed; Response
| > | X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2527
| > | Message-ID: <OvBSy1J8FHA.808@xxxxxxxxxxxxxxxxxxxx>
| > | Newsgroups: microsoft.public.dotnet.framework.aspnet
| > | NNTP-Posting-Host: corp2.lazardgroup.com 70.182.148.88
| > | Path: TK2MSFTNGXA02.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP09.phx.gbl
| > | Xref: TK2MSFTNGXA02.phx.gbl
| > microsoft.public.dotnet.framework.aspnet:360609
| > | X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet
| > |
| > | Hi, could you please shed some light on "buffering the download" ?
Here
| > is
| > | my code right now. I call the dbchunks2stream method which essentially
| > | chunks the data to response.outputstream
| > |
| > | Public Sub WriteChunks2DB(tablename as string, columnname as string,
| > | pkcolumnname as string, pkcolumnval as string, s as stream)
| > | Dim BUFFER_LENGTH As Integer = 131072 ' chunk size
| > |
| > | ' Make sure that Photo is non-NULL and return TEXTPTR to it.
| > | Dim sqlstr as string = "SET NOCOUNT ON;UPDATE " + tablename + "
SET
| > "
| > +
| > | columnname + " = 0x0 WHERE " + pkcolumnname + "= '" +
| > | replacequotes(pkcolumnval) + "';SELECT @Pointer=TEXTPTR(" +
columnname +
| > ")
| > | FROM " + tablename + " WHERE " + pkcolumnname + " = '" +
| > | replacequotes(pkcolumnval) + "'"
| > | Dim cmdGetPointer As New SqlCommand(sqlstr, objConnect)
| > | Dim PointerOutParam As SqlParameter =
| > | cmdGetPointer.Parameters.Add("@Pointer", SqlDbType.VarBinary, 100)
| > | PointerOutParam.Direction = ParameterDirection.Output
| > | if objConnect.state = ConnectionState.Closed Then objConnect.Open
| > |
| > | cmdGetPointer.ExecuteNonQuery()
| > |
| > | ' Set up UPDATETEXT command, parameters, and open BinaryReader.
| > | sqlstr = "UPDATETEXT " + tablename + "." + columnname + " @Pointer
| > | @Offset @Delete WITH LOG @Bytes"
| > | Dim cmdUploadBinary As New SqlCommand(sqlstr, objConnect)
| > | Dim PointerParam As SqlParameter =
| > | cmdUploadBinary.Parameters.Add("@Pointer", SqlDbType.Binary, 16)
| > | Dim OffsetParam As SqlParameter =
| > | cmdUploadBinary.Parameters.Add("@Offset", SqlDbType.Int)
| > | Dim DeleteParam As SqlParameter =
| > | cmdUploadBinary.Parameters.Add("@Delete", SqlDbType.Int)
| > | DeleteParam.Value = 1 ' delete 0x0 character
| > | Dim BytesParam As SqlParameter =
| > | cmdUploadBinary.Parameters.Add("@Bytes", SqlDbType.Binary,
| > BUFFER_LENGTH)
| > | Dim br As New BinaryReader(s)
| > | Dim Offset As Integer = 0
| > | OffsetParam.Value = Offset
| > |
| > | ' Read buffer full of data and execute the UPDATETEXT statement.
| > | Dim Buffer() As Byte = br.ReadBytes(BUFFER_LENGTH)
| > | Do While Buffer.Length > 0
| > | PointerParam.Value = PointerOutParam.Value
| > | BytesParam.Value = Buffer
| > | cmdUploadBinary.ExecuteNonQuery()
| > | DeleteParam.Value = 0 ' don't delete any other data
| > | Offset += Buffer.Length
| > | OffsetParam.Value = Offset
| > | Buffer = br.ReadBytes(BUFFER_LENGTH)
| > | Loop
| > |
| > | br.Close()
| > | s.Close()
| > | objConnect.Close()
| > |
| > | End Sub
| > |
| > | Public Sub DBChunks2Stream(tablename as string, columnname as string,
| > | pkcolumnname as string, pkcolumnval as string, byref s as stream)
| > | Dim ImageCol As Integer = 0 ' position of image column in
DataReader
| > | Dim BUFFER_LENGTH As Integer = 131072 ' chunk size
| > |
| > | ' Make sure that Photo is non-NULL and return TEXTPTR to it.
| > | Dim sqlstr as string = "SELECT @Pointer=TEXTPTR(" + columnname +
"),
| > | @Length=DataLength(" + columnname + ") FROM " + tablename + " WHERE "
+
| > | pkcolumnname + " = '" + pkcolumnval + "'"
| > | Dim cmdGetPointer As New SqlCommand(sqlstr, objConnect)
| > | Dim PointerOutParam As SqlParameter =
| > | cmdGetPointer.Parameters.Add("@Pointer", SqlDbType.VarBinary, 100)
| > | PointerOutParam.Direction = ParameterDirection.Output
| > | Dim LengthOutParam As SqlParameter =
| > | cmdGetPointer.Parameters.Add("@Length", SqlDbType.Int)
| > | LengthOutParam.Direction = ParameterDirection.Output
| > | if objConnect.state = ConnectionState.Closed Then objConnect.Open
| > | cmdGetPointer.ExecuteNonQuery()
| > | If PointerOutParam.Value Is DBNull.Value Then
| > | objConnect.Close()
| > | ' Add code to deal with NULL BLOB.
| > | Exit Sub
| > | End If
| > |
| > | ' Set up READTEXT command, parameters, and open BinaryReader.
| > | sqlstr = "READTEXT " + tablename + "." + columnname + " @Pointer
| > @Offset
| > | @Size HOLDLOCK"
| > | Dim cmdReadBinary As New SqlCommand(sqlstr, objConnect)
| > | Dim PointerParam As SqlParameter =
| > | cmdReadBinary.Parameters.Add("@Pointer", SqlDbType.Binary, 16)
| > | Dim OffsetParam As SqlParameter =
| > | cmdReadBinary.Parameters.Add("@Offset", SqlDbType.Int)
| > | Dim SizeParam As SqlParameter =
| > cmdReadBinary.Parameters.Add("@Size",
| > | SqlDbType.Int)
| > | Dim dr As SqlDataReader
| > | Dim Offset As Integer = 0
| > | OffsetParam.Value = Offset
| > | Dim Buffer(BUFFER_LENGTH - 1) As Byte
| > |
| > | ' Read buffer full of data and write to the file stream.
| > | Do
| > | PointerParam.Value = PointerOutParam.Value
| > | ' Calculate the buffer size - may be less than BUFFER_LENGTH
for
| > the
| > | last block.
| > | If Offset + BUFFER_LENGTH >= Cint(LengthOutParam.Value) Then
| > | SizeParam.Value = Ctype((Cint(LengthOutParam.Value) -
Offset),
| > | Object)
| > | Else
| > | SizeParam.Value = Ctype(BUFFER_LENGTH, Object)
| > | End If
| > | dr = cmdReadBinary.ExecuteReader(CommandBehavior.SingleResult)
| > | dr.Read()
| > | dr.GetBytes(ImageCol, 0, Buffer, 0, Cint(SizeParam.Value))
| > | dr.Close()
| > | s.Write(Buffer, 0, Cint(SizeParam.Value))
| > | Offset += Cint(SizeParam.Value)
| > | OffsetParam.Value = Ctype(Offset, Object)
| > | Loop Until Offset >= Cint(LengthOutParam.Value)
| > |
| > | s.Close()
| > | objConnect.Close()
| > |
| > | End Sub
| > |
| > |
| > |
| > | TIA!
| > |
| > |
| > | "Bruce Barker" <brubar_nospamplease_@xxxxxxxxxx> wrote in message
| > | news:elPATQF8FHA.2192@xxxxxxxxxxxxxxxxxxxxxxx
| > | > the technique is the same. you will gain a performance boost if you
| > switch
| > | > to a varbinary(max) column over image. there are improvements in
| > | > transferring the data.
| > | >
| > | > note: using asp.net for downloads is problematic. asp.net has a
| > limited
| > | > number of request threads and a limited number of connection from
the
| > | > asp.net worker process to .net isapi filter. this means you can not
| > | > support a lot of simultaneous downloads. even though its heavy on
| > | > resources, you might fiond buffering the download is best. this
fress
| > up
| > | > the asp.net worker thread quicker.
| > | >
| > | >
| > | > -- bruce (sqlwork.com)
| > | >
| > | >
| > | > <param@xxxxxxxxxxxxxxxx> wrote in message
| > | > news:unE2osD8FHA.3416@xxxxxxxxxxxxxxxxxxxxxxx
| > | >> Hi all, is there a better way to stream binary data stored in a
table
| > in
| > | >> sql 2005 to a browser in .net 2.0? Or is the code same as in .net
| > 1.1?
| > We
| > | >> noticed that in certain heavy load scenarios, every now and then
the
| > | >> client would timeout and have to re-initiate the request...
| > | >>
| > | >> TIA!
| > | >>
| > | >
| > | >
| > |
| > |
| > |
| >
|
|
|
.
- References:
- streaming binary data from sql 2005
- From: param
- Re: streaming binary data from sql 2005
- From: Bruce Barker
- Re: streaming binary data from sql 2005
- From: param
- Re: streaming binary data from sql 2005
- From: Steven Cheng[MSFT]
- Re: streaming binary data from sql 2005
- From: param
- streaming binary data from sql 2005
- Prev by Date: Re: Application["TotalPlayings"]++ doesn't work
- Next by Date: specifying a query string in an href dynamically
- Previous by thread: Re: streaming binary data from sql 2005
- Next by thread: Calling a webservice via ASP.Net
- Index(es):
Relevant Pages
|