Jump to content
HQuintas

Actualizar DataAdapter com controlo DataGridView

Recommended Posts

HQuintas

Boas

Pegado no exemplo de http://www.jorgepaulino.com/2008/04/vbnet-utilizando-o-controlo.html e adaptado

Public Class Form1

Public myConnectionString As String = "Data Source=I:\G\BIN\Debug\BD.sqlite;"
' Declaração de variáveis privadas

Private da As SqliteDataAdapter
Private ds As DataSet
Dim connection As New SQLiteConnection(myConnectionString)
Private Sub Enche(ByVal sql As String)
' Cria um novo SqlDataAdapter que servirá para actualizar o DataSet
da = New SQLiteDataAdapter(sql, connection)
' Cria um DataSet, ou seja, uma representação em memória da informação
ds = New DataSet
' Coloca a informação da tabela definida no DataSet
da.Fill(ds, "Tabela")
' Define que a fonte de dados da DataGridView é a nossa DataSet
' criando automáticamente as colunas e linhas de dados
Me.DataGridView1.DataSource = ds.Tables("Tabela")
'Me.DataGridView1.Columns(1).DefaultCellStyle.Format = "yyyy-MM-dd"
connection = Nothing

End Sub

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
Enche("select linha,data,id from Lixo4")
End Sub

Private Sub But_Guardar_Click(sender As System.Object, e As System.EventArgs) Handles But_Guardar.Click
' Cria automaticamente o comando para permite actualizar a DataSet
Dim cb As New SQLiteCommandBuilder(da)
' Actualiza na DataSet, e por sua vez na tabela, as alterações efectuadas
da.Update(ds, "Tabela")
End Sub

End Class

O problema está no campo data, que está defenido no sqlite como datetime (yyyy-MM-dd)

Ao carregar na DataGridView aparece como dd-MM-yyyy, e ao actualizar a tabela dá o erro:

"Violação de concorrência: UpdateCommand afetou 0 dos 1 registos esperados."

Como formatar o DataAdapter ? Ou...

Edited by HQuintas

Share this post


Link to post
Share on other sites
bioshock

Se acreditas que esse é o problema, tens de converter os dados para o formato que pertendes, assim que carregues a DataGridView com dados.

DataGridView1.Columns[0].DefaultCellStyle.Format = "yyyy-MM-dd"

Share this post


Link to post
Share on other sites
HQuintas

 Me.DataGridView1.DataSource = ds.Tables("Tabela")
	'Me.DataGridView1.Columns(1).DefaultCellStyle.Format = "yyyy-MM-dd"

DataGridView1.Columns(1).DefaultCellStyle.Format = "yyyy-MM-dd"

Sim, já experimentei isso mas continua a dar o mesmo erro. Estarei colocando no sitio errado?

(Acredito que seja esse o problema, por que se data estiver como varchar, actualiza com sucesso)

Edited by HQuintas

Share this post


Link to post
Share on other sites
bioshock

E todas as células ficam com esse formato antes de gravares?

Experimenta colocar: "yyyy-MM-dd HH:mm:ss"

Share this post


Link to post
Share on other sites
HQuintas

Só a coluna data.

Experimentei "yyyy-MM-dd HH:mm:ss" mas continua a dar o mesmo erro.

Share this post


Link to post
Share on other sites
bioshock

Sim, mas reparaste se foram realmente alteradas todas as células antes de gravares na BD?

É porque colocar esse código antes de gravar não adianta nada. As células tem de ser alteradas em tempo real, de modo a ficarem com o formato desejado.

Dá uma vista de olhos no evento RowPrePaint() da DataGridView. Coloca lá esse código, assim que carregares as informações para a DataGridView, automaticamente vai-te formatar as células de acordo com o que tu pretendes..e só depois gravas.

Share this post


Link to post
Share on other sites
HQuintas

Não estou conseguindo, continua a dar o mesmo erro...vou explorar mais isto

Public Class Form1
   Public myConnectionString As String = "Data Source=I:\G\BIN\Debug\BD.sqlite;"
   ' Declaração de variáveis privadas
   Private da As SqliteDataAdapter
   Private ds As DataSet
   Dim connection As New SQLiteConnection(myConnectionString)
   Private Sub Enche(ByVal sql As String)
    ' Cria um novo SqlDataAdapter que servirá para actualizar o DataSet
    da = New SQLiteDataAdapter(sql, connection)
    ' Cria um DataSet, ou seja, uma representação em memória da informação
    ds = New DataSet
    ' Coloca a informação da tabela definida no DataSet
    da.Fill(ds, "Tabela")
    ' Define que a fonte de dados da DataGridView é a nossa DataSet
    ' criando automáticamente as colunas e linhas de dados
    DataGridView1.DataSource = ds.Tables("Tabela")

   End Sub
   Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    Enche("select linha,data,id from Lixo4")
   End Sub
   Private Sub But_Guardar_Click(sender As System.Object, e As System.EventArgs) Handles But_Guardar.Click
    ' Cria automaticamente o comando para permite actualizar a DataSet
    Dim cb As New SQLiteCommandBuilder(da)
    ' Actualiza na DataSet, e por sua vez na tabela, as alterações efectuadas
    da.Update(ds, "Tabela")
   End Sub

   Private Sub DataGridView1_RowPrePaint(sender As Object, e As System.Windows.Forms.DataGridViewRowPrePaintEventArgs) Handles DataGridView1.RowPrePaint
    DataGridView1.Columns(1).DefaultCellStyle.Format = "yyyy-MM-dd"
   End Sub
