Inserimento Dati In Database Oledb

mercoledì 13 luglio 2005 - 09.07

Ikin Profilo | Newbie

Da poco ho cominciato a scrivere codice in VB.Net e non ho una buona conoscenza di programmazione.
Passiamo alla richiesta.
Vorrei salvare in un database, X es. Access2003 dei valori letti da uno strumento ed anche la data e l'ora in cui questi sono stati letti ricanata con la funzione Now.

Il problema che trovo è che non riesco a realizzare l'UPDATE mediante il dataadapter una volta che i valori sono presenti nel data adapter.

Il codice è il seguente:

Dim StrConn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\dbVIP.mdb;User Id=;Password=;"

Dim conn As New OleDbConnection(StrConn)

conn.Open()
Dim sql_Str As String = "SELECT * FROM Tabella"

Dim ds As New DataSet
Dim da As New OleDbDataAdapter(sql_Str, conn)

'verifica che la chiave primaria venga impostata correttamente
da.FillSchema(ds, SchemaType.Source, "LettureVIP")
'Popola il DataTable
da.Fill(ds)

'crea un oggetto CommandBuilder ausiliario x qsto DataAdapter
Dim cb As New OleDbCommandBuilder(da)

'lo usa x creare i tre oggetti XXXCommand
da.InsertCommand = cb.GetInsertCommand
da.DeleteCommand = cb.GetDeleteCommand
da.UpdateCommand = cb.GetUpdateCommand

'a qsto pto è possibile modificare il DataSet locale e inviare
'i record modificati al DataBase
'Aggiunge un nuovo record
Dim dr As DataRow = ds.Tables("NomeTabella").NewRow

dr("DataOra") = Now
dr("Valori")=val 'In qsto pto inserisco tutti i valori...

