vastri Posted May 30, 2014 at 12:22 PM Report #557670 Posted May 30, 2014 at 12:22 PM Olá Estou com um problema, estou a adicionar dados na bd com instruções sql e não consigo atualizar o Dataset. Código: Dim Dado1 As String = "dado1" Dim Dado2 As String = "dado2" Dim strInsert As String = "INSERT INTO Tabela (Campo1, Campo2) VALUES ('" & Dado1 & "', '" & Dado2 & "')" Dim Conn As New SqlConnection(ConnectionString) Dim Command As New SqlCommand(strInsert, Conn) Conn.Open() command.ExecuteNonQuery() Conn.Close() Conn = Nothing Command = Nothing Até aqui tudo bem, acontece que tenho os dados a serem apresentados numa DataGridView e queria que ao adicionar estes aparecessem de imediato na grid o que não estou a conseguir sem fazer o fill completo do DataAdapter, o que não parece muito logico por um registo ir carregar tudo novamente!!! Já fiz o Insert ou Update com o método Dataset » TableAdapter e assim o Dataset automaticamente atualiza e o novo dado aparece na grid, mas queria usar instruções SQL em vez do wizard do VS.
bioshock Posted May 30, 2014 at 02:49 PM Report #557684 Posted May 30, 2014 at 02:49 PM DataGridView1.Rows.Add(New String(){valor_coluna_1, valor_coluna_2, valor_coluna_3})
vastri Posted June 1, 2014 at 03:20 PM Author Report #557813 Posted June 1, 2014 at 03:20 PM solução simples e inteligente.... só que fico sem o ID dos novos registos, sem referência não posso mexer no registo editar etc...
bioshock Posted June 1, 2014 at 05:43 PM Report #557822 Posted June 1, 2014 at 05:43 PM http://stackoverflow.com/questions/9791156/return-last-id-identity-on-insert-row-vb-net-mysql
vastri Posted June 3, 2014 at 12:12 PM Author Report #558055 Posted June 3, 2014 at 12:12 PM O problema é o mesmo, estou em muitos forms a filtrar dados já no Dataset se os dados não estiverem lá não dá. Também o ExecuteNonQuery() não vai retornar o ID
vastri Posted June 12, 2014 at 07:00 PM Author Report #559180 Posted June 12, 2014 at 07:00 PM ...alguma outra solução?
RicardoCosta Posted August 20, 2014 at 10:39 AM Report #565155 Posted August 20, 2014 at 10:39 AM A solução está em fazeres em vez de um ExecuteNonQuery fazeres um ExecuteScalar. Quanto ao insert tens 2 hipoteses, ou no final da tua query acrecentas um ; e SELECT SCOPE_IDENTITY() ou crias uma storage procedure para o insert.
vastri Posted August 21, 2014 at 05:46 PM Author Report #565248 Posted August 21, 2014 at 05:46 PM obrigado RicardoCosta, não consegui resolver, o cenário é o seguinte, vamos supor uma tabela com milhões de registos já fiz o fill de um dataset e atribui a uma DatagridView a DataSource desse Dataset, portanto os dados estão a ser apresentados nessa DatagridView, existe aqui uma perda de performance assumida no carregamento de todos estes dados, só não queria repetir isto a cada INSERT, DELETE ou UPDATE e como não estou a conseguir colocar no Dataset o valor do INSERT (neste caso) tenho que fazer novo Fill ao Dataset, é este o problema. Já consegui através do SqlCommandBuilder ir buscar os dados inseridos e através do Select @@IDENTITY o valor do ID mas isto tudo para a adicionar o novo dado na DatagridView não ao Dataset, com todos os dados no Dataset (lado cliente) para fazer ex. pesquisas faz todo o sentido utilizar filtros ao Dataset em vez de ir à base de dados, mas como o dado na verdade não está no Dataset (considerando que não fiz novo Fill) não dá. Tudo isto se resume a conseguir atualizar o Dataset depois de cada INSERT, DELETE ou UPDATE sem necessidade de novo Fill, há no fórum uma serie de posts neste sentido todos eles sem resolução, deduzo que o procedimento está todo errado ou não haverá outra alternativa senão fazer o Fill. Estou a usar Query's não conhecendo muito bem sei que há vantagens nas Stored Procedures, mas queria tentar manter como está...
RicardoCosta Posted September 1, 2014 at 12:20 PM Report #565837 Posted September 1, 2014 at 12:20 PM Tu só tens de fazer umas pequenas alterações ao que tens para as coisas funcionarem. Nota, cada vez que adiciones, apages ou edites um dado terás de mexer na base de dados e no dataset. Para o INSERT por exemplo: Tens de alterar a tua query para "INSERT INTO Tabela (Campo1, Campo2) VALUES ('" & Dado1 & "', '" & Dado2 & "');SELECT SCOPE_IDENTITY()" e fazers um ExecuteScalar(funciona tal e qual como um ExecuteQuery, a unica diferença é que só retorna 1 unico valor). Depois de já retomares o id poderás então acrecentar ao teu dataset: http://www.codeproject.com/Questions/335579/Adding-rows-to-Dataset-in-asp-net Não te esqueças que tens de fazer um refresh a tua gridview para voltar a ler o dataset. Quanto ao apagar e editar, depois de apagares da tua base de dados deves procurar no teu dataset a linha afectada e apaga-la/edita-la. http://www.codeproject.com/Questions/247390/vb-net-finding-a-row-in-a-dataset-with-a-column-va Mais uma vez, não te esqueças que cada vez que fizeres uma alteração ao teu dataset o mesmo só será visivel na gridview se fizeres o refresh. Desta forma, não estarás sempre a fazer leituras a tua base de dados.
vastri Posted September 5, 2014 at 08:20 AM Author Report #566324 Posted September 5, 2014 at 08:20 AM RicardoCosta, muito obrigado é isto mesmo.... está o procedimento correto encontrado. Já meti tudo a funcionar desta forma e claro é outra coisa, ao invés de fill, fill, fill e mais fill, estou safo estava enrascado e sem solução, foi mesmo muito útil, abraço, obrigado 👍 1 Report
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