Jump to content

[Resolvido] Gravar image e adicionar a uma base de dados


killerbest
 Share

Recommended Posts

Boas pessoal 🙂 ,

Eu já consegui visualizar as imagens que tão na base de dados, mas agora preciso que o utilizador possa gravar essa imagem, e automáticamente irá adicionar essa imagem a outra tabela da mesma base de dados.

Se alguem poder ajudar, agradeço

killerbest

Link to comment
Share on other sites

Deves sempre colocar a solução e não esperar que os outros te peçam.

Como pediste a solução para inserir na base de dados:

using (Bitmap bm = new Bitmap(file))
{
   using (MemoryStream ms = new MemoryStream())
   {
		  bm.Save(ms, ImageFormat.Jpeg);
		  return Convert.ToBase64String(ms.ToArray());
   }
}
Link to comment
Share on other sites

Boas, claro que partilho 😄 , sem problemas.

O primeiro codigo, faz a inserção dos dados na base de dados

P.S. = Eu tenho a bd em Oracle, agora é só adaptar pela sua base de dados

Imports System.IO
Imports System.Drawing.Imaging
Imports Oracle.DataAccess.Client
Imports Oracle.DataAccess.Types
Imports System.Data
Imports System.Data.Odbc
Imports System.ComponentModel
Imports System.Text
Imports LevDan.Exif
Imports System
Imports System.Drawing
Imports System.Collections
Imports System.Windows.Forms
Module Tratadas
Sub Main1()
	' create o/s authenticated connection to local database
	Dim con As OracleConnection = New OracleConnection()

	con.ConnectionString = "User Id = " + Form2.userid.Text + ";Password = " + Form2.password.Text + ";Data Source = " + Form2.datasource.Text + ";"
	con.Open()

	' call helpers to do the work
	TruncateTable(con)
	LoadLOB(con)
	DeleteLOB()
	WriteLOB(con)

	' clean up connection object
	con.Dispose()
End Sub
Sub TruncateTable(ByVal con As OracleConnection)
	Dim cmd As OracleCommand = New OracleCommand()
	cmd.Connection = con
	cmd.Dispose()
End Sub
Sub LoadLOB(ByVal con As OracleConnection)
	' setup stream and reader objects
	Dim fs As New FileStream(Form7.Label34.Text, FileMode.Open, FileAccess.Read)
	Dim br As New BinaryReader(fs)

	' create byte array to hold the file data
	Dim upperBound As Long = fs.Length - 1
	Dim bytes(upperBound) As Byte

	For i As Integer = 0 To upperBound
		bytes(i) = br.ReadByte
	Next

	' close reader and stream objects
	br.Close()
	fs.Close()

	' use OracleBlob to load the data
	Dim blob As OracleBlob = New OracleBlob(con)
	blob.Write(bytes, 0, bytes.Length)

	' statement to insert the blob data in to the test table
	Dim cmd As OracleCommand = New OracleCommand()
	cmd.Connection = con
	cmd.CommandText = "insert into blob_test_2 values (:1, :2, :3)"

	' parameter char for the id_imagem
	Dim p1 As OracleParameter = New OracleParameter
	p1.OracleDbType = OracleDbType.Char
	p1.Value = Form7.TextBox1.Text

	' parameter char for the imagem
	Dim p2 As OracleParameter = New OracleParameter
	p2.OracleDbType = OracleDbType.Blob
	p2.Value = blob

	' parameter char for the id_imagem
	Dim p3 As OracleParameter = New OracleParameter
	p3.OracleDbType = OracleDbType.Char
	p3.Value = Form7.Label12.Text

	' add the parameters to the collection
	cmd.Parameters.Add(p1)
	cmd.Parameters.Add(p2)
	cmd.Parameters.Add(p3)

	' do the insert
	cmd.ExecuteNonQuery()

	' clean up objects
	p3.Dispose()
	p2.Dispose()
	p1.Dispose()
	cmd.Dispose()
	blob.Dispose()
	fs.Dispose()
End Sub
Sub DeleteLOB()
	' simply delete the file from the file system
	' WriteLOB will replace this with the blob data in the database
	My.Computer.FileSystem.DeleteFile(Form7.Label34.Text)
End Sub
Sub WriteLOB(ByVal con As OracleConnection)
	' setup stream and writer objects
	Dim fs As New FileStream(Form7.Label34.Text, FileMode.Create, FileAccess.Write)
	Dim bw As New BinaryWriter(fs)

	' statement to get the data from the test table
	Dim cmd As OracleCommand = New OracleCommand()
	cmd.Connection = con
	cmd.CommandText = "select imagem, dataregisto from blob_test_2 where id_imagem = :1"

	' parameter object for the id_imagem column
	Dim p1 As OracleParameter = New OracleParameter
	p1.OracleDbType = OracleDbType.Decimal
	p1.Value = Form7.TextBox1.Text

	' add the parameter to the collection
	cmd.Parameters.Add(p1)

	' use a data reader to get the imagem
	Dim dr As OracleDataReader = cmd.ExecuteReader()
	dr.Read()
	Dim blob As OracleBlob = dr.GetOracleBlob(0)

	' use a data reader to get the data registo
	Dim dr1 As OracleDataReader = cmd.ExecuteReader()
	dr1.Read()
	Dim dataregisto As OracleString = dr1.GetOracleString(0)

	' setup byte array with blob data from database and write to file system
	Dim bytes(blob.Length) As Byte
	blob.Read(bytes, 0, blob.Length)
	bw.Write(bytes)

	' close the write and stream objects
	bw.Close()
	fs.Close()

	' clean up objects
	dr.Dispose()
	p1.Dispose()
	cmd.Dispose()

End Sub
End Module

Isto é o form, onde vai chamar o modulo para inserir os dados

        If PictureBox1.Image Is Nothing Or TextBox1.Text = "" Then

		MsgBox("1º tem que escolher a imagem a visualizar, e depois poderá guardar!", MsgBoxStyle.Information, "Informação")
		conn.Close()

	Else

		Try
			conn.ConnectionString = "User Id = " + Form2.userid.Text + ";Password = " + Form2.password.Text + ";Data Source = " + Form2.datasource.Text + ";"
			conn.Open()

			Dim local As String
			Dim img = New Bitmap(PictureBox1.Image)
			Dim saveFileDialog1 As New SaveFileDialog()

			saveFileDialog1.Filter = "JPEG Files|*.jpg"
			saveFileDialog1.Title = "Save an Image File"

			If saveFileDialog1.ShowDialog() = System.Windows.Forms.DialogResult.OK Then

				local = saveFileDialog1.FileName
				img.Save(local, System.Drawing.Imaging.ImageFormat.Jpeg)
				Label34.Text = local

				Main1()

			End If

			MsgBox("Imagem gravada com sucesso!", MsgBoxStyle.Information, "Informação")
			conn.Close()
			Me.Hide()
			Form1.Show()

		Catch ex As Exception
			MsgBox(ex.Message)
			conn.Close()
			Me.Hide()
			Form1.Show()
		End Try
	End If
End Sub

E é isso 😄

Se tiver a fazer em access veja esse site

http://www.macoratti.net/vbna_cp2.htm

Link to comment
Share on other sites

Claro xD 😄

Dim oValor As String
conn.Close()

Try
oValor = TextBox1.Text

If TextBox1.Text = "" Then

MsgBox("Introduza primeiro o ID da imagem!", MsgBoxStyle.Information, "Informação")
Exit Sub
End If

conn.ConnectionString = "User Id = " + Form2.userid.Text + ";Password = " + Form2.password.Text + ";Data Source = " + Form2.datasource.Text + ";"
Dim com As New OracleCommand("Select imagem from blob_test where id_blob= " + TextBox1.Text + "", conn)
com.Parameters.Add(TextBox1.Text, Convert.ToInt32(oValor))
conn.Open()
Dim tempImagem As Byte() = DirectCast(com.ExecuteScalar(), Byte())

If tempImagem Is Nothing Then
MsgBox("Imagem não se encontra na base de dados", MsgBoxStyle.Critical, "Erro")
TextBox1.Clear()

If TextBox1.Text <= 0 Then
MsgBox("Não existe imagens com o id igual ou inferior a 0!", MsgBoxStyle.Information, "Informação")
TextBox1.Clear()
End If
Exit Sub

Else

