Jump to content


Photo

Como Inserir Uma Datagrid Inteiro Em Bd Sql?


  • Faça o login para participar
5 replies to this topic

#1 maxim

maxim

    Normal

  • Usuários
  • 93 posts
  • Sexo:Não informado

Posted 23/10/2005, 09:43

Boas,

a maioria de voces deve conhecer a base de dados sql northwind

Existe uma tabela "order details" e uma tabela "orders" e comunicam atraves do orderid.

Um orderid dentro da tabela "oders" pode corresponder a vários registos dentro da tabela "order details" porque pode haver uma encomenda com vários produtos.

O que eu queria fazer era um formulário de uma nova encomenda.

E tinha pensado no seguinte:

Fazer 3 texts boxes: que seriam "nome do produto" "quantidade" e "preço"

Fazer um botão de "adicionar à encomenda"

quando se escrevesse nos campos, carregava-se no botão esses valores apareciam na datagrid (ou outra tabela qualquer)

No final haveria outra botão "finalizar encomenda"
Onde se adicionaria todos os campos da datagrid à base de dados "orderdetails"
e com o mesmo oderderid adicionasse um registo à tabela "order"

Eu sei ler dados de uma base de dados para um datagrid, mas não sei o contrário.
Nem sei como fazer para quando escrever textos nos textbox esse valor parecer dentro do datagrid. Usando VB.net e ASP.NET

