Gravar arquivos em banco de dados SQL Server
Olá pessoal,
Estou tentando gravar arquivos em banco de dados mas, ao fazer o download, até baixa, mas quando tento abrir dá erro. Se for um arquivo texto, o arquivo fica vazio, se for imagem não abre, se for zip dá erro ao descompactar, enfim, não está guardando o arquivo corretamente. Disponibilizo aqui todo o código.
O banco é SQL Server 2008 R2 e o tipo de campo para guardar os arquivos é um varbinary(MAX).
Objeto:
Imports System.Data.SqlClient
Namespace MDI
Public Class objProdutosImagem
Private Db As classDatabase.DbSql
Private Cm As SqlCommand
Private Fn As New Funcoes.classFuncao
' Declaracao das variaveis
Private vlCodigo As Integer
Private vlProduto As Integer
Private vlTitulo As String
Private vlNome As String
Private vlImagem As Byte()
Private vlTipo As String
Private vlTamanho As Integer
Private vlComentario As String
Property Codigo()
Get
Return vlCodigo
End Get
Set(ByVal Value)
vlCodigo = Value
End Set
End Property
Property Produto()
Get
Return vlProduto
End Get
Set(ByVal Value)
vlProduto = Value
End Set
End Property
Property Titulo()
Get
Return vlTitulo
End Get
Set(ByVal Value)
vlTitulo = Value
End Set
End Property
Property Nome()
Get
Return vlNome
End Get
Set(ByVal Value)
vlNome = Value
End Set
End Property
Property Imagem()
Get
Return vlImagem
End Get
Set(ByVal Value)
vlImagem = Value
End Set
End Property
Property Tipo()
Get
Return vlTipo
End Get
Set(ByVal Value)
vlTipo = Value
End Set
End Property
Property Tamanho()
Get
Return vlTamanho
End Get
Set(ByVal Value)
vlTamanho = Value
End Set
End Property
Property Comentario()
Get
Return vlComentario
End Get
Set(ByVal Value)
vlComentario = Value
End Set
End Property
' Declaracao dos procedimentos
Public Function Inserir()
Try
Cm = New SqlCommand
' Gera o código
Db = New classDatabase.DbSql
Db.NomeTabela = "C003_PRODUTOSIMAGEM"
vlCodigo = Db.Chave("PImagem_ID")
Db = Nothing
With Cm.Parameters
.AddWithValue("@PImagem_ID", vlCodigo)
.AddWithValue("@Produto_ID", vlProduto)
.AddWithValue("@PImagem_Titulo", Trim(vlTitulo))
.AddWithValue("@PImagem_Nome", Trim(vlNome))
.AddWithValue("@PImagem_Imagem", vlImagem)
.AddWithValue("@PImagem_Tipo", Trim(vlTipo))
.AddWithValue("@PImagem_Tamanho", vlTamanho)
If Trim(vlComentario) <> "" Then .AddWithValue("@PImagem_Comentario", Trim(vlComentario)) Else .AddWithValue("@PImagem_Comentario", DBNull.Value)
End With
If Busca(" Produto_ID = " & vlProduto & " AND PImagem_Nome = '" & Trim(vlNome) & "' ") Then
Return "Registro já cadastrado!"
Else
' Cria uma instância do objeto de conexao com o banco de dados
' e preenche os dados necessarios para realizar as operacoes
Db = New classDatabase.DbSql
Db.NomeTabela = "C003_PRODUTOSIMAGEM"
Return Db.Salvar(Cm)
End If
Catch ex As Exception
Return "Ocorreu um erro ao tentar incluir um novo registro: " & ex.Message
Finally
Cm = Nothing
Db = Nothing
End Try
End Function
Public Function Alterar() As String
Try
Cm = New SqlCommand
With Cm.Parameters
.AddWithValue("@Produto_ID", vlProduto)
.AddWithValue("@PImagem_Titulo", Trim(vlTitulo))
.AddWithValue("@PImagem_Nome", Trim(vlNome))
.AddWithValue("@PImagem_Imagem", vlImagem)
.AddWithValue("@PImagem_Tipo", Trim(vlTipo))
.AddWithValue("@PImagem_Tamanho", vlTamanho)
If Trim(vlComentario) <> "" Then .AddWithValue("@PImagem_Comentario", Trim(vlComentario)) Else .AddWithValue("@PImagem_Comentario", DBNull.Value)
End With
If Busca(" PImagem_ID <> " & vlCodigo & " AND Produto_ID = " & vlProduto & " AND PImagem_Nome = '" & Trim(vlNome) & "' ") Then
Return "Registro já cadastrado!"
Else
' Cria uma instância do objeto de conexao com o banco de dados
' e preenche os dados necessarios para realizar as operacoes
Db = New classDatabase.DbSql
Db.NomeTabela = "C003_PRODUTOSIMAGEM"
Return Db.Salvar(Cm, "PImagem_ID", vlCodigo)
End If
Catch ex As Exception
Return "Ocorreu um erro ao tentar alterar o registro:" & ex.Message
Finally
Cm = Nothing
Db = Nothing
End Try
End Function
Public Function Excluir() As String
Try
' Cria uma instância do objeto de conexao com o banco de dados
' e preenche os dados necessarios para realizar as operacoes
Db = New classDatabase.DbSql
Db.NomeTabela = "C003_PRODUTOSIMAGEM"
Return Db.Excluir("PImagem_ID", vlCodigo)
Catch ex As Exception
Return "Ocorreu um erro ao tentar excluir o registro: " & ex.Message
Finally
Db = Nothing
End Try
End Function
Public Function Consultar(ByVal pParametro As String, ByVal pOrdem As String) As Data.DataSet
Dim Sql As New System.Text.StringBuilder
Sql.Append(" SELECT PImagem_ID, Produto_ID, PImagem_Titulo, PImagem_Nome, ")
Sql.Append(" PImagem_Imagem, PImagem_Tipo, PImagem_Tamanho, PImagem_Comentario ")
Sql.Append(" FROM C003_PRODUTOSIMAGEM (NOLOCK) ")
If Trim(pParametro) <> "" Then Sql.Append(" WHERE " & Trim(pParametro) & "")
If Trim(pOrdem) <> DBNull.Value.ToString Then Sql.Append(" ORDER BY " & pOrdem & " ") Else Sql.Append(" ORDER BY Produto_ID, PImagem_Titulo ")
Try
' Cria uma instância do objeto de conexao com o banco de dados
' e preenche os dados necessarios para realizar as operacoes
Db = New classDatabase.DbSql
Return Db.Consultar(Sql.ToString)
Catch ex As Exception
Return Nothing
Finally
Db = Nothing
End Try
End Function
Public Function ConsultaAvancada(ByVal pParametro As String, ByVal pOrdem As String) As Data.DataSet
Dim Sql As New System.Text.StringBuilder
Sql.Append(" SELECT A.PImagem_ID, A.Produto_ID, A.PImagem_Titulo, ")
Sql.Append(" A.PImagem_Nome, A.PImagem_Imagem, A.PImagem_Tipo, ")
Sql.Append(" A.PImagem_Tamanho, A.PImagem_Comentario, ")
Sql.Append(" B.Categoria_ID, B.Produto_Codigo, B.Produto_Nome, ")
Sql.Append(" B.Produto_Valor, B.Produto_Desconto, C.Categoria_Nome ")
Sql.Append(" FROM C003_PRODUTOSIMAGEM A (NOLOCK) ")
Sql.Append(" INNER JOIN C002_PRODUTOS B (NOLOCK) ON (B.Produto_Codigo = A.Produto_ID) ")
Sql.Append(" INNER JOIN C001_CATEGORIAS C (NOLOCK) ON (C.Categoria_ID = B.Categoria_ID) ")
If Trim(pParametro) <> "" Then Sql.Append(" WHERE " & Trim(pParametro) & "")
If Trim(pOrdem) <> DBNull.Value.ToString Then Sql.Append(" ORDER BY " & pOrdem & " ") Else Sql.Append(" ORDER BY B.Categoria_ID, A.Produto_ID, A.PImagem_Titulo ")
Try
' Cria uma instância do objeto de conexao com o banco de dados
' e preenche os dados necessarios para realizar as operacoes
Db = New classDatabase.DbSql
Return Db.Consultar(Sql.ToString)
Catch ex As Exception
Return Nothing
Finally
Db = Nothing
End Try
End Function
'Função para retornar verdadeiro quando estação encontrada
Private Function Busca(ByVal pParametro As String) As Boolean
Dim Ds As Data.DataSet
Ds = Consultar(pParametro, "")
If Ds.Tables(0).Rows.Count <> 0 Then
Return True
Else
Return False
End If
End Function
End Class
End Namespace
Salvando arquivo:
Private Sub AssociaImagem()
Dim Gi As DataGridItem
Dim pArquivo As Byte()
Dim pTitulo, pComentario As WebControls.TextBox
Dim pFU As WebControls.FileUpload
Dim pProduto As Integer
Dim Ds As Data.DataSet
Ds = Produto.Consultar(" Categoria_ID = " & ddlCategoria.SelectedValue & " AND Produto_Codigo = '" & Trim(TxtCodigo.Text) & "' ", "")
pProduto = Ds.Tables(0).Rows(0)("Produto_ID")
For Each Gi In DataGrid2.Items
pFU = Gi.Cells(0).FindControl("gFuArquivo")
pTitulo = Gi.Cells(0).FindControl("gTxtTitulo")
pComentario = Gi.Cells(0).FindControl("gTxtComentario")
If (Trim(pTitulo.Text) <> DBNull.Value.ToString) And (pFU.HasFile = True) Then
With Imagem
.Codigo = 0
.Produto = pProduto
.Nome = pFU.FileName
.Titulo = Trim(pTitulo.Text)
pArquivo = New Byte(pFU.PostedFile.InputStream.Length) {}
.Imagem = pArquivo
.Tamanho = pFU.PostedFile.ContentLength
.Tipo = pFU.PostedFile.ContentType
If Trim(pComentario.Text) <> DBNull.Value.ToString Then .Comentario = Trim(pComentario.Text) Else .Comentario = DBNull.Value.ToString
End With
Imagem.Inserir()
End If
Next
End Sub
Alguém sabe o que está errado?
Grato,
Ilano.
Discussão (2)
Carregando comentários...