Jump to content

[Resolvido] Duvida Listar dados do SqlServer para DataGridView


pfcs
 Share

Recommended Posts

Boas pessoal,

Estou com um problema a inserir dados de uma tabela SQL numa DataGridView, será que podiam dar-me uma ajudinha?

Tenho este código:

Public Class Form1

Private Sub conectar()
 Dim sqlConnector As New SqlConnection
 sqlConnector.ConnectionString = "Server=xxx.xxx.xx.xx\SQLEXPRESS;Database=Teste;User ID=Teste;Password=xxxxxx"
 Dim comandoSQL As String = "Select * from Artigos "
 Dim da As SqlDataAdapter = New SqlDataAdapter(comandoSQL, sqlConnector)
 Dim ds As DataSet = New DataSet()
 da.Fill(ds, "Artigos")
 DataGridView1.DataSource = ds.DefaultViewManager
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
 conectar()
End Sub
End Class

Obrigado

Edited by Caça
Link to comment
Share on other sites

Bom dia.

Experimente em vez de ter o dataset para obter os dados.

usar um DataTable 🙂

Pode implementar assim:

Public Class Form1

Private Sub Conectar
Dim sqlConnector As New SqlConnection
sqlConnector.ConnectionString = "Server=xxx.xxx.xx.xx\SQLEXPRESS;Database=Teste;User ID=Teste;Password=xxxxxx"
Dim comandoSQL As String = "Select * from Artigos "
Dim da As SqlDataAdapter = New SqlDataAdapter(comandoSQL, sqlConnector)
Dim dt As DataTable= New DataTable()
da.Fill(dt, "Artigos")
DataGridView1.DataSource = dt
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
conectar()
End Sub

End Class

Cumprimentos

Edited by Caça
Link to comment
Share on other sites

Tenta

DataGridView1.DataSource = ds.DefaultViewManager.Dataset.Tables(0)

ou

DataGridView1.DataSource = ds.DefaultViewManager.Dataset.Tables("Artigos")

-----------------------

uma boa ideia é trabalhar com DataView:

Dim dv As DataView

dv=ds.Tables(0).DefaultView

DataGridView1.DataSource=dv

podes fazer e mostrar automatica/ ordenações e filtros sobre os dados na grid.Por exemplo:

dv.Sort = "NomeArtigo ASC"

dv.RowFilter ="NomeArtigo LIKE '%" & txNome.Text.Trim & "%'

Link to comment
Share on other sites

Bom substituido consegui muito obrigado.

Agora estou é com um problema mais chato, o objectivo do meu programa é importar um ficheiro TXT delimitado por nº de caracteres e inserir numa tabela da BD. O problema é que não sei bem como se faz o insert dos dados. Tenho este código:

Private Sub btnImportar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnImportar.Click
 If txtArquivoOrigem.Text = String.Empty Or Not txtArquivoOrigem.Text.Contains(".txt") Then
	 MsgBox("Informe o caminho do arquivo texto origem.")
	 Return
 End If

 Using leitor As New TextFieldParser(txtArquivoOrigem.Text)
	 leitor.TextFieldType = FieldType.FixedWidth
	 leitor.SetFieldWidths(10, 35, 16)
	 Dim linhaAtual As String()
	 Dim sqlConnector As New SqlConnection
	 sqlConnector.ConnectionString = "Server=xxx.xxx.xx.xx\SQLEXPRESS;Database=Teste;User ID=teste;Password=teste"
	 sqlConnector.Open()

	 Dim tabela As New DataTable

	 While Not leitor.EndOfData
		 Try
			 linhaAtual = leitor.ReadFields()

			 Dim comandoSQL As String = "INSERT INTO Artigos (CodProdAcabado, Descricao, PrecoVenda ) VALUES ( DUVIDA)"
			 Dim da As SqlDataAdapter = New SqlDataAdapter(comandoSQL, sqlConnector)

			 da.Fill(tabela)
			 DataGridView1.ColumnHeadersVisible = True
			 DataGridView1.DataSource = tabela

		 Catch ex As MalformedLineException
			 'Ignoramos a linha atual caso não seja válida
			 MsgBox("Linha: " & ex.Message & " não é válida e será ignorada.")
		 End Try
	 End While
	 MsgBox("Arquivo Importado com Sucesso!")
 End Using

End Sub

Private Sub btnAbrirFicheiro_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAbrirFicheiro.Click
 Dim AbrirComo As OpenFileDialog = New OpenFileDialog()
 Dim caminho As DialogResult
 Dim Arquivo As String

 AbrirComo.Title = "Abrir como"
 AbrirComo.FileName = "Nome Arquivo"
 AbrirComo.Filter = "Arquivos Textos (*.txt)|*.txt"
 caminho = AbrirComo.ShowDialog
 Arquivo = AbrirComo.FileName
 If Arquivo = Nothing Then
	 MessageBox.Show("Arquivo Invalido", "Salvar Como", MessageBoxButtons.OK)
 Else
	 txtArquivoOrigem.Text = Arquivo
 End If

End Sub

Obrigado pela ajuda.

Edited by Caça
GeSHi
Link to comment
Share on other sites

Bom dia.

Podes fazer algo deste género.

tens de substituir tudo o que está dentro de parêntesis rectos ("[ ]") e também devem ser retirados da query.