:(

Alguém me dá uma maõzinha??
Obrigado,
Max

Edição feita por: maxim, 23/10/2005, 09:45.

  • HaroNism likes this

#2 felipecm

felipecm

    Expert

  • Usuários
  • 541 posts
  • Sexo:Não informado
  • Localidade:ABC / SP

Posted 23/10/2005, 09:54

Boas,

a maioria de voces deve conhecer a base de dados sql northwind

Existe uma tabela "order details" e uma tabela "orders" e comunicam atraves do orderid.

Um orderid dentro da tabela "oders" pode corresponder a vários registos dentro da tabela "order details" porque pode haver uma encomenda com vários produtos.

O que eu queria fazer era um formulário de uma nova encomenda.

E tinha pensado no seguinte:

Fazer 3 texts boxes: que seriam "nome do produto" "quantidade" e "preço"

Fazer um botão de "adicionar à encomenda"

quando se escrevesse nos campos, carregava-se no botão esses valores apareciam na datagrid (ou outra tabela qualquer)

No final haveria outra botão "finalizar encomenda"
Onde se adicionaria todos os campos da datagrid à base de dados "orderdetails"
e com o mesmo oderderid adicionasse um registo à tabela "order"

Eu sei ler dados de uma base de dados para um datagrid, mas não sei o contrário.
Nem sei como fazer para quando escrever textos nos textbox esse valor parecer dentro do datagrid. Usando VB.net e ASP.NET

:(

Alguém me dá uma maõzinha??
Obrigado,
Max

(y) Primeira coisa.. carregar o datagrid com os dados do DataSet provenientes do teu banco.
A partir dai vc vai trabalhar de forma desconectada, ou seja .. todas suas informacoes vao ser alteradas sobre o Dataset para depois na finalização salve corretamente. O Datagrid busca sua fonte de dados para preenchimento em um DataSet.. logo vc deverá fazer o seguinte.

Com o botão adicionar à encomenda, o q vc tem q fazer é apenas inserir uma linha (DataRow) na DataTable que está no dataset que serve para OrderDetails.
Para isso...:
Dim arrValues(2) as Object
arrValues(0) = Campo0
arrValues(1) = Campo1
arrValues(2) = Campo1

Dataset.Tables(x).Rows.Add(arrValues)

Feito isso , o q vc tem q fazer é apenas dar um DataGrid.DataBind novamente para que ele recarregue o grid com as novas informações do DataSet.

Finalizando essa etapa, o que resta agora é salvar novamente no Banco.
Abra o banco e o DataAdapter novamente, da mesma forma que vc fez pra recuperar o DataSet com as informações, mas ao invez de dar o metodo Fill do DataAdatper utilize DataSet.Update() para atualizar os novos dados.. e DataSet.GetChanges() para que essas novas modificações não sejam pegas no proximo ciclo de Update().

Lembre-se que primeiro vc atualiza a tabela orders com um novo registro e depois vc reflete essas novas alterações em OrderDetails.
MCAD, MCP

#3 maxim

maxim

    Normal

  • Usuários
  • 93 posts
  • Sexo:Não informado

Posted 24/10/2005, 11:09

Olá felipe, obrigado pela tua ajuda:

eu tentei o seguinte codigo:

Dim conexao As String = ConfigurationSettings.AppSettings("conexaowhite")
Dim ds As New DataSet

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim sql As String = "Select * FROM Encomendas "
        Dim conn As New System.Data.SqlClient.SqlConnection(conexao)
        Dim da As New System.Data.SqlClient.SqlDataAdapter(sql, conn)
        conn.Open()
        da.Fill(ds, "dados")
        conn.Close()
        dg_encomendas.DataSource = ds.Tables("dados").DefaultView
        dg_encomendas.DataBind()
    End Sub
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim arrValues(2) As Object
        arrValues(0) = TextBox1.Text
        arrValues(1) = TextBox2.Text
        arrValues(2) = TextBox3.Text
        ds.Tables("dados").Rows.Add(arrValues)
        dg_encomendas.DataSource = ds.Tables("dados").DefaultView
        dg_encomendas.DataBind()
    End Sub

Mas só consigo adicionar uma linha à datagrid.
Se tento inserir mais, ele vai-me substituindo a linha que eu consegui inserir.
Queria que fosse possivel adicionar mais à medida que vou escrevendo nos campos, e carregando no botão :(

Obs: Eu usei uma tabela igual à orders. Mas isto na realidade vai ser usado numa tabela igual à order_details. Mas acho que por agora tanto faz.

O que estarei eu fazendo errado para sóme aparecer uma linha?

#4 felipecm

felipecm

    Expert

  • Usuários
  • 541 posts
  • Sexo:Não informado
  • Localidade:ABC / SP

Posted 24/10/2005, 22:15

Olá felipe, obrigado pela tua ajuda:

eu tentei o seguinte codigo:

Dim conexao As String = ConfigurationSettings.AppSettings("conexaowhite")
Dim ds As New DataSet

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim sql As String = "Select * FROM Encomendas "
        Dim conn As New System.Data.SqlClient.SqlConnection(conexao)
        Dim da As New System.Data.SqlClient.SqlDataAdapter(sql, conn)
        conn.Open()
        da.Fill(ds, "dados")
        conn.Close()
        dg_encomendas.DataSource = ds.Tables("dados").DefaultView
        dg_encomendas.DataBind()
    End Sub
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim arrValues(2) As Object
        arrValues(0) = TextBox1.Text
        arrValues(1) = TextBox2.Text
        arrValues(2) = TextBox3.Text
        ds.Tables("dados").Rows.Add(arrValues)
        dg_encomendas.DataSource = ds.Tables("dados").DefaultView
        dg_encomendas.DataBind()
    End Sub

Mas só consigo adicionar uma linha à datagrid.
Se tento inserir mais, ele vai-me substituindo a linha que eu consegui inserir.
Queria que fosse possivel adicionar mais à medida que vou escrevendo nos campos, e carregando no botão :(

Obs: Eu usei uma tabela igual à orders. Mas isto na realidade vai ser usado numa tabela igual à order_details. Mas acho que por agora tanto faz.

O que estarei eu fazendo errado para sóme aparecer uma linha?

Entao.. o que ocorre eh o seguinte.. seu botao ate esta inserindo no DataTable e talz.. porem o evento Page_load ocorre toda vez que sua pagina eh carregada .. ateh mesmo quando um botao eh clickado.. e entao ele recupera tudo novamente do banco.. porisso que ele sempre vem com tudo do banco e com apenas o novo registro inserido..


Pra resolver isso, primeiramente o Dataset soh deve ser recuperado uma vez durante toda a execução da pagina. Isso preserva e deixa a pagina mais rapida. Feito isso vc tem q arrumar uma forma de manter o estado do DataSet para que quando dê um refresh (pelo click de um botao por exemplo) ele nao perca tudo. Eu costumo guardar DataSets em Sessions..porem temos N formas de fazer isso

Dim conexao As String = ConfigurationSettings.AppSettings("conexaowhite")
Dim ds as DataSet

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      If Not IsPostBack Then
        Dim sql As String = "Select * FROM Encomendas "
        Dim conn As New System.Data.SqlClient.SqlConnection(conexao)
        Dim da As New System.Data.SqlClient.SqlDataAdapter(sql, conn)

        ds = New DataSet
        conn.Open()
        da.Fill(ds, "dados")
        conn.Close()
        Session("dsRetorno") = ds
      Else
        ds = CType(Session("dsRetorno"), DataSet)
      End If

      dg_encomendas.DataSource = ds.Tables("dados").DefaultView
      dg_encomendas.DataBind()
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim arrValues(2) As Object
        arrValues(0) = TextBox1.Text
        arrValues(1) = TextBox2.Text
        arrValues(2) = TextBox3.Text
        ds.Tables("dados").Rows.Add(arrValues)
        Session("dsRetorno") = ds
        'dg_encomendas.DataSource = ds.Tables("dados").DefaultView
        dg_encomendas.DataBind()
    End Sub


MCAD, MCP

#5 maxim

maxim

    Normal

  • Usuários
  • 93 posts
  • Sexo:Não informado

Posted 25/10/2005, 14:14

Obrigado felipcm!!

Eu já tinha tentado com o Not Pagepostback, e também não dava!!

Mas realmente faltava colocar o datagrid na session para estar sempre disponivel, e não voltar a fazer a fill!!

Mas agora estou com outro problema, depois de inserir mais encomendas, quero adicionar à base de dados, e dá-me um erro:

System.InvalidOperationException: Update requires a valid InsertCommand when passed DataRow collection with new rows.


O codigo que estou a usar é:

    Dim conexao As String = ConfigurationSettings.AppSettings("conexaowhite")
    Dim sql As String = "Select * FROM Encomendas "
    Dim conn As New System.Data.SqlClient.SqlConnection(conexao)
    Dim da As New System.Data.SqlClient.SqlDataAdapter(sql, conn)
    Dim ds As DataSet
    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        If Not IsPostBack Then
            ds = New DataSet
            conn.Open()
            da.Fill(ds, "dados")
            conn.Close()
            Session("dsRetorno") = ds
        Else
            ds = CType(Session("dsRetorno"), DataSet)
        End If
        dg_encomendas.DataSource = ds.Tables("dados").DefaultView
        dg_encomendas.DataBind()
    End Sub
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        'adiciona encomenda ao dataset
        'Dim arrValues(2) As Object
        'arrValues(0) = TextBox1.Text
        'arrValues(1) = TextBox2.Text
        'arrValues(2) = TextBox3.Text
        'ds.Tables("dados").Rows.Add(arrValues)
        Dim dtrow As DataRow = ds.Tables("Dados").NewRow()
        dtrow("EncomendaID") = TextBox1.Text
        dtrow("ClienteID") = TextBox2.Text
        dtrow("DataEncomenda") = TextBox3.Text
        ds.Tables("dados").Rows.Add(dtrow)
        Session("dsRetorno") = ds
        dg_encomendas.DataBind()
    End Sub
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Session("dsRetorno") = ds
        conn.Open()
        da.Update(ds, "dados")
        conn.Close()
    End Sub

Eu pensava que era por causa da tabela ter uma key, mas eu fui lá, desactivei a Key e obtive o mesmo erro :(

Mas estou com outra duvida, imaginando que dava certo, como é que eu depois inseria produtos nessa encomenda que eu adiciono?
Se calhar é agarrando o encomendaid com que essa encomenda foi adicionada e fazer um add de encomenda_details com o mesmo id... Mas não sei se dará certo!

Estou a abusar da tua paciencia... :unsure:
Mas super obrigado pelas dicas que me foste dando, têm sido uma grande ajuda.
No final eu post aqui o codigo todo, porque deve haver mais gente interessada e eu não consegui encontrar na net nenhum script que faça isto em vb.net

1 abraço,
Max

#6 HaroNism

HaroNism

    Super Veterano

  • Usuários
  • 15385 posts
  • Sexo:Masculino
  • Localidade:San Miguel de Tucuman

Posted 05/12/2017, 20:10

Prix De Cialis En Pharmacie En France Commander Cialis Quebec generic cialis Cialis Quebec Wellbutrin Pay With Paypal Treatment For Itching Rash Amoxicillin Reaction
Viagra Cialis Acquisto Ed Meds Online Canada Cialisonline4all Online Pharmacy Review levitra without a script Cialis 10g Antibiotics For Sale Online Buying Genuine Viagra No Procription
Where To Get Viagra Online Forum Male Ed Pharmacy Amoxicillin Highs buy viagra online Where To Purchase Alli Cheapeast Legally Elocon Saturday Delivery On Line Oregon




0 user(s) are reading this topic

0 membro(s), 0 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq