Доступ к методам данных файлового потока (T-SQL и управляемый API) - PullRequest
1 голос
/ 30 декабря 2011

У меня есть база данных с поддержкой File-Stream. Я создал таблицу со столбцом, который имеет атрибут «file-stream» и может успешно записать строку в таблицу. Итак, у меня есть изображение, хранящееся в моем «Файловом потоке» как BLOB.

В чем моя проблема?

Я должен получить это изображение и показать его в веб-браузере, используя классический asp (я совершенно новичок на этом языке сервера, и мне не разрешено использовать asp.net). Я много искал и читал (есть много информации о том, как сделать это с asp.net, и почти ничего не показывает, как это сделать с классическим asp) и нашел статью (http://www.simple -talk.com / sql / learn -sql-server / введение-в-sql-server-filestream / ), показывающий способы чтения данных:

«Доступ к данным FILESTREAM с помощью TSQL» и «Доступ к данным FILESTREAM с помощью управляемого API»

Первый, который я смог понять и использовать. Второй (есть пример с кодом vb.net) у меня не получилось.

Это код:

‘Create a connection to the database

Dim ConStr As String

ConStr = "Data Source=JACOBXPS\katmaifs;Initial Catalog=NorthPole" & _

     ";Integrated Security=True"

Dim con As New SqlConnection(ConStr)

con.Open()



'Retrieve the FilePath() of the image file

Dim sqlCommand As New SqlCommand()

sqlCommand.Connection = con

sqlCommand.CommandText = "SELECT ItemImage.PathName() AS PathName " + _

                     "FROM items WHERE ItemNumber = 'MS1001'"

Dim filePath As String = sqlCommand.ExecuteScalar()



'Obtain a Transaction Context

Dim transaction As SqlTransaction = con.BeginTransaction("ItemTran")

sqlCommand.Transaction = transaction

sqlCommand.CommandText = "SELECT GET_FILESTREAM_TRANSACTION_CONTEXT()"

Dim txContext As Byte() = sqlCommand.ExecuteScalar()



' Open and read file using SqlFileStream Class

Dim sqlFileStream As New SqlFileStream(filePath, txContext, FileAccess.Read)

Dim buffer As Byte() = New Byte(sqlFileStream.Length) {}

sqlFileStream.Read(buffer, 0, buffer.Length)



'Bind the image data to an image control

Dim ms As MemoryStream = New MemoryStream(buffer)

Dim bmp As Bitmap = New Bitmap(ms)

ItemImage.Image = bmp



'Cleanup

sqlFileStream.Close()

sqlCommand.Transaction.Commit()

con.Close()

Мне не удалось преобразовать это в классического осина, но в той же статье я прочитал нечто более разочаровывающее:

При доступе к данным FILESTREAM с использованием TSQL SQL Server считывает содержимое файла данных> FILESTREAM и передает его клиенту. Память SQL Server используется для чтения> содержимого файла данных. Доступ к данным FILESTREAM с использованием потоковой передачи Win32 не использует память SQL Server. Кроме того, это позволяет приложению использовать> возможности потоковой передачи файловой системы NT.

Так в чем же моя настоящая проблема?

Может ли код vb.net преобразовываться и использоваться в классическом asp? И если это возможно, значит ли это, что когда я использую "file-stream", включаю фьючерсы и хочу отображать данные в Интернете, это будет медленнее, чем использование настольного приложения?

Я в замешательстве и буду благодарен за любой ответ или ссылку на статью для чтения.

1 Ответ

2 голосов
/ 30 декабря 2011

Немного запутался в вопросе, но если все, что вы пытаетесь сделать, это отобразить некоторые данные BLOB из базы данных в виде изображения на веб-странице, то у вас должна быть страница "image.asp", которая выглядит примерно так ....

SQL = "SELECT FILE_NAME,IMAGE_FILE FROM tblImages WHERE ID = " & request("id")
Set rs =db.Execute( SQL )
if not(rs.eof) then

    Response.ContentType = "application/octet-stream"
    Response.AddHeader "Content-Disposition", "attachment;filename=" & rs("FILE_NAME")
    Response.BinaryWrite rs("IMAGE_FILE")
else
    response.Write("No such record found in the database at row " & request("id"))
end if
...