Aggiornamento Database co table adapter

venerdì 17 ottobre 2008 - 10.32

corsaronero Profilo | Newbie

Questo comando dovrebbe aggiornare il database ma non lo fa perche??


clientiTableAdapter.Insert(nome.Text, cognome.Text, indirizzo.Text, citta.Text, provincia.Text, email.Text, "", "", "", dataTimeInizio, dataTimeFine, comboBoxAbbonamento.Text);
this.clientiTableAdapter.Fill(this.datiPalestra.Clienti);

Teech Profilo | Expert

DataAdapert.Fill(oggetto) riempie l'oggetto con i dati del database secondo la SelectCommand del DataAdapter ma non aggiorna il database
DataAdapter.Update(oggetto) invece effettua l'aggiornamento dei dati del database secondo l'InsertCommand, UdateCommand e DeleteCommand del DataAdapter e riaggiorna l'oggetto.
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

corsaronero Profilo | Newbie

Ti mostro il codice che ho ho fatto l'update solo che nn mi fa mi potresti aiutare e vedere cosa sbaglio grazie:



private void buttonNuovo_Click(object sender, EventArgs e)
{
string dataTimeInizio = Convert.ToString(dateInizio.Text);
string dataTimeFine = Convert.ToString(dateFine.Text);
//MessageBox.Show(dataTimeInizio);
try
{


int ritorno = clientiTableAdapter.Insert(nome.Text, cognome.Text, indirizzo.Text, citta.Text, provincia.Text, email.Text, "", "", "", dataTimeInizio, dataTimeFine, comboBoxAbbonamento.Text) ;
clientiTableAdapter.Update(database1DataSet.Clienti);

// datiPalestra.AcceptChanges();
this.clientiTableAdapter.Fill(this.database1DataSet.Clienti);



this.Validate();
this.clientiBindingSource.EndEdit();

MessageBox.Show("Update successful");
}
catch (System.Exception ex)
{
MessageBox.Show("Update failed");
}


}

Teech Profilo | Expert

Come dicevo prima, sostituisci
this.clientiTableAdapter.Fill(this.database1DataSet.Clienti);
con
this.clientiTableAdapter.Update(this.database1DataSet.Clienti);


--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

corsaronero Profilo | Newbie

Ok lo faccio ma mi dice update succesful ma vado a vedere nel db e non è stata aggiunta nessuna riga

Teech Profilo | Expert

L'InsertCommand del TableAdapter è valorizzato?
Se non erro il TableAdapter deriva dal DataAdapter e quindi per verificare se è correttamente valorizzato l'InsertCommand basta controllare la proprietà in questo modo:
tuoTableAdapter.InsertCommand
Questo restituisce una stringa che puoi visualizzare come preferisci.
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

corsaronero Profilo | Newbie

Scusami ma clientiTableAdapter.Adapter.InsertCommand non restituisce una stringa ..
Comunque nn ho capito bene che devo fare ..

Teech Profilo | Expert

Finalmente ho VS davanti e riesco ad essere più preciso...
Nella finestra di progettazione del DataSet seleziona il tuo TableAdapter. Nella finestra delle proprietà cerca la voce InsertCommand. Premi sul + e controlla il contenuto della proprietà CommandText.
Questo è il comando (query di comando) che esegue quando richiami TableAdapter.Insert(...) e quindi puoi controllare se è correttamente inizializzato questo valore. Molto dipende da come hai creato il DataSet tipizzato, da come è fatta la tua base dati e dalla Select che popola il tuo datatable tipizzato.
Se il valore del CommandText della InsertCommand del tuo TableAdapter è vuoto significa che non esegue nessuna operazione di inserimento sul database e non restituisce errori in quanto la logica di inserimento non è stata implementata.
Pariteticamente controlla anche le UpdateCommand e DeleteCommand.