End Class

Share this post


Link to post
Share on other sites
bioshock

As células, após carregares os dados, ficaram com o formato "yyyy-MM-dd"?

Pá, o que podes fazer, é ires directamente ao SQLiteManager (que eu presumo que tenhas) e fazeres a query à-lá-mão. E já vês o que é que ele aceita.

UPDATE tabela SET campo = '2013-06-24' WHERE id = 1

Se funcionar, experimenta actualizar os dados de outra forma.

http://wiki.portugal-a-programar.pt/dev_net:vb.net:access

Aproveita e antes de gravares a informação, manda um output do formato das células para verificar se está mesmo de acordo com o que pretendes.

Share this post


Link to post
Share on other sites
HQuintas

Boas, já consegui.

Quando alterei para o evento RowPrePaint, utilizei o formato "yyyy-MM-dd", depois reparei que ao usar outros métodos de inserção (insert ou update), que ele coloca a data no formato "yyyy-MM-dd hh:mm:ss"

Private Sub DataGridView1_RowPrePaint(sender As Object, e As System.Windows.Forms.DataGridViewRowPrePaintEventArgs) Handles DataGridView1.RowPrePaint
	DataGridView1.Columns(1).DefaultCellStyle.Format = "yyyy-MM-dd hh:mm:ss"
End Sub

Só uso este método datatable para visualizar e editar as tabelas, porquê é simples e rápido de montar.

Ando a ponderar de futuro usar unix time, mas depois como faço neste caso? (vai guardar em que formato)

Obrigado bioschok

Share this post


Link to post
Share on other sites
bioshock

Nunca utilizei esse formato. Mas pelo que estive a pesquisar no google, o processo é o mesmo.

$timestamp = 1326988299; 
$readable = date("Y-m-d H:i:s", $timestamp); 

Portanto, em .NET, é praticamente igual como tens feito. Recebes os dados e convertes a célula para o formato que pretendes.

http://stackoverflow.com/questions/249760/how-to-convert-unix-timestamp-to-datetime-and-vice-versa

Share this post


Link to post
Share on other sites
HQuintas

Recebes os dados e convertes a célula para o formato que pretendes.

Mas depois ao gravar dá erro, porque está noutro formato. Certo?

A data em SQLite pode ser do tipo Text, Integer ou Real (já me disseram aqui, que integer ou real é mais simples comparar, adicionar, etc com as datas), o Sqlite tem funções para trabalhar com data. Portando se eu tiver o campo declarado com datetime (yyyy-MM-dd hh:mm:ss) ou declarado como Text (yyyy-MM-dd) é praticamente o mesmo. Então vai ser melhor como Text, porque ele vai me aceitar o formato pretendido (yyyy-MM-dd). Correcto?

Obrigado

Share this post


Link to post
Share on other sites
bioshock

Certo. Tens sempre de converter para o formato adequado.

Eu já trabalhei com SQLite, mas não me lembro de não haver o formato data. Sempre que possas, utiliza os formatos adequados, com muita informação na base de dados, perdes facilmente desempenho ao utilizar um tipo de dados errado.

Mas sim, podes utilizar Texto.

Share this post


Link to post
Share on other sites
HQuintas

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
Enche("select linha,data,id from Lixo4")
End Sub

Private Sub But_Guardar_Click(sender As System.Object, e As System.EventArgs) Handles But_Guardar.Click
' Cria automaticamente o comando para permite actualizar a DataSet
Dim cb As New SQLiteCommandBuilder(da)
' Actualiza na DataSet, e por sua vez na tabela, as alterações efectuadas
da.Update(ds, "Tabela")
End Sub

End Class

Quando faço Enche("select * from Lixo4") tudo bem. Mas como faço para actualizar somente alguns campos da tabela (linha,data e id) ?

Share this post


Link to post
Share on other sites
HQuintas

Já agora como se faz isso?

(A solução que encontrei foi ocultar algumas colunas da datagridview)

Share this post


Link to post
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

×
×
  • 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.