Newsgroup: it.comp.lang.visual-basic
Titolo: Aiuto x alcune operazioni sul database.

Salve a tutto il N.G.
 
Premetto che non sono un esperto di V.B. .Net e chiedo cortesemente il 
vostro aiuto.
Ho un database Sql Compact 3.5 in cui inserisco i dati tramite la procedura 
seguente:
 
=================================
    ' Insert record
    Private Sub ins_rec(ByVal dato1, ByVal dato2)
        cmd = New SqlCeCommand("Insert Into nuovatabella(col1, col2) 
Values('" + dato1 + "', '" + dato2 + "')", con)
        If con.State = ConnectionState.Closed Then con.Open()
        cmd.ExecuteNonQuery()
        '
        Call ShowData() 'Rebinding to DataGridView and view result
    End Sub
=================================
 
e li visualizzo nella griglia dati tramite quest'altra:
 
=================================
    ' Shared variables
    Dim con As SqlCeConnection = New SqlCeConnection("Data 
Source=C:\Users\utente\Documents\prova3.sdf")
    Dim cmd As SqlCeCommand
    Dim myDA As SqlCeDataAdapter
    Dim myDataSet As DataSet
    '
    '
    'Binding database table to DataGridView
    Public Sub ShowData()
        cmd = New SqlCeCommand("Select * FROM nuovatabella", con)
        If con.State = ConnectionState.Closed Then con.Open()
        myDA = New SqlCeDataAdapter(cmd)
        myDataSet = New DataSet()
        myDA.Fill(myDataSet, "MyTable")
        DataGridView1.DataSource = myDataSet.Tables("MyTable").DefaultView
    End Sub
=================================
 
ma come faccio ad EDITARE il record selezionato nella griglia dati?
 
E, gentilmente, un'altra cosa: come posso CERCARE, con l'istruzione "Find", 
un particolare record, facendo in modo che, una volta trovato, il puntatore 
sia fermo su di esso nella griglia dati?
 
Scusate vivamente se son troppe domande, confido nella vostra esperienza e 
bontà d'animo.
 
Grazie a tutti.
 
Pippo.
 
 

 "Find",
 
 
Dim bs As New BindingSource
bs.Position = bs.Find("Codice", ValoreCodice)
 
dove bs è il bindingsource che sta fra la griglia e il datatable che mi 
fornisce i dati.
 
oppure esempio di codice
 
http://www.sourcehints.com/articles/how-to-search-for-a-value-in-datagridview.html
 
 
 

Grazie Vittorio, gentilissimo come sempre; provo e faccio sapere, ciao.
 
"vittorio" <a...@aworrrnder.pp> ha scritto nel messaggio 
news:52123291$0$1373$4faf...@reader1.news.tin.it...





 Saresti cosě cortese da spiegarmi come memorizzarli in quest'ultimo?
 
 
 per salvare i dati che hai nella datagridview devi invocare
il metodo Update del dataadapter. 
 
 

> Saresti cos� cortese da spiegarmi come memorizzarli in quest'ultimo?


 ma purtroppo non funziona:
 
 
intendevo usare il metodo update dell'oggetto dataadapter:
 
myDA.Update(myDataSet, "MyTable")
 
 

Scusami se non ho capito, non sono pratico di .Net (specialmente coi 
database).
Faccio sapere, ciao e immense grazie ancora.
 
"vittorio" <a...@aworrrnder.pp> ha scritto nel messaggio 
news:521366e0$0$1341$4faf...@reader2.news.tin.it...


Ti prego di non seccarti, Vittorio, ma purtroppo non ha funzionato.
 
Ho usato questo:
 
=================================
    ' Shared variables
    Dim con As SqlCeConnection = New SqlCeConnection("Data 
Source=C:\Users\utente\Documents\prova3.sdf")
    Dim cmd As SqlCeCommand
    Dim myDA As SqlCeDataAdapter
    Dim myDataSet As DataSet
 
    Dim txt1, txt2 As String
    '
    '
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As 
System.EventArgs) Handles Button1.Click
        Dim indice As Integer = DataGridView1.CurrentRow.Index '(oppure 
DataGridView.CurrentRow.Cells("ID").Value)
        '
        txt1 = DataGridView1(0, indice).Value.ToString '(0 indica la prima 
colonna della datagridview)
        txt2 = DataGridView1(1, indice).Value.ToString '(1 indica la seconda 