In ogni caso i TableAdapter non sono altro delle classi che derivano dai DataAdapter e .NET li crea per tipizzare le classi (se vai nel designer del Dataset tipizzato lo vedi subito) e quindi funzionano con la stessa logica.
Qui il "ramo" di MSDN che spiega i SqlDataAdapter (ma esistono anche gli OleDbDataAdapter se non usi SQL Server).
http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldataadapter.aspx



--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

corsaronero Profilo | Newbie

Intanto grazie per la spiegazione, comunque ero gia andato a fare questa prova e tutto funziona
questa è la insert command che quando mando in esecuzione la query da dataSet mi scrive i dati nel db perfettamente.

INSERT INTO Clienti
(nome, cognome, indirizzo, citta, provincia, email, telefono, cellulare, note, datainizio, datafine, abbonamento)
VALUES (@nome,@cognome,@indirizzo,@citta,@provincia,@email,@telefono,@cellulare,@note,@datainizio,@datafine,@abbonamento)

questa e la select che comunque funziona perche mi visualizza i dati nella gridView regolarmente

SELECT id, nome, cognome, indirizzo, citta, provincia, email, telefono, cellulare, note, datainizio, datafine, abbonamento
FROM Clienti


UPDATE Clienti
SET nome = @nome, cognome = @cognome, indirizzo = @indirizzo, citta = @citta, provincia = @provincia, email = @email, telefono = @telefono,
cellulare = @cellulare, note = @note, datainizio = @datainizio, datafine = @datafine, abbonamento = @abbonamento
WHERE (id = @Original_id) AND (@IsNull_nome = 1 AND nome IS NULL OR
nome = @Original_nome) AND (@IsNull_cognome = 1 AND cognome IS NULL OR
cognome = @Original_cognome) AND (@IsNull_indirizzo = 1 AND indirizzo IS NULL OR
indirizzo = @Original_indirizzo) AND (@IsNull_citta = 1 AND citta IS NULL OR
citta = @Original_citta) AND (@IsNull_provincia = 1 AND provincia IS NULL OR
provincia = @Original_provincia) AND (@IsNull_email = 1 AND email IS NULL OR
email = @Original_email) AND (@IsNull_telefono = 1 AND telefono IS NULL OR
telefono = @Original_telefono) AND (@IsNull_cellulare = 1 AND cellulare IS NULL OR
cellulare = @Original_cellulare) AND (@IsNull_datainizio = 1 AND datainizio IS NULL OR
datainizio = @Original_datainizio) AND (@IsNull_datafine = 1 AND datafine IS NULL OR
datafine = @Original_datafine)



Non so che fare!!!!!!!1

Teech Profilo | Expert

Mi vengono in mente solo 2 cose:
1. L'ID nella tabella è un Identity (o cintatore)? perchè altrimenti ho notato che nella INSERT non viene passato
2. Prova a non convertire i dati relativi a Inizio e fine: forse convertendoli a stringa risultano in un formato non riconosciuto dal database (prova strana ma tentar non nuoce)

Onestamente mi sembra strano e non trovo anomalie... Proverò a controllare meglio se noto qualcosa di strano
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

corsaronero Profilo | Newbie

si L'ID nella tabella è un Identity
Ho provato ha passargli delle stringhe "ccc" ma niente da fare
Booooooo!!

Teech Profilo | Expert

Il campo 'Abbonamento' della tabella clienti che tipo di dato è? E' una Foreign Key? Nel caso, tu gli stai passando il Text della ComboBox, ma non è che devi passargli il Value?

Altra prova: prova ad inserire nel DataTable associato al TableAdapter una DataRow e valorizzare i dati, fare la Update del Adapter e vedi se inserisce i dati...

Sto andando anch'io per tentativi non conoscendo la struttura del tuo DB e del tuo codice però 4 occhi sono meglio di 2

P.S.: Sono comunque perplesso del fatto che non ti venga restituita una eccezione... Non sono ferrato su questo argomento però, prova a farti restituire una sorta di risposta dal DB, così magari hai un'indicazione in più.
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

corsaronero Profilo | Newbie

Per la combobox e giusto passare .text ma non il value .
Poi ho provato ad aggiungere un row ma niente viene aggiunta al datagrid e quindi anche al dataset ma non al dataBase..... ma perche mi capitano sempre ste cose strane?

database1DataSet.Clienti.AddClientiRow("Nicola", "benni", "lupo", "cagli", "pu", "", "", "", "", "", "", "");


clientiTableAdapter.Update(this.database1DataSet.Clienti);

Teech Profilo | Expert

Ci siamo vicini, lo sento
Se provi ad eseguire un aggiornamento di un DataRow del DataTable e fare la Update dell'Adapter succede qualcosa sul DB?
Da come descrivi il problema sembra che qualcosa non funziona nel InsertCommand in quanto a livello DataSet tutto funziona ma a livello DB non viene raggiunto dai Command...

Prova ad usare un CommandBuilber per vedere se succede qualcosa
http://msdn.microsoft.com/it-it/library/tf579hcz(VS.80).aspx

Mi viene un dubbio: hai i permessi di scrittura sul DB con l'utente con il quale ti connetti? (Domanda forse stupida ma a volte sono le cose più banali a creare i problemi più grossi)
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

corsaronero Profilo | Newbie

Se faccio update succede qualcosa solo sul dataGrid che prende i dati dal dataSet ma non sul db quindi il prob e l'aggiornamento del db da parte del dataSet ..
Scusa ma non so cosa sia il Command Builder e il link che mi hai dato non mi visualizza nnt
Penso di avere i permessi perche se eseguo la insertCommand dallo shema del dataSet fa linserimento..

Teech Profilo | Expert

Per il CommandBuilder non cliccare sul link ma copia tutto fino ad '....aspx' compreso (viene riconosciuto male). Usando un CommandBuilder, se la tua SELECT recupera dati da una tabella con una chiave ti crea automaticamente i Command per la gestione del DB (si usa normalmente se istanzi un Adapter da codice).
Confronta poi i command creati con il CommandBuilder e quelli del TableAdapter per vedere se ci sono differenze...
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

corsaronero Profilo | Newbie

Ho provato cosi nn so se va bene .. comunque nn da nessun errore ma nemmeno nessun segno di vita


SqlConnection connection = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database1.mdf;Integrated Security=True;User Instance=True");

SqlDataAdapter adapter = new SqlDataAdapter(
"SELECT * FROM Clienti", connection);
SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
builder.QuotePrefix = "[";
builder.QuoteSuffix = "]";

DataSet custDS = new DataSet();

connection.Open();
adapter.Fill(custDS, "Clienti");

// Code to modify data in the DataSet here.
adapter.SelectCommand.CommandText =
"SELECT id, nome FROM Clienti";
builder.RefreshSchema();

custDS.Tables.Remove(custDS.Tables["Clienti"]);
adapter.Fill(custDS, "Clienti");
adapter.InsertCommand.CommandText =
"INSERT INTO Clienti(nome, cognome, indirizzo, citta, provincia, email, telefono, cellulare, note, datainizio, datafine, abbonamento)"+
"VALUES ('Alessio','Alessio','Alessio','Alessio','Alessio','Alessio','Alessio','Alessio','Alessio','','','')";
builder.RefreshSchema();

// Code to modify the new table in the DataSet here.

// Without the call to RefreshSchema, this line would fail.
adapter.Update(custDS, "Clienti");

// Without the SqlCommandBuilder, this line would fail.
adapter.Update(custDS, "Clienti");
connection.Close();



this.Validate();
this.clientiBindingSource.EndEdit();

MessageBox.Show("Update successful");




Poi ho provato ha fare un applicazione piu semplice per provare se funzionava ma niente
faccio tutti i passaggi creo il db poi mi crea il dataSet dove setto adapter in modo grafico schegliendo usa insert delet eccc....
poi creo il datagrid gli do la sorgente Client ma nn va

private void Form1_Load(object sender, EventArgs e)
{
// TODO: questa riga di codice carica i dati nella tabella 'database1DataSet.Clienti'. È possibile spostarla o rimuoverla se necessario.
this.clientiTableAdapter.Fill(this.database1DataSet.Clienti);

}

private void button1_Click(object sender, EventArgs e)
{
clientiTableAdapter.Insert(textBox1.Text, textBox2.Text);
clientiTableAdapter.Update(this.database1DataSet);
this.clientiTableAdapter.Fill(this.database1DataSet.Clienti);
}

Teech Profilo | Expert

Invece di questa sintassi per la connection
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
prova questa:
Server=.\SQLEXPRESS;Database=DataBase1; Trusted_Connection=yes;
Ricorda sempre che l'utente "Trusted" deve avere i permessi corretti sul DB.

--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

corsaronero Profilo | Newbie

Funziona cioe mi visualizza i dati come prima ma nessun inserimento db

Teech Profilo | Expert

Invece di usare una connessione trusted utilizza un utente di SQL (eventualmente 'sa'). In SQL deve esserci l'autenticazione mista. Onestamente mi sembra più un problema di permessi che di codice.
Usa questa connectionString:
Server=.\SQLExpress;Database=DataBase1; Uid=sa;Pwd=Password sa;
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

corsaronero Profilo | Newbie

Questo e quello che mi risponde

An attempt to attach an auto-named database for file C:\Documents and Settings\Alessio\Documenti\Visual Studio 2008\Projects\ProvaDB\ProvaDB\bin\Debug\Database1.mdf failed. A database with the same name exists, or specified file cannot be opened, or it is located on UNC share.

Teech Profilo | Expert

Guarda qua...
http://www.aspspider.com/resources/Resource170.aspx

Non so a cosa può riferirsi l'errore... Comunque sono sempre più convinto che sia un problema di permessi dell'utente con il quale effettui la connessione al database. Controlla che sia tutto corretto sotto quell'aspetto.
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

corsaronero Profilo | Newbie

Quando provo ad inserire una username o password mi dice Login failed for user ...... the user is not associated with a trusted SQL Server connection

Teech Profilo | Expert

Apri il Menagement Studio
Tasto destro sul server (cilindro giallo con freccia verde)
Seleziona Proprietà
Seleziona Protezione nell'elenco sulla sinistra
Clicca sul'option Autenticazione SQL e Windows
Salva

Apri la cartella Protezione
Espandi la voce Account
Seleziona l'utente sa e fai click con il tasto sinistro del mouse
Seleziona Propietà
Inserisci la password che desideri.
Salva

A questo punto hai attivato l'autenticazione mista per SQL e puoi connettersi con User=sa e Password che hai deciso.
Prova a collegarti dal tuo programma con una stringa di connessione così formata:
Server=tuoServerSQL;Database=NomeDataBase; Uid=sa;Pwd=tuaPassword;


--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

corsaronero Profilo | Newbie

Caro teech grazie per avermi seguito fino qui, comunque ci sono novita ho scoperto che se mi connetto al db che si trova nella cartella di debug avvengono le modifiche solo che quando crei il dataset con visual si collega direttamente con quello nella cartella prima booo
solo che quando imposto la nuova connessione e vado a fare il debug mi da questo errorre

An attempt to attach an auto-named database for file C:\Documents and Settings\Alessio\Documenti\Visual Studio 2008\Projects\ProvaDB\ProvaDB\bin\Debug\bin\Debug\Prova.mdf failed. A database with the same name exists, or specified file cannot be opened, or it is located on UNC share.

Teech Profilo | Expert

Questo conferma che il problema è la stringa di connessione
Guarda qua per le tecniche di connessione: http://www.connectionstrings.com/
Non conosco la tecnica di AttachDBFile e non conosco la situazione per la quale questa tecnica deve essere utilizzata e quindi non mi sento di consigliarti altre tecniche di connessione. Personalmente utilizzerei una connessione al DB più standard, come ti ho indicato in precedenza... Del resto ti auguro buono studio e buona fortuna
Ciao!!!
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5