Dim comandoSQL As String = "INSERT INTO [NOMETABELA] ([NomeCampo1],[NomeCampo2], [NomeCampo3]) VALUES ('[VALOR PARA O CAMPO1]', '[VALORC2]', '[ValorC3]' )"
Dim cmd As New SqlClient.SqlCommand(comandoSQL, sqlConnector)
Dim intLinhasAfectadas As Integer = cmd.ExecuteNonQuery()

If intLinhasAfectadas = 0 Then MsgBox("Não foi inserido")

Isto é o código do insert

Tens é de trocar os nomes pelos campos que tenhas na tabela e os valores pelos que forem lidos do ficheiro de texto.

Alguma dúvida.. basta contactar..

Cumps.

Edited by Caça
GeSHi
Link to comment
Share on other sites

Boas já consegui resolver o problema, já passa para a BD os dados da TXT.

A parte chata é que tenho caracteres plica no TXT a importar " ' " e mal apanhe um o programa dá erro. Há alguma forma de contornar isso?

Private Sub btnAbrirFicheiro_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAbrirFicheiro.Click
 Dim AbrirComo As OpenFileDialog = New OpenFileDialog()
 Dim caminho As DialogResult

 AbrirComo.Title = "Abrir como"
 AbrirComo.FileName = "Nome Arquivo"
 AbrirComo.Filter = "Arquivos Textos (*.txt)|*.txt"
 caminho = AbrirComo.ShowDialog
 Arquivo = AbrirComo.FileName
 If Arquivo = Nothing Then
	 MessageBox.Show("Arquivo Invalido", "Salvar Como", MessageBoxButtons.OK)
 Else
	 txtArquivoOrigem.Text = Arquivo
 End If
End Sub
Private Sub btnImportar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnImportar.Click
 ligarBD()
 'verifica se o caminho e nome do arquivo está ok
 If txtArquivoOrigem.Text = String.Empty Or Not txtArquivoOrigem.Text.Contains(".txt") Then
	 MsgBox("Informe o caminho do arquivo texto origem.")
	 Return
 End If
 Try
	 DataGridView1.ColumnHeadersVisible = True
	 'define a estrutura da DataGrid que vai receber os dados
	 dt.Columns.Add("COD. PRODUTO", Type.GetType("System.String"))
	 dt.Columns.Add("DESCRIÇÃO PRODUTO", Type.GetType("System.String"))
	 dt.Columns.Add("PREÇO DE VENDA", Type.GetType("System.String"))

	 'Lê o ficheiro TXT e separa-o em parcelas
	 Using leitor As New TextFieldParser(txtArquivoOrigem.Text)
		 leitor.TextFieldType = FieldType.FixedWidth
		 leitor.SetFieldWidths(10, 35, 16)
		 Dim linhaAtual As String()
		 While Not leitor.EndOfData
			 Try
				 linhaAtual = leitor.ReadFields()
				 CodProdAcabado = linhaAtual(0)
				 Descricao = linhaAtual(1)
				 PrecoVenda = linhaAtual(2)
				 'insere os dados no SQL Server
				 sqlInclui = "IF NOT EXISTS(SELECT CodProdAcabado FROM teste WHERE CodProdAcabado = '" & CodProdAcabado & "' ) BEGIN INSERT INTO teste (CodProdAcabado, Descricao, PrecoVenda) VALUES ('" & CodProdAcabado & "','" & Descricao & "', '" & PrecoVenda & "')END"
				 sqlComando = New SqlCommand(sqlInclui, sqlConnector)
				 sqlComando.ExecuteNonQuery()
				 dt.Rows.Add(CodProdAcabado, Descricao, PrecoVenda)
			 Catch ex As MalformedLineException
				 'Ignoramos a linha atual caso não seja válida
				 MsgBox("Linha: " & ex.Message & " não é válida e será ignorada.")
			 End Try
		 End While
		 MsgBox("Arquivo Importado com Sucesso!")
	 End Using
	 row = dt.NewRow
	 'atribui ao datagridview o objeto datatable criado
	 DataGridView1.DataSource = dt
	 sqlConnector.Close()
	 btnApagar.Enabled = True
 Catch ex As Exception
	 MsgBox("Erro ao ler o arquivo texto." & ex.Message)
 End Try
 sqlConnector.Close()
 btnApagar.Enabled = True
End Sub
Edited by Caça
GeSHi
Link to comment
Share on other sites

Boas,

Antes de adicionar o txt pode ser feito um replace de ' por ''

duas plicas juntas escrevem 1 na BD 🙂

os selects são normais 🙂

exemplo:

Query = "INSERT INTO Tabela (Campo) Values ('" & stringTXT.replace("'","''") & "')

Cumprimentos

Edited by Caça
GeSHi
Link to comment
Share on other sites

Ola pfcs.

Qdo se trate de sqlcommands, o melhor é utilizar parâmetros, por ex:

INSERT INTO teste (CodProdAcabado, Descricao, PrecoVenda) VALUES (@CodProdAcabado, @Descricao, @PrecoVenda)

dá um pouco mais de trabalho porque tens que declarar e atribuir valores aos parâmetros

mas evitas os problemas das plicas e das vírgulas quer no texto quer nos decimais

é uma questão de hábito...

Link to comment
Share on other sites

Dim cmd As New SqlClient.SqlCommand(sql, cn)

' com declaração do tipo de dados

cmd.Parameters.Add(@Id", SqlDbType.Int)

cmd.Parameters("@Id").Value = valorInt

' sem declaração do tipo

cmd.Parameters.AddWithValue("@Id", valorint)

por princípio aconselho a 1ª - controla-se melhor eventual troca de tipos de dados

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.