colonna della datagridview)
        MsgBox(txt1 + "  " + txt2)
        '
        DataGridView1(0, indice).Value = "Pippo"
        DataGridView1(1, indice).Value = "Pluto"
        '
        myDA.Update(myDataSet, "MyTable")
        '
    End Sub
=================================
 
I dati: "Pippo", "Pluto", sono visualizzati nella griglia dati, ma non 
vengono memorizzati nel database.
Credo che, al posto di "MyTable", nel metodo "Update", ci voglia "il 
contenuto della griglia dati", ma non s� se st� dicendo una sciocchezza.
Logicamente, i dati variati sono contenuti soltanto nella griglia e 
"MyTable", mi pare, sia semplicemente una tabella che viene utilizzata x 
visualizzarli.
Come si pu� aggiornare il database col contenuto della "DataGridView1"?
 
"vittorio" <a...@aworrrnder.pp> ha scritto nel messaggio 
news:521366e0$0$1341$4faf...@reader2.news.tin.it...


 visualizzarli.
 
no,� la tabella del database in cui vuoi salvarli,cio� quella che chiami 
"nuovatabella" nel tuo esempio.
 
E' la stessa tabella che hai riempito prima con l'istruzione FILL del 
datadapter.
 
Il metodo Update di DataAdapter viene chiamato per applicare le modifiche 
apportate a un DataSet nell'origine dati 
 
 

Ti ringrazio x le informazioni, ma non credi che al posto delle semplici 
assegnazioni:
 
=================================
        DataGridView1(0, indice).Value = "Pippo"
        DataGridView1(1, indice).Value = "Pluto"
=================================
 
ci debba andare un blocco:
 
=================================
       .BeginEdit()
        .....
        .....
       .EndEdit()
=================================
 
soltanto che non s� proprio come strutturarlo, ho guardato degli esempi, ma 
c'� sempre un errore, evidentemente sbaglio qualcosa, non sapresti tu come 
farlo correttamente?
 
"vittorio" <a...@aworrrnder.pp> ha scritto nel messaggio 
news:5213be69$0$1376$4faf...@reader1.news.tin.it...


 =================================
 
Tale blocco non l'ho mai visto usare per rendere persistenti i dati nel 
database.
la logica � questa :se tu popoli un DGV con un DATASET ( usando il metodo 
fill del dataadapter) ,poi fai una modifica nel DGV,tale modifica si 
trasmette al dataset; poi il metodo  dataadapter.update  trasmette  la 
modifica dal dataset al database sottostante.
 
Purtroppo non ho VS installato nel mio pc adesso e no posso fare prove.
 
 

Ok, grazie, per�, non s� perch�, a me non funziona.
Non voglio disturbarti ulteriormente, grazie ancora x le preziose 
informazioni, ciao.
 
Pippo.
 
"vittorio" <a...@aworrrnder.pp> ha scritto nel messaggio 
news:5214aa1a$0$1342$4faf...@reader2.news.tin.it...


 Ok, grazie, per�, non s� perch�, a me non funziona.
 
comunque ti manca  un oggetto,il SqlCeCommandBuilder :
 
Public Class Form1
 
    Dim myDA As sqlceDataAdapter
    Dim myDataSet As DataSet
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As 
System.EventArgs) Handles MyBase.Load
        Dim con As SqlCeConnection = New SqlCeConnection("data 
source=D:\Northwind.sdf")
        Dim cmd As SqlCeCommand = New SqlCeCommand("SELECT * FROM Products", 
con)
        con.Open()
        myDA = New SqlCeDataAdapter(cmd)
        'One CommandBuilder object is required, which automatically 
generates DeleteCommand,UpdateCommand and InsertCommand for DataAdapter 
object
        Dim builder As SqlCeCommandBuilder = New SqlCeCommandBuilder(myDA)
        myDataSet = New DataSet()
        myDA.Fill(myDataSet, "MyTable")
        DataGridView1.DataSource = myDataSet.Tables("MyTable").DefaultView
        con.Close()
        con = Nothing
    End Sub
 
    ' Save data back into database
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As 
System.EventArgs) Handles Button1.Click
        Me.Validate()
        Me.myDA.Update(Me.myDataSet.Tables("MyTable"))
        Me.myDataSet.AcceptChanges()
    End Sub
 