Dim strArquivo As String = Convert.ToString(DateTime.Now.ToFileTime())
Dim fs As New FileStream(strArquivo, FileMode.CreateNew, FileAccess.Write)
fs.Write(tempImagem, 0, tempImagem.Length)
fs.Flush()
fs.Close()
PictureBox1.Image = Image.FromFile(strArquivo)

'--------------------------------------------------------------------------------
'Chama o nome da imagem
Dim sql1 As String = "Select nome From blob_test where id_blob =" + TextBox1.Text
cmd = New OracleCommand(sql1, conn)
cmd.CommandType = CommandType.Text
Dim dr1 As OracleDataReader = cmd.ExecuteReader()
dr1.Read()
Dim nome As OracleString = dr1.GetOracleString(0)

Label4.Text = nome

alguem consegue-me dizer como é que eu meto isso em codigo vb.net. É que assim fica sem cor, fica muito desarrumado

Edited by killerbest
Link to comment
Share on other sites

Neste momento ainda tou na empresa, mas lá pas 18 já tou em casa e depois fala-mos melhor

o codigo pode ser atingo, mas tente agarrar no codigo necessário e adaptá-lo

Veja se consegue adaptar esse

 Private Sub btnRecuperarImagem_Click(sender As Object, e As EventArgs) Handles btnRecuperarImagem.Click
Try
Dim oValor As String = InputBox("Informe o código da Imagem", "Recupera Imagens", "1", 400, 400)
If String.IsNullOrWhiteSpace(oValor) Then
Exit Sub
End If
Using con As New SqlConnection("Data Source=(LocalDB)\v11.0;Initial Catalog=Cadastro;Integrated Security=True")
Using com As New SqlCommand("Select Imagem from Impressoes where ID=@ID", con)
com.Parameters.AddWithValue("@ID", Convert.ToInt32(oValor))
con.Open()
Dim tempImagem As Byte() = DirectCast(com.ExecuteScalar(), Byte())
If tempImagem Is Nothing Then
MessageBox.Show("Imagem não localizada", "Erro")
Exit Sub
Else
Dim strArquivo As String = Convert.ToString(DateTime.Now.ToFileTime())
Dim fs As New FileStream(strArquivo, FileMode.CreateNew, FileAccess.Write)
fs.Write(tempImagem, 0, tempImagem.Length)
fs.Flush()
fs.Close()
picImagem.Image = Image.FromFile(strArquivo)
End If
End Using
End Using
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub

Foi aqui que eu fui buscar o meu codigo, adaptei tudo para Oracle e tornei mais simples

Edited by killerbest
Link to comment
Share on other sites

você consegue fazer um código assim:

Depois de Logar abre um formulario.

No formulário quero que esteja um bem vindo.

Mais com o nome da pessoa.

Mais em vez de ser

 label.text = "Bem Vindo " &   frmlogin.txtname.text & " a sua conta" 

quero que o nome venha da base de dados

Ajude-me?

Link to comment
Share on other sites

Dim conn As New OracleConnection
Private cmd As OracleCommand

Dim cmd = New OracleCommand("SELECT "metes os campos que queres selecionar, neste caso é o nome" FROM "nome da tabela onde esta o teu username" Where "o nome do campo da password" = '" + textbox que tens para a pass no form do login" + "', conn)

conn.Open()
cmd.ExecuteNonQuery()

"Eu nao sei se isto da" - label onde vai mostrar o nome.text = cmd

conn.Close()
Edited by killerbest
Link to comment
Share on other sites

     Dim ole As String = "SELECT senha From tbluser where usuário = a ;"
       ' tbluser = nome da tabela que quiseres pôr 
       Dim myConnectionString As String = _
       "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:\Users\root\Documents\Login BIDS.accdb"
       Dim connection As New OleDbConnection(myConnectionString)
       Dim command As New OleDbCommand(ole, connection)
       command.Parameters.Add("@utilizador", OleDbType.VarChar).Value = TextBox1.Text

       connection.Open()
       Dim x As Object
       x = command.ExecuteScalar
       Label1.Text = command.ExecuteScalar
   End Sub

Parece que o teu código nao funcionou fiquei uma hora nele e nada. Mas eu usei esse aqui e foi muito bem.

Ajude-me?

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.