GRAVAR ARQUIVO DOC EM BANCO DE DADOS
Pessoal,
Como já mencionei anteriormente estou desenvolvendo um aplicativo em VBA Excel (Isso pq aqui não posso usar Visual Basic) para gerenciamento de projetos. Uma das etapas do cronograma é a espeficicação funcional e nesta etapa preciso que o sistema salve esta espeficicação (arquivo .doc) no banco de dados access, ou seja, no campo especificação.
Isso é possÃÂÂvel?
Como já mencionei anteriormente estou desenvolvendo um aplicativo em VBA Excel (Isso pq aqui não posso usar Visual Basic) para gerenciamento de projetos. Uma das etapas do cronograma é a espeficicação funcional e nesta etapa preciso que o sistema salve esta espeficicação (arquivo .doc) no banco de dados access, ou seja, no campo especificação.
Isso é possÃÂÂvel?
No Access?????
Amigo, sei lá... talvez com um Campo OLE vc consiga.
De uma olhada no link abaixo, crieo que vai lhe ajudar.
http://www.lula.pro.br/artigo.asp?codigo=464&autor=Magico
Amigo, sei lá... talvez com um Campo OLE vc consiga.
De uma olhada no link abaixo, crieo que vai lhe ajudar.
http://www.lula.pro.br/artigo.asp?codigo=464&autor=Magico
Acho que vc tera problemas, pois o campo certo pra esse tipo de situação seria o VARBINARY (SQL Server) do Access eu desconheço, mas acho que não tem algo semelhante.
Arquivos são (DOC, texto, imagens) armazenados em um BD desde que o mesmo ofereça algum suporte aos formatos BLOB (Binary Large OBject).
No caso do MS-Access, o tipo existe e é o OLE Object (ou adLongVarBinary, usando a enumeração da ADO). Para o MS SQL Server, o tipo é chamado de IMAGE, que na verdade é exatamente o mesmo adLongVarBinary, só que administrado de um modo um pouco diferente, já que o SQL Server é Client/Server de verdade.
Como o SQL Server é resultado de uma mixagem que a M$ fez com seus padrões de armazenamento de dados, não é de se estranhar que os tipos entre o MS-Access e o SQL Server sejam parecidos, quando não idênticos.
O campo VARBINARY (ou melhor, SQL_VARBINARY) é um tipo de campo que também aceita BLOB, com uma capacidade menor, mas é derivado do FOXPRO, e na prática serve mais para armazenar memorandos em formatos Texto / XML / HTML (e outros), que são normalmente menores em tamanho.
Finalizando, as mesmas rotinas utilizadas para gravar imagens em um campo de um registro de uma tabela do MS-Access é válida para quaisquer outros arquivos.
O conceito é carregar o conteúdo do arquico para uma matriz de bytes (guardando o tamanho do arquivo + 1) e salvar esse vetor no campo do recordset.
Para esse fim você pode fazer o trabalho "manualmente" (ou seja, abrindo o arquivo para leituna em forma binária e carregando-o para a matriz), ou usar um ADODB.Stream, que faz o mesmo trabalho.
O método manual é melhor (no caso do VB6 / ADO 2.0 á 2.8) porque permite que você gerencie o tamanho do arquivo, que vai ser utilizado no momento do AppendChunk do objeto Field.
Usar os ADODB.Stream é vantajoso no caso de se desejar gravar mais de um arquivo em um mesmo campo, por exemplo, ou de apenas carregar o conteúdo desde o campo até um PictureBox sem precisar gravar a imagem em disco antes (VB6 / DotNet).
No caso do MS-Access, o tipo existe e é o OLE Object (ou adLongVarBinary, usando a enumeração da ADO). Para o MS SQL Server, o tipo é chamado de IMAGE, que na verdade é exatamente o mesmo adLongVarBinary, só que administrado de um modo um pouco diferente, já que o SQL Server é Client/Server de verdade.
Como o SQL Server é resultado de uma mixagem que a M$ fez com seus padrões de armazenamento de dados, não é de se estranhar que os tipos entre o MS-Access e o SQL Server sejam parecidos, quando não idênticos.
O campo VARBINARY (ou melhor, SQL_VARBINARY) é um tipo de campo que também aceita BLOB, com uma capacidade menor, mas é derivado do FOXPRO, e na prática serve mais para armazenar memorandos em formatos Texto / XML / HTML (e outros), que são normalmente menores em tamanho.
Finalizando, as mesmas rotinas utilizadas para gravar imagens em um campo de um registro de uma tabela do MS-Access é válida para quaisquer outros arquivos.
O conceito é carregar o conteúdo do arquico para uma matriz de bytes (guardando o tamanho do arquivo + 1) e salvar esse vetor no campo do recordset.
Para esse fim você pode fazer o trabalho "manualmente" (ou seja, abrindo o arquivo para leituna em forma binária e carregando-o para a matriz), ou usar um ADODB.Stream, que faz o mesmo trabalho.
O método manual é melhor (no caso do VB6 / ADO 2.0 á 2.8) porque permite que você gerencie o tamanho do arquivo, que vai ser utilizado no momento do AppendChunk do objeto Field.
Usar os ADODB.Stream é vantajoso no caso de se desejar gravar mais de um arquivo em um mesmo campo, por exemplo, ou de apenas carregar o conteúdo desde o campo até um PictureBox sem precisar gravar a imagem em disco antes (VB6 / DotNet).
Desenvolvi o código abaixo que resolveu o problema.
Dim mystream As ADODB.Stream
Dim rs As New ADODB.Recordset
Dim strNomeArq As String
Dim strSql As String
If txtCaminhoOrigem.Text = "" Then
MsgBox "Selecione o caminho de origem!", vbCritical + vbOKOnly, "Controle de Aplicativo"
Exit Sub
End If
strNomeArq = Inverte(txtCaminhoOrigem.Text)
If sConn.State = 0 Then
Call Conecta_Banco_dados
End If
strSql = "Select * from TB_Item_EFuncional where PK_item_EP_Codigo ='" & strCodigoProjeto & "'"
Set sRs = sConn.Execute(strSql)
Set mystream = New ADODB.Stream
'Define o tipo como binário
mystream.Type = adTypeBinary
If sRs.EOF Then
rs.Open "TB_Item_EFuncional", sConn, adOpenDynamic, adLockOptimistic
rs.AddNew
mystream.Open
mystream.LoadFromFile txtCaminhoOrigem.Text
rs!PK_item_EP_Codigo = strCodigoProjeto
rs!item_EP_NomeArq = strNomeArq
rs!item_EP_Tamanho = mystream.Size
rs!item_EP_Arquivo = mystream.Read
rs.Update
Else
rs.Open "Select * from TB_Item_EFuncional where PK_item_EP_Codigo ='" & strCodigoProjeto & "'", sConn, adOpenDynamic, adLockOptimistic
mystream.Open
mystream.LoadFromFile txtCaminhoOrigem.Text
rs!item_EP_NomeArq = strNomeArq
rs!item_EP_Tamanho = mystream.Size
rs!item_EP_Arquivo = mystream.Read
rs.Update
End If
mystream.Close
rs.Close
sRs.Close
sConn.Close
Dim mystream As ADODB.Stream
Dim rs As New ADODB.Recordset
Dim strNomeArq As String
Dim strSql As String
If txtCaminhoOrigem.Text = "" Then
MsgBox "Selecione o caminho de origem!", vbCritical + vbOKOnly, "Controle de Aplicativo"
Exit Sub
End If
strNomeArq = Inverte(txtCaminhoOrigem.Text)
If sConn.State = 0 Then
Call Conecta_Banco_dados
End If
strSql = "Select * from TB_Item_EFuncional where PK_item_EP_Codigo ='" & strCodigoProjeto & "'"
Set sRs = sConn.Execute(strSql)
Set mystream = New ADODB.Stream
'Define o tipo como binário
mystream.Type = adTypeBinary
If sRs.EOF Then
rs.Open "TB_Item_EFuncional", sConn, adOpenDynamic, adLockOptimistic
rs.AddNew
mystream.Open
mystream.LoadFromFile txtCaminhoOrigem.Text
rs!PK_item_EP_Codigo = strCodigoProjeto
rs!item_EP_NomeArq = strNomeArq
rs!item_EP_Tamanho = mystream.Size
rs!item_EP_Arquivo = mystream.Read
rs.Update
Else
rs.Open "Select * from TB_Item_EFuncional where PK_item_EP_Codigo ='" & strCodigoProjeto & "'", sConn, adOpenDynamic, adLockOptimistic
mystream.Open
mystream.LoadFromFile txtCaminhoOrigem.Text
rs!item_EP_NomeArq = strNomeArq
rs!item_EP_Tamanho = mystream.Size
rs!item_EP_Arquivo = mystream.Read
rs.Update
End If
mystream.Close
rs.Close
sRs.Close
sConn.Close
Tópico encerrado , respostas não são mais permitidas