29 messaggi dal 01 aprile 2008
Salve a tutti.
Spero sia la sezione giusta per questo genere di problema.
Sto utilizzando un commandbuilder creare un UpdateCommand da utilizzare poi per mezzo di un SqlDataAdapter su una datatable.
Purtroppo il CommandBuilder mi crea il commandText con la clausola di where su tutti i campi:

es. update tablename set f1 = @f1,f2 = @f2 where f1 = @Original_f1 and f2 = @Original_f2

In questo modo non mi modifica mai nulla perchè chiaramente avendo io modificato i valori non trova mai una corrispondenza.
Premetto che le DataRow sono state tutte settate come Modified

Avrei dunque bisogno che la where includesse solo la mia primarykey e non tutti i campi della tabella.
HO provato a crearmi il commandtext a mano e ad assegnarlo al DataAdapter ma purtroppo continua a non trovare corrispondenze da aggiornare:


da.UpdateCommand = cmb.GetUpdateCommand(true);
// reimposto il commandText con quello generato a mano ( ... where pk = @pk)
da.UpdateCommand.CommandText = GetUpdateCommandText(ds.Tables[tabella], keyname);
da.Update(ds.Tables[tabella]);

Qualcuno sa dirmi se sto sbagliando io qualcosa o se esiste un modo per aggirare il problema?
Grazie a tutti
percaso quando hai configurato il TableAdapter hai utilizzato il Wizard?

ciao marco

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx
29 messaggi dal 01 aprile 2008
No non ho usato il wizard. Ed è un SqlDataAdapter e non un TableAdapter.
il TableAdapter è stato un errore di battitura mio, posta il codice con cui lo crei

ciao marco

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx
29 messaggi dal 01 aprile 2008
mi sono creato un piccola tabella 'tabellaprova' con i campi chiave,campo1,campo2,campo3 dove chiave è la PK.

DataSet ds = new DataSet();
string query = "select * from TABELLAPROVA";
SqlCommand comm = new SqlCommand(query,conn);
SqlDataAdapter adapter = new SqlDataAdapter(comm);
SqlCommandBuilder builder = new SqlCommandBuilder(adapter);

adapter.Fill(ds, "TABELLAPROVA");

ds.Tables[0].Rows[0]["CAMPO1"] = "Pippo";
ds.Tables[0].Rows[0]["CAMPO2"] = "Pluto";
ds.Tables[0].Rows[0]["CAMPO3"] = "Paperino";

ds.Tables[0].Rows[0].AcceptChanges();
ds.Tables[0].Rows[0].SetModified();

adapter.UpdateCommand = builder.GetUpdateCommand(true);
adapter.Update(ds.Tables[0]);
ok ti avevo chiesto se avevi usato il wizard perche come ricordavo:


1) Include Only the Primary Key Columns
You can include only the primary columns in the SQL UPDATE and DELETE queries. This creates a "last in wins" updating scenario. Both update attempts will succeed. Obviously, the database is not going to maintain both sets of changes. The changes made by the last update will override the previous changes.

The "last in wins" scenario is not appropriate if you want to prevent users from unwittingly overwriting other users' changes.

The CommandBuilder object does not offer this optimistic concurrency option; the Visual Studio.Net Data Adapter Configuration Wizard does. On the Advanced Options tab, you would deselect the "Use Optimistic Concurrency" check box.


ciao marco

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx
29 messaggi dal 01 aprile 2008
Ok grazie, Purtrooppo nel mio caso non posso usare il wizard perchè devo crearmi i dataset in maniera generica. Ho risolto creandomi il command "a mano" ed eseguendo l'update riga per riga
che sicuramente così hai il controllo completo

ciao marco

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.