Jump to content

Recommended Posts

Posted (edited)

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
Posted

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"
Posted (edited)
 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
Posted

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.

Posted

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
Posted

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.

https://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.

Posted

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

Posted

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

Posted

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.

Posted
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) ?

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.