HQuintas Posted June 24, 2013 at 02:33 PM Report #514734 Posted June 24, 2013 at 02:33 PM (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 June 24, 2013 at 02:37 PM by HQuintas
bioshock Posted June 24, 2013 at 03:29 PM Report #514747 Posted June 24, 2013 at 03:29 PM 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"
HQuintas Posted June 24, 2013 at 03:45 PM Author Report #514751 Posted June 24, 2013 at 03:45 PM (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 June 24, 2013 at 03:46 PM by HQuintas
bioshock Posted June 24, 2013 at 05:54 PM Report #514798 Posted June 24, 2013 at 05:54 PM E todas as células ficam com esse formato antes de gravares? Experimenta colocar: "yyyy-MM-dd HH:mm:ss"
HQuintas Posted June 24, 2013 at 06:23 PM Author Report #514802 Posted June 24, 2013 at 06:23 PM Só a coluna data. Experimentei "yyyy-MM-dd HH:mm:ss" mas continua a dar o mesmo erro.
bioshock Posted June 24, 2013 at 06:31 PM Report #514805 Posted June 24, 2013 at 06:31 PM 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.
HQuintas Posted June 24, 2013 at 09:13 PM Author Report #514835 Posted June 24, 2013 at 09:13 PM 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
bioshock Posted June 24, 2013 at 10:07 PM Report #514844 Posted June 24, 2013 at 10:07 PM 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.
HQuintas Posted June 25, 2013 at 06:50 AM Author Report #514870 Posted June 25, 2013 at 06:50 AM 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
bioshock Posted June 25, 2013 at 09:36 AM Report #514915 Posted June 25, 2013 at 09:36 AM 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
HQuintas Posted June 26, 2013 at 03:14 PM Author Report #515331 Posted June 26, 2013 at 03:14 PM 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
bioshock Posted June 26, 2013 at 04:33 PM Report #515369 Posted June 26, 2013 at 04:33 PM 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.
HQuintas Posted July 1, 2013 at 03:53 PM Author Report #516575 Posted July 1, 2013 at 03:53 PM 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) ?
bioshock Posted July 2, 2013 at 09:40 AM Report #516699 Posted July 2, 2013 at 09:40 AM Crias um método de UPDATE query.
HQuintas Posted July 2, 2013 at 11:21 AM Author Report #516740 Posted July 2, 2013 at 11:21 AM Já agora como se faz isso? (A solução que encontrei foi ocultar algumas colunas da datagridview)
bioshock Posted July 2, 2013 at 04:22 PM Report #516811 Posted July 2, 2013 at 04:22 PM https://wiki.portugal-a-programar.pt/dev_net/vb.net/access/
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