ds.Tables("NomeTabella").Rows.Add(dr)
Console.WriteLine(ds.Tables("NomeTabella").Rows.Count.ToString

'Try
da.Update(ds) '* ?!? *' qui NON realizza l'update al Database
'Catch ex As Exception
'MessageBox.Show(ex.Message)
'End Try

conn.Close()


Chiederei cortesemente che qualcuno mi possa dare qualche soluzione a proposito.

Grazie.

Ikin Profilo | Newbie

Mi ritorna:
ERRORE DI SINTASSI NELL' ISTRUZIONE INSERT INTO
quando tenta di eseguire l'UPDATE

Scusa se la domanda ti può sembrare banale, come faccio ad impostare il metodo AcceptChanges?

Cteniza Profilo | Guru

Ad occhio devi rivedere i punti in cui definisci il dataadapter.
L'ordine esatto secondo me è:

Dim StrConn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\dbVIP.mdb;User Id=;Password=;"
Dim conn As New OleDbConnection(StrConn)
Dim sql_Str As String = "SELECT * FROM Tabella"
Dim ds As New DataSet("Dati")
Dim da As New OleDbDataAdapter(sql_Str, conn)
'crea un oggetto CommandBuilder ausiliario x qsto DataAdapter
Dim cb As New OleDbCommandBuilder(da)

'verifica che la chiave primaria venga impostata correttamente
da.FillSchema(ds, SchemaType.Source, "LettureVIP")
'Popola il DataTable
da.Fill(ds)
'a qsto pto è possibile modificare il DataSet locale e inviare
'i record modificati al DataBase
'Aggiunge un nuovo record
Dim dr As DataRow = ds.Tables("NomeTabella").NewRow

dr("DataOra") = Now
dr("Valori")=val 'In qsto pto inserisco tutti i valori...

ds.Tables("NomeTabella").Rows.Add(dr)
Console.WriteLine(ds.Tables("NomeTabella").Rows.Count.ToString

'Try
da.Update(ds) '* ?!? *' qui NON realizza l'update al Database
'Catch ex As Exception
'MessageBox.Show(ex.Message)
'End Try

Come puoi vedere ho tolto tutti i getcommand; se usi la sintassi:
Dim cb As New OleDbCommandBuilder(da)
Ci pensa il commandbuilder a popolare i command senza bisogno che lo faccia tu.
Anche l'apertura e la chiusura della connessione lasciala al dataadapter


Cteniza Profilo | Guru

L'acceptchanges è automatico se fatto tramite il dataadapter quindi scriverlo non serve a niente (almeno in questo caso).
Acceptchanges lo usi quando NON VUOI che avvenga l'aggiornamento.


Ikin Profilo | Newbie

grazie x le risposte così celeri

Ho provato come mi ha consigliato CTENIZA.
Ho eliminato l'apertura e la chiusura di connessione e i tre oggetti command

Ora però mi crea una eccezione quando tenta di aggiungere la riga al DataSet dicendo:
LA RIGA APPARTIENE GIà A QUESTA TABELLA

Cteniza Profilo | Guru

>grazie x le risposte così celeri
>Ho provato come mi ha consigliato CTENIZA.
>Ho eliminato l'apertura e la chiusura di connessione e i tre
>oggetti command
>
>Ora però mi crea una eccezione quando tenta di aggiungere la
>riga al DataSet dicendo:
>LA RIGA APPARTIENE GIà A QUESTA TABELLA

Magari per la chiave primaria il valore che hai inserito esiste già e quindi va in errore.
Soluzione? metti una chiave che non esiste!




Ikin Profilo | Newbie

Grazie ancora x tutto

cosa vuol dire modificare la chiave primaria, ovvero metterne una che non esiste?


Cteniza Profilo | Guru

Devi prestare attenzione alla chiave primaria.
Non è possibile utilizzare l'update (dataadapter) per modificare righe che non sono identificate univocamente.
Quindi devi impostare sempre la chiave primaria.
La chiave primaria è un elemento che identifica e marca un record e lo rende "diverso" dagli altri records appartenenti alla medesima tabella.
Nel caso tu non abbia una chiave primaria "naturale" es: "id prodotto" nella tabella "prodotti" devi inventarti un campo ad incremento "automatico" di tipo (es: serial, sequence, identity, autonumber) e utilizzare quello come chiave primaria.
Nessuna tabella deve essere senza la chiave primaria.
La chiave primaria per definizione è unica.

Un piccolo appunto sull'esempio: "id prodotto" su tabella "prodotti" per alcuni utilizzare quel campo come chiave primaria è un errore (viola uno dei criteri della normalizzazione dei dati) perchè virtualmente io potrei prevedere di cambiare il codice prodotto.
La chiave primaria deve essere assegnata in inserimento e mai più cambiata.


Ikin Profilo | Newbie

Ciao CTENIZA

prova a vedere se ho capito.

Quello che mi stai dicendo riguardo alla chiave primaria...
è di modificarla nel database, oppure nel dataset?

Se devo farlo nel database ho provato ma non funziona e mi dà errore come prima che la riga esiste già

Cteniza Profilo | Guru

La chiave va impostata nel database, in mancanza di un database con chiavi (es excel) può essere impostata solo nel dataset.
Se non imposti la chiave primaria dopo la creazione del dataadapter generare "by codice" (a mano) tutti gli elementi che possono dare conflitti (updatecommand, deletecommand), per ciascuno di questi devi inoltre impostare tutti i parametri e la connessione


Ikin Profilo | Newbie

ho modificato il database di ACCESS inserendo un nuovo elemento cnt come CONTATORE e l'ho impostato come chiave primaria, al posto di "DataOra" che era precedentemente impostato come chiave primaria.

Ma il problema persiste.
Continua a segnalarmi che la riga è già esistente e non mi aggiunge questa al dataset.

Cteniza Profilo | Guru

Non se ne esce.
Fai uno zip con il database (solo la tabella interessata con i dati) e il tuo programma (il sorgente .vb non l'eseguibile!) che va in errore e mettilo come allegato.


Ikin Profilo | Newbie

Il programma rileva le letture elettriche di alcuni strumenti (VIP) e le elabora per poi memorizzarle in un db e visualizzarle in un grafico

La memorizzazione nel db si trova nella region MSCOMM indicata con Aggiungi nel database

Grazie x tutto

Cteniza Profilo | Guru

Hai strutturato la tua tabella con chiave principale = data.
Vuoi dire che ad una certa data non puoi inserire due movimenti.
Oppure devi verificare che nel tuo campo data ci finisca anche l'ora.
Apri il programma con il debugger e verifica cosa scrivi dentro il dataset.
Un'altra cosa che ho visto è che hai scritto relè.
Dovrebbe essere relais (in francese scritto come lo si pronuncia), relè non esiste neanche nel vocabolario italiano.
A parte la battuta, nei nomi dei campi evita di utilizzare caratteri nazionali come quelli accentati, in alcuni database sono addirittura vietati, negli altri casi ti costringono a inserire le parentesi quadrate o le virgolette sul nome del campo (cosa molto fastidiosa).
Se ancora non funziona, fai un set ridotto (tabella con un campo solo, la data) e prova ad alimentare quella.
Poi, se funziona prova in combinazione con gli altri campi, se non funziona allora ti consiglio di rendere più chiari gli altri campi magari inizializzandone il valore.



Ikin Profilo | Newbie

continua a darmi l'errore di sintassi quando tenta l'UPDATE

Come faccio a venirmene fuori????????!!!!!!!!!!!!!!

Cteniza Profilo | Guru

Ti ho già risposto:
- fai una tabella ridotta con solo il campo chiave.
- prova a inserire dei dati scrivendo un programmino "essenziale" (apertura, dataset, newrow, add update)
- se funziona sei ok, se non funziona hai un problema di chiavi duplicate la cui soluzione sta nel trovare un altro elemento (un altro campo) da utilizzare come campo chiave o da aggiungere nell'indice per renderlo univoco.
- quando funziona riporta le correzioni nel programma "ufficiale" ed inizia ad alimentare il dataset con gli altri campi
- se non funziona riduci i campi ammetti il valore null nei campi (non nella chiave) e prova il tuo programma senza uno o più campi (commentando le istruzioni)
- guarda con il debugger cosa scrive

Un appunto, quando non funziona qualche cosa e hai il dubbio che ci potrebbero essere molteplici problemi (il tuo sorgente è alquanto incasinato).
Cominica a rendere modulare il tuo programma, se usi un oggetto di terze parti o un oggetto che ti costringe a scrivere molto codice, costruisci intorno a questo una classe con metodi e proprietà.
Classe che puoi provare 1, 10 1000 volte finchè non funziona e solo dopo (quando sai che funziona) puoi passare ad affrontare altri problemi mantenendo nel tuo form solo la gestione dei nuovi oggetti con poche istruzioni più facilmente controllabili.
Quello invece che hai fatto tu è inglobare in una unica form tutto facendo un miscuglio che rende difficile se non impossibile risalire alla causa degli errori.





Ikin Profilo | Newbie

Scusa se ti stresso ancora

cosa intendi col suggerimento.

Cominica a rendere modulare il tuo programma, se usi un oggetto di terze parti o un oggetto che ti costringe a scrivere molto codice, costruisci intorno a questo una classe con metodi e proprietà.
Classe che puoi provare 1, 10 1000 volte finchè non funziona e solo dopo (quando sai che funziona) puoi passare ad affrontare altri problemi mantenendo nel tuo form solo la gestione dei nuovi oggetti con poche istruzioni più facilmente controllabili.

Potresti farmi un esempio banale

Ikin Profilo | Newbie

Ciao a tutti!!!!

Alla fine, dopo ore e ore perse, ho scoperto qual'era il problema.

Non èil codice, ma il Database, il quale contiene parecchi campi il cui nome probabilmente creava qualche conflitto.
Li ho rinominati (molto più semplici) e il progr sembra funzionare correttamente.

Grazie x tutto.

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-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5