End Class 
 
 

Grazie!! Un aiuto inaspettato, fammi provare....
 
A presto, ciao.
 
"vittorio" <a...@aworrrnder.pp> ha scritto nel messaggio 
news:5214e0bc$0$1346$4faf...@reader2.news.tin.it...


Ciao Vittorio, ti prego di non prendertela, ma non ha funzionato neppure 
questo tentativo.
Comunque, devo dirti, che l'oggetto <builder>, che viene correttamente 
dichiarato, mi pare, non venga usato.
Temo ci sia con <edit> un altro enigma.
Il fatto � che il .Net lo dovevano fare molto pi� semplice!
 
"vittorio" <a...@aworrrnder.pp> ha scritto nel messaggio 
news:5214e0bc$0$1346$4faf...@reader2.news.tin.it...


 questo tentativo.
 
ricevi qualche errore durante l'esecuzione?
Le celle del DGV le modifichi via codice oppure a mano usando la tastiera? 
 
 

Nessun errore durante l'esecuzione.
Modifico i dati della griglia via codice.
 
"vittorio" <a...@aworrrnder.pp> ha scritto nel messaggio 
news:5216109a$0$1342$4faf...@reader2.news.tin.it...


 Nessun errore durante l'esecuzione.
 
posta tutto il codice che hai scritto 
 
 

Ecco cosa ho usato:
 
===========================
    Dim txt1, txt2 As String
    '
    Private Sub edit_rec()
        Dim indice As Integer = DataGridView1.CurrentRow.Index '(oppure 
DataGridView.CurrentRow.Cells("ID").Value)
        '
        txt1 = DataGridView1(0, indice).Value.ToString '(0 indica la prima 
colonna della datagridview)
        txt2 = DataGridView1(1, indice).Value.ToString '(1 indica la seconda 
colonna della datagridview)
        MsgBox(txt1 + "  " + txt2)
        '
        DataGridView1(0, indice).Value = "Pippo"
        DataGridView1(1, indice).Value = "Pluto"
        '
        Me.Validate()
        Me.myDA.Update(Me.myDataSet.Tables("MyTable"))
        Me.myDataSet.AcceptChanges()
        '
    End Sub
===========================
 
Ed anche se aggiungo questo di seguito, il risultato non cambia:
 
