pfcs Posted June 18, 2012 Report Share Posted June 18, 2012 (edited) 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 June 18, 2012 by Caça Link to comment Share on other sites More sharing options...
RGanhoto Posted June 18, 2012 Report Share Posted June 18, 2012 (edited) 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 June 18, 2012 by Caça Link to comment Share on other sites More sharing options...
jlpcalado Posted June 18, 2012 Report Share Posted June 18, 2012 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 More sharing options...
pfcs Posted June 18, 2012 Author Report Share Posted June 18, 2012 (edited) 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 June 19, 2012 by Caça GeSHi Link to comment Share on other sites More sharing options...
RGanhoto Posted June 19, 2012 Report Share Posted June 19, 2012 (edited) 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 June 19, 2012 by Caça GeSHi Link to comment Share on other sites More sharing options...
pfcs Posted June 19, 2012 Author Report Share Posted June 19, 2012 (edited) 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 June 19, 2012 by Caça GeSHi Link to comment Share on other sites More sharing options...
RGanhoto Posted June 19, 2012 Report Share Posted June 19, 2012 (edited) 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 June 19, 2012 by Caça GeSHi Link to comment Share on other sites More sharing options...
jlpcalado Posted June 19, 2012 Report Share Posted June 19, 2012 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 More sharing options...
pfcs Posted June 20, 2012 Author Report Share Posted June 20, 2012 Obrigado a todos pelas respostas. Com o replace a coisa fica resolvida, mas se calhar com os parâmetros a coisa fica mais sólida. jlpcalado como é que eu dou valores aos parâmetros? Obrigado. Link to comment Share on other sites More sharing options...
jlpcalado Posted June 20, 2012 Report Share Posted June 20, 2012 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 More sharing options...
pfcs Posted June 22, 2012 Author Report Share Posted June 22, 2012 Boas Muito obrigado a todos, já rola às mil maravilhas. Um abraço Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now