Aggiornamento multiplo di record da datagridview.

sabato 16 gennaio 2010 - 16.48

Geronimo79 Profilo | Junior Member

Salve a tutti....non riesco a fare un aggiornamento multiplo di alcuni record. mi spiego meglio.
Ho un "datagridview",che ha 2 colonne ID e POSIZIONE, dopo una specifica query mi restituisce una serie di record (circa 1200)....a questo punto vorrei aggiornare il campo POSIZIONE (impostarlo per esempio a "MILANO")per ogni record presente nel "datagridview", ovviamente ogni record ha un "ID" diverso in quanto il campo è impostato come chiave primaria....ho provato con un FOR EACH ma senza successo, non ho idea di come fare.....Uso vb.net e sql server 2005 express... Ringrazio quanti sapranno aiutarmi.Grazie e un saluto.

Jeremy Profilo | Guru

Ciao Mark.
Puoi mostrare un pò di codice?

Facci sapere...
Ciao

Geronimo79 Profilo | Junior Member

Dim Item As System.Windows.Forms.DataGridViewRow
For Each Item In DataGridView1.Rows
Dim strCn As String = "Data Source=.\SQLExpress;Integrated Security=true;AttachDbFilename=|DataDirectory|\database.mdf;User Instance=true"
Dim cn As New SqlConnection(strCn)
Dim cmd As New SqlCommand('update dei record da fare')
cn.Open()
cmd.ExecuteNonQuery()
cn.Close()
Next Item


LA TABELLA E' COSI' COMPOSTA =MATERIALE (ID,POSIZIONE,EFFICIENTE)

Creo una query che mi restituisce il materiale che è efficiente (WHERE EFFICIENTE='SI') ottengo 1200 record dalla GRIDVIEW ed a questo punto mi occorre la query multi aggiornamento..... Grazie per l'interessamento.

Jeremy Profilo | Guru

Ciao.
Per darti un'indicazione più mirata, dovrei vedere anche il codice che usi per popolare la DataGridView ....
Quello che è sicuro è che il codice che hai mostrato va cancellato e riscritto da capo ... ma come ti ho già detto dovrei vedere anche il resto del codice(o quanto meno capire gli oggetti che utilizzi) per darti indicazioni più mirate.

Facci sapere...
Ciao

Geronimo79 Profilo | Junior Member

la datagrid è bindata.....

Jeremy Profilo | Guru

Che c'entra!.
Sarà bindata ad un origine dati ... NO?!? di che tipo?
Forse intendi dire che hai usato il Wizard di VisualStudio?
Scusa la mia ignoranza ... prova a spiegarmi meglio.

Facci sapere...
Ciao

Geronimo79 Profilo | Junior Member

Jeremy.....premetto che sono un principiante della programmazione....
non riesco a capire cosa intendi per "dovrei vedere anche il codice che usi per popolare la DataGridView"....Si praticamente faccio il binding della Gridview con il wizard di Visual Studio......seleziono "database" come origine dati e seleziono "File di database Microsoft SQL Server (SqlClient)", finisco tutta la procedura e mi viene creato un "dataset" e un "tableadapter"..... Spero di aver chiarito un pò meglio l'idea....Grazie per l'impegno cmq....

Jeremy Profilo | Guru

Mark ... adesso è chiaro!
Dovresti essere un pò meno criptico nelle informazioni che fornisci ... purtroppo, non conoscendosi, non si può sapere a priori il livello di conoscenza di tutti gli utenti del forum.
Il Wizard di VisualStudio, dietro le quinte, crea un DataSet che non è niente altro che un contenitore dei dati presente nel Db ma disconesso da quest'ultimo.
E' su questo contenitore che devi lavorare.
Sempre dietro le quinte, VisualStudio crea un oggetto DataAdapter che possiamo definire "un'automazione delle operazioni di select,update etc ...."
Pertanto dovrai, eseguire il tuo ciclo For..Each per aggiornare i dati iterando le riche della DataTable presente nel Dataset e, successivamente, fare l'Update del Dataset UNA VOLTA SOLA con l'aiuto del dataAdapter.
Attenzione però che(se non mi confondo con l'udo del CommandBuilder) la tabella deve avere un campo chiave primaria, altrimenti, durante le operazioni di Update e Delete, ti viene restituita un'eccezione in quanto il DataAdapter non è in grado di creare le query adatte.
Venendo al codice:
For Each row As DataRow In TuoDataSet.Tables("NomeTabella").Rows row.Item("NomeDelCampoDaAggiornare") = "NuovoValore" Next TuoDataAdapter.Update(TuoDataSet)
Ovviamente, dovrai un pò adattare il codice allo scenario della tua applicazione.... ad ogni modo il concetto è questo.
Questa soluzione, ti è stata data perchè non mi va di mettere troppa carne sul fuoco, ma ritengo che sia un peccato non sfruttare la forte tipizzazione del DataSet, ma forse è un pò presto per parlare anche di questo.

Rimango comunque a disposizione per ulteirori info a riguardo.

Facci sapere...
Ciao

Geronimo79 Profilo | Junior Member

Siiiiiiiiiiiii......perfetto JEREMY............

Funziona a dovere.......ok......

Grazie davvero di cuore.....sei un grande.....

Un grande saluto....sicuramente avrò ancora bisogno di un esperto come te......(spero di non farti impazzire però.... )

A presto...

MARK

actarus1970 Profilo | Newbie

ciao a tutti sono nuovo del forum e ho anche io un problemino tra datagridview e db negli aggiornamenti con record multipli
il db si chiama database1.mdf
la tabella impiegati a cui mi connetto ha tre campi ; NOME COGNOME INDIRIZZO
fino a quando aggiorno talle txtbox, tutto ok con il seguente codice;


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim objconn As SqlConnection = New SqlConnection("server=(localhost); Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Documents and Settings\CARLO\Documenti\Visual Studio 2010\Projects\WindowsApplication1\WindowsApplication1\Database1.mdf;Integrated Security=True;User Instance=True;")
Dim objcom As SqlCommand = New SqlCommand()
objcom.Connection = objconn

objcom.CommandText = " INSERT INTO IMPIEGATI" & "(NOME, COGNOME, INDIRIZZO)" & " VALUES (@NOME,@COGNOME,@INDIRIZZO)"
objcom.Parameters.AddWithValue("@NOME", TextBox1.Text)
objcom.Parameters.AddWithValue("@COGNOME", TextBox2.Text)
objcom.Parameters.AddWithValue("@INDIRIZZO", TextBox3.Text)
objconn.Open()
objcom.ExecuteNonQuery()
objconn.Close()
objconn.Open()

ma se uso la dgv per lavorare con record multipli erroriiiiiiiiiiiiiiiiiiii

mi puoi postare il codice completo, sembra un caso analogo.
a presto

Geronimo79 Profilo | Junior Member

Ciao, e benvenuto... :-)

Una volta popolato il datagridview dovresti procedere così:

Dim dv As DataView = DirectCast(IMPIEGATIBindingSource.List, DataView)
For Each row As DataRowView In dv
row("NOME") = "MARCO"
Next
IMPIEGATIBindingSource.EndEdit()
IMPIEGATITableAdapter.Update(Me.DataSet1.IMPIEGATI)

Fammi sapere.....Ciao a presto.

actarus1970 Profilo | Newbie

la dgv non è bindata
ci scrivo su io

Geronimo79 Profilo | Junior Member

Prova così....spero che vada bene...

Dim con as New SqlConnection("stringaconnessione")
Dim sqlDa As New SqlDataAdapter("select * from impiegati", con)
Dim dSet As New DataSet()
Dim upCmd As New SqlCommand("update IMPIEGATI set Nome=@Nome, cognome=@cognome, indirizzo=@indirizzo, where id=@id", con) (presumo che hai un id chiave primaria)
upCmd.Parameters.Add("@Nome", SqlDbType.varchar, 10, "Nome")
upCmd.Parameters.Add("@cognome", SqlDbType.varchar, 10, "cognome")
upCmd.Parameters.Add("@indirizzo", SqlDbType.varchar, 10, "indirizzo")
sqlDa.UpdateCommand = upCmd
sqlDa.Update(dSet, "impiegati")

N.b. verifica e inserisci il tipo di dati corretto dei relativi campi, ho inserito solo come esempio (SqlDbType.varchar, 10)


actarus1970 Profilo | Newbie

ci sto lavorando ma mi sa che non va .....

actarus1970 Profilo | Newbie

GRAZIE PER L'AIUTO MA (OOPS CAPSLOCK) è lo stesso errore di sempre dovuto alla riga


sqlDa.Update(dSet, "OPERAI")

ERRORE :Update non è in grado di trovare TableMapping['OPERAI'] o DataTable 'OPERAI'.

Geronimo79 Profilo | Junior Member

C'è un pò di confusione.......devi fare una INSERT direttamente dal datagridview al db oppure un UPDATE????

Segui questi passi e adatta il codice a ciò che devi fare....

CONNESSIONE AL DATABASE
Dim con = New SqlConnection("Data Source=mysource;Initial Catalog=mydbname;uid=sa")
'create sql adapter for the "emp" table
Dim sqlDa As New SqlDataAdapter("select * from emp", con)
'create dataset instance
Dim dSet As New DataSet()
'fill the dataset
sqlDa.Fill(dSet, "emp")
'bind the data grid with the data set
dataGrid1.DataSource = dSet.Tables("emp")

COMANDO SELECT
Dim selCmd As New SqlCommand("select * from emp", con)
sqlDa.SelectCommand = selCmd

COMANDO INSERT
Dim insCmd As New SqlCommand("insert into emp (Name, Age) values(@Name, @Age)", con)
insCmd.Parameters.Add("@Name", SqlDbType.NChar, 10, "Name")
insCmd.Parameters.Add("@Age", SqlDbType.Int, 4, "Age")
sqlDa.InsertCommand = insCmd

COMANDO UPDATE
Dim upCmd As New SqlCommand("update emp set Name=@Name, Age=@Age where No=@No", con)
upCmd.Parameters.Add("@Name", SqlDbType.NChar, 10, "Name")
upCmd.Parameters.Add("@Age", SqlDbType.Int, 4, "Age")
upCmd.Parameters.Add("@No", SqlDbType.Int, 4, "No")
sqlDa.UpdateCommand = upCmd

COMANDO DELETE
Dim delCmd As New SqlCommand("delete from emp where No=@No", con)
delCmd.Parameters.Add("@No", SqlDbType.Int, 4, "No")
sqlDa.DeleteCommand = delCmd

AGGIORNAMENTO DATA ADAPTER CON IL DATASET
sqlDa.Update(dSet, "emp")

A presto....tienimi aggiornato così cerchiamo di risolvere insieme.... :-)

actarus1970 Profilo | Newbie

ALLORA
innanzitutto grazie per il supporto ma sai bene che quando si entra nella spirale errore è un casino.
sembrerebbe impostato bene ma il risultato è incredibile.
sto lavorando sul com insert e cosa fa?
anziche' aggiornare ds crea altrettante colonne di ugual nome nel dgv a destra delle originali.

prima dell'insert

444x217 9Kb

dopo l'insert

725x217 16Kb

mah sara' il caldo
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5