===========================
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As 
System.EventArgs) Handles MyBase.Load
        Dim con As SqlCeConnection = New SqlCeConnection("Data 
Source=C:\Users\utente\Documents\prova3.sdf")
        Dim cmd As SqlCeCommand = New SqlCeCommand("SELECT * FROM 
nuovatabella", con)
        con.Open()
        myDA = New SqlCeDataAdapter(cmd)
        ' One CommandBuilder object is required, which automatically 
generates DeleteCommand,UpdateCommand and InsertCommand for DataAdapter 
object
        Dim builder As SqlCeCommandBuilder = New SqlCeCommandBuilder(myDA)
        myDataSet = New DataSet()
        myDA.Fill(myDataSet, "MyTable")
        DataGridView1.DataSource = myDataSet.Tables("MyTable").DefaultView
        'con.Close()
        'con = Nothing
        '
    End Sub
===========================
 
Come puoi notare, l'oggetto <builder> dichiarato, non viene utilizzato.
Se non riesci a venirne a capo, non ti preoccupare, Vittorio, attender� 
tempi migliori.
 
"vittorio" <a...@aworrrnder.pp> ha scritto nel messaggio 
news:52167dce$0$1367$4faf...@reader1.news.tin.it...


 
Ho provato con Visual studio 2010 ,e ho fatto quindi creare a lui origine 
dati,dataset,tableadapter,bindingsource :attenzione che se usi Visual 
studio,il percorso del database SDF è diverso!!!!!!!
 
Questa procedura di esempio (io uso C# ,l'istruzione USING è 
facoltativa,serve per chiudere automaticamente la connessione) ,associata ad 
un pulsante,e funziona correttamente:
 
private void button1_Click(object sender, EventArgs e)
{?
using (SqlCeConnection con = new SqlCeConnection("DataSource=C:\\Documents 
and Settings\\vittorio\\Documenti\\Visual Studio 
2010\\Projects\\WindowsFormsApplication1\\WindowsFormsApplication1\\provaDGV.sdf"))
{
using (SqlCeCommand cmd = new SqlCeCommand())
{
var col1 = dataGridView1.Rows[0].Cells[0].Value.ToString();
var col2 = dataGridView1.Rows[0].Cells[1].Value.ToString();
cmd.CommandText = @"UPDATE miatabella SET col1 = @1,col2 = @2" ;
cmd.Parameters.Add("@1", col1);
cmd.Parameters.Add("@2", col2);
con.Open();
cmd.Connection = con;
cmd.ExecuteNonQuery();
}
}
}
?
}
} 
 
 

Grazie ancora, Vittorio, x l'impegno e la perseveranza, proverò anche questa 
soluzione e ti farò sapere.
Sei davvero gentilissimo, a presto, ciao.
 
"vittorio" <a...@aworrrnder.pp> ha scritto nel messaggio 
news:521dbfa8$0$1370$4faf...@reader1.news.tin.it...


 questa
 
Ho anche rifatto l'esempio,per supportare modifiche generali,perchè 
ovviamente non modifichi sempre solo la prima riga del grid;
l'esempio crea la form,il grid e due pulsanti interamente da codice,li 
posiziona,poi crea gli eventi e la procedura Getdata:
 
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlServerCe;
namespace pro
{
         public partial class Form1 : Form
{
private BindingSource bindingSource1 = new BindingSource();
private SqlCeDataAdapter dataAdapter = new SqlCeDataAdapter();
private Button reloadButton = new Button();
private Button submitButton = new Button();
private DataGridView dataGridView1 = new DataGridView();
 
 
public Form1()
{
dataGridView1.Dock = DockStyle.Fill;
reloadButton.Text = "reload";
submitButton.Text = "submit";
reloadButton.Click += new System.EventHandler(reloadButton_Click);
submitButton.Click += new System.EventHandler(submitButton_Click);
FlowLayoutPanel panel = new FlowLayoutPanel();
panel.Dock = DockStyle.Top;
panel.AutoSize = true;
panel.Controls.AddRange(new Control[] { reloadButton, submitButton });
this.Controls.AddRange(new Control[] { dataGridView1, panel });
this.Load += new System.EventHandler(Form1_Load);
this.Text = "Database";
}
private void Form1_Load(object sender, System.EventArgs e)
{
     dataGridView1.DataSource = bindingSource1;
     GetData("select col1,col2  from  miatabella");
}
private void reloadButton_Click(object sender, System.EventArgs e)
{
// Reload the data from the database.
      GetData(dataAdapter.SelectCommand.CommandText);
}
private void submitButton_Click(object sender, System.EventArgs e)
{
  // Update the database with the user's changes.
      dataAdapter.Update((DataTable)bindingSource1.DataSource);
}
private void GetData(string selectCommand)
{
 
String connectionString = "DataSource=C:\\Documents and 
Settings\\Enzo\\Documenti\\provaDGV.sdf";
 
dataAdapter = new  SqlCeDataAdapter(selectCommand, connectionString);
 
SqlCeCommandBuilder commandBuilder = new SqlCeCommandBuilder(dataAdapter);
 
DataTable table = new DataTable();
table.Locale = System.Globalization.CultureInfo.InvariantCulture;
dataAdapter.Fill(table);
bindingSource1.DataSource = table;
 
dataGridView1.AutoResizeColumns(
DataGridViewAutoSizeColumnsMode.DisplayedCells);
 
}
}
?
} 
 
 

Ti ringrazio sempre, Vittorio, x l'impegno ch'è veramente ammirevole ma, 
ripeto, non essendo pratico come te, se non mi dai un esempio un po' chiaro 
in V.B. che tu abbia provato, credo non potrò riuscire.
 
"vittorio" <a...@aworrrnder.pp> ha scritto nel messaggio 
news:521e5900$0$1380$4faf...@reader1.news.tin.it...


 chiaro in V.B. che tu abbia provato, credo non potrò riuscire.
 
con il convertitore C# ----> 
VB.NET
  diventa:
 
 
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Data
Imports System.Drawing
Imports System.Linq
Imports System.Text
Imports System.Windows.Forms
Imports System.Data.SqlServerCe
 
Namespace pro
 
 
 Public Partial Class Form1
  Inherits System.Windows.Forms.Form
  Private bindingSource1 As New BindingSource()
  Private dataAdapter As New SqlCeDataAdapter()
  Private reloadButton As New Button()
  Private submitButton As New Button()
  Private dataGridView1 As New DataGridView()
 
 
  '[STAThreadAttribute()]
  'public static void Main()
  '{
  '    Application.Run(new Form1());
  '}
 
  ' Initialize the form.
  Public Sub New()
   dataGridView1.Dock = DockStyle.Fill
 
   reloadButton.Text = "reload"
   submitButton.Text = "submit"
   reloadButton.Click += New System.EventHandler(AddressOf 
reloadButton_Click)
   submitButton.Click += New System.EventHandler(AddressOf 
submitButton_Click)
 
   Dim panel As New FlowLayoutPanel()
   panel.Dock = DockStyle.Bottom
   panel.AutoSize = True
   panel.Controls.AddRange(New Control() {reloadButton, submitButton})
 
   Me.Controls.AddRange(New Control() {dataGridView1, panel})
   Me.Load += New System.EventHandler(AddressOf Form1_Load)
   Me.Text = "Database"
  End Sub
 
  Private Sub Form1_Load(sender As Object, e As System.EventArgs)
   ' Bind the DataGridView to the BindingSource
   ' and load the data from the database.
   dataGridView1.DataSource = bindingSource1
   GetData("select col1,col2  from miatabella")
  End Sub
 
  Private Sub reloadButton_Click(sender As Object, e As System.EventArgs)
   ' Reload the data from the database.
   GetData(dataAdapter.SelectCommand.CommandText)
  End Sub
 
  Private Sub submitButton_Click(sender As Object, e As System.EventArgs)
   ' Update the database with the user's changes.
   dataAdapter.Update(DirectCast(bindingSource1.DataSource, DataTable))
  End Sub
 
  Private Sub GetData(selectCommand As String)
   Try
    ' Specify a connection string. Replace the given value with a
    ' valid connection string for a Northwind SQL Server sample
    ' database accessible to your system.
 
    Dim connectionString As [String] = "DataSource=C:\Documents and 
Settings\Enzo\Documenti\provaDGV.sdf"
 
    ' Create a new data adapter based on the specified query.
    dataAdapter = New SqlCeDataAdapter(selectCommand, connectionString)
 
    ' Create a command builder to generate SQL update, insert, and
    ' delete commands based on selectCommand. These are used to
    ' update the database.
    Dim commandBuilder As New SqlCeCommandBuilder(dataAdapter)
 
    ' Populate a new data table and bind it to the BindingSource.
    Dim table As New DataTable()
    table.Locale = System.Globalization.CultureInfo.InvariantCulture
    dataAdapter.Fill(table)
    bindingSource1.DataSource = table
 
    ' Resize the DataGridView columns to fit the newly loaded content.
    dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.DisplayedCells)
   Catch generatedExceptionName As SqlCeException
    MessageBox.Show("ciao")
   End Try
  End Sub
 
 End Class
 
 
End Namespace
 
'=======================================================
'Service provided by Telerik (
www.telerik.com
)
'Conversion powered by NRefactory.
'Twitter: @telerik
'Facebook: 
facebook.com/telerik
 
'=======================================================
 
 

> chiaro in V.B. che tu abbia provato, credo non potr� riuscire.


 conoscenza di .Net, ma non ho capito ancora come editare un record.
 
lo editi digitando da tastiera nelle celle,come farebbe l'utente.
Del resto con il datagridview puoi anche eliminare righe o aggiungerle.
Le tre operazioni le gestisce il software automaticamente. 
 
 

Ti ringrazio del suggerimento ma, x quello che devo fare, purtroppo, mi 
serve poterlo gestire direttamente da codice.
 
"vittorio" <a...@aworrrnder.pp> ha scritto nel messaggio 
news:521fa577$0$1374$4faf...@reader1.news.tin.it...
