[VS2005] Inserimento dati in Database Access

giovedì 03 luglio 2008 - 11.40

gdlcore Profilo | Junior Member

Ciao a tutti ho questo problema:
ho completato un form di inserimento dati Anagrafici con le varie TextBox.
Ora il mio problema è quello di prendere i valori delle textbox e inserirli in una tabella del mio Database.
La tabella si chiama Anagrafica e ha i vari campi: Ragione Sociale,Indirizzo ecc..
Io non mi ricordo le varie istruzioni per collegarmi ed interagire con il database ( lettura, scrittura) .
So che dovrei usare l'INSERT INTO e così via.. ma non so la sintassi..
Attendo vostro aiuto.. grazie a tutti!!

denis.basei Profilo | Senior Member

Devi innanzitutto aprire una connessione con il tuo database, eseguire una query di accodamento e poi chiudere la connessione, che tradotto in codice diventa:

dim sConnString, sSQL as string

sConnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\yourdatabase.mdb"
' Ho ipotizzato che ci siano due campi e che i nomi delle caselle di testo del form siano txtCodice e txtDescrizione.
' Codice è di tipo numerico e descrizione alfanumerico.
sSQL = "INSERT INTO Anagrafica (Codice, Descrizione) " & _
"VALUES (" & me.txtCodice.text & ", '" & me.txtDescrizione.text & "'))

Dim conn As New System.Data.OleDb.OleDbConnection(sConnString)
Dim cmd As New System.Data.OleDb.OleDbCommand(sSQL, conn)
conn.Open()
cmd.executenonquery(sSQL)
conn.close



Ciao

Denis B. - www.baseiengineering.com

DomA Profilo | Expert

puoi fare in questo modo:

'attivazione db'

Dim strProvider As String = "Provider = Microsoft.Jet.OLEDB.4.0;"
Dim NomePerc As String = CStr(Me.txtNomePerc.Text)
Dim strOrigine As String = "Data Source=" & NomePerc & "\dbNomi.mdb"
Dim strConnessione As String = strProvider & strOrigine
Dim queryString2 As String
dim NomeCliente as string = me.txtClienteNome.text
dim IndirizzoCliente as string = me.txtClienteIndirizzo.text

Using ConnIns As New OleDb.OleDbConnection(strConnessione)
ConnIns.Open()
queryString2 = "INSERT INTO Anagrafica (Nome, Indirizzo) VALUES ('" & NomeCliente & "', '" & IndirizzoCliente ) & "')"
Dim InsCli As New OleDb.OleDbCommand(queryString2, ConnIns)
Dim ResultCli As Integer
ResultCli = InsCli .ExecuteNonQuery
End Using

N.B. HO INSERITO UNA TEXTBOX PER IL NOME DEL PATH DEL DB COSì SE CAMBI POSIZIONE AL DB PUOI REIMPOSTARE IL PATH CON UN SEMPLICE SFOGLIA CARTELLE

Domenico Mancina

gdlcore Profilo | Junior Member

Ciao..ho provato come mi avete detto voi ma non mi funziona..vi posto il mio codice:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

I due campi sono Ragione Sociale e Indirizzo, ho fatto solo questi 2 per prova.
Premetto che il database è già creato, io devo inserire solamente i campi nella tabella già esistente.

L'errore che mi presenta è : Errore di sintassi nell'istruzione INSERT INTO.

Cosa sbaglio? Grazie dell'aiuto..

denis.basei Profilo | Senior Member

Il campo Ragione sociale ha uno spazio in mezzo. Togli lo spazio nella definizione della tabella oppure racchiudi tra parentesi quadre il campo Ragione Sociale, se non vuoi togliere lo spazio... così dovrebbe andare.


Denis
Denis B. - www.baseiengineering.com

DomA Profilo | Expert


scusami nella insert che ti ho postato in effetti c'è una parentesi tonda in più prova a modificarla in questo modo:

queryString2 = "INSERT INTO Anagrafica (Nome, Indirizzo) VALUES ('" & NomeCliente & "', '" & IndirizzoCliente & "')"

così non dovresti avere problemi.
controlla, infine, la tua tabella ed assicurati che non vi siano campi richiesti (nel caso la tua tabella contenga altri campi oltre a Nome e Indirizzo).

buon lavoro
Domenico Mancina

gdlcore Profilo | Junior Member

Niente non riesco a farlo andare eh..assurdo..
Questo è il codice:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
Mi da l'errore nella riga:
cmd.ExecuteNonQuery(sSQL)
"Risoluzione dell'overload non riuscita perché nessun 'ExecuteNonQuery' accessibile accetta questo numero di argomenti."

Cosa vuol dire?

denis.basei Profilo | Senior Member

L'errore è legato al fatto che anche il primo campo aggiunto necessita degli apici:
Questa è la tua query
sSQL = "INSERT INTO Anagrafica (Codice, Descrizione) " & _
"VALUES (" & Me.TxtRagione.Text & ", '" & Me.TxtInd.Text & "'))"
... io la farei così:
sSQL = "INSERT INTO Anagrafica (Codice, Descrizione) " & _
"VALUES ('" & Me.TxtRagione.Text & "', '" & Me.TxtInd.Text & "'))"

Ciao

Denis

Denis B. - www.baseiengineering.com

DomA Profilo | Expert

guarda ti posto di nuovo il codice


Dim strConnessione As String = "Provider = Microsoft.Jet.OLEDB.4.0;Data Source=Pathtuodb.mdb"
Dim queryString2 As String
dim NomeCliente as string = me.txtClienteNome.text
dim IndirizzoCliente as string = me.txtClienteIndirizzo.text

Using ConnIns As New OleDb.OleDbConnection(strConnessione)
ConnIns.Open()
queryString2 = "INSERT INTO Anagrafica (Nome, Indirizzo) VALUES ('" & NomeCliente & "', '" & IndirizzoCliente & "')"
Dim InsCli As New OleDb.OleDbCommand(queryString2, ConnIns)
Dim ResultCli As Integer
ResultCli = InsCli .ExecuteNonQuery
End Using

questo è testato.


Domenico Mancina

gdlcore Profilo | Junior Member

Niente non riesco..
Questo è il codice:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Con questo codice mi parte senza errori..al momento del click sul tasto Salva che mi dovrebbe andare a scrivere sul db carica un secondo e sembra avere scritto..poi vado a vedere ma nn ha scritto niente..Per favore qualcuno ha una risposta? Mi sto arrendendo..

denis.basei Profilo | Senior Member

gdlcore mai arrendersi!
Mi manderesti la struttura della tabella Access nella quale aggiungi i dati?


Denis
Denis B. - www.baseiengineering.com

gdlcore Profilo | Junior Member

Ti ho allegato il file..la tabella dove devo inserire i dati è la tabella Anagrafica..aspetto tua rispsota grazie mille!

denis.basei Profilo | Senior Member

Ho copiato il tuo database.
Non ci crederai, ho eseguito alla lettera il tuo codice ed a me funziona.

Al limite prova a sostituire nella stringa di connessione DataDirectory con la path esplicita del database... deve funzionare anche a te!
Denis B. - www.baseiengineering.com

gdlcore Profilo | Junior Member

Porca miseria hai proprio ragione..ho messo il file in C:\DbOggetti.mdb ed è andato..
Quindi come devo fare a collegarmi al file per tenerlo nella cartella del programma?

denis.basei Profilo | Senior Member

Bè la prima cosa che mi viene in mente è di suggerirti di scrivere la stringa di connessione in questo modo:
Dim strConnessione As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & System.AppDomain.CurrentDomain.BaseDirectory() & "dbOggetti.mdb"

... se funziona ricordati di accettare la risposta.

Grazie
Denis B. - www.baseiengineering.com

gdlcore Profilo | Junior Member

Ok tutto a posto..ma ora ho un altro problema, una volta che ho salvato i dati nel database, quando riapro di nuovo il form con le textbox, queste dovrebbero essere già compilate con i dati che ho inserito..
I dati che inserisco nel form sono fissi, è l'anagrafica del proprietario del software..non so se mi sono spiegato al meglio, lo spero..
In pratica, nel load del mio form dovrei avere qualche istruzione che mi va a prelevare i dati della tabella e me li sbatta nella textbox corrispondente..l'avevo fatto con excel ma nn con Access, aspetto una vostra mano, grazie..

denis.basei Profilo | Senior Member

Ciao gdlCore, non ho capito esattamente cosa devi fare comunque sia se la tua domanda è "come visualizzare tutti i dati della tabella nel form", la strada consigliata è di usare il binding con un tableadapter. Sembra difficile se non l'hai fatto ma è tutto visuale, senza necessità di scrivre codice. Devi creare un dataset, definire un tableadapter collegato alla tabella su Access e poi dal form trascinando il tableadapter nel form automaticamente ti crea il bindingsource, il tableadapter ed il bindingnavigator. Se cerchi su internet le parole chiave qui sopra indicate trovi spiegazioni ed esempi vari.

Denis
Denis B. - www.baseiengineering.com

gdlcore Profilo | Junior Member

Non mi sono spiegato bene..dopo che ho inserito i dati anagrafici della mia azienda in quel famoso form (spiegato all'inizio del thread), questi vengono scritti sulla tabella "Anagrafica" del database.
Ora una volta che io clicco sul tasto anagrafica torno sul form con i relativi dati, ma con le textbox già compilate coi miei dati della mia azienda che precedentemente ho compilato..
Spero di essermi spiegato, è difficile spiegare eh..non lo sapevo..
Aspetto tua risposta, grazie mille per ogni risposta..

DomA Profilo | Expert

che ne diresti di inserire una grid nel form per visualizzare i dati nella grigilia e poi scegliere dalla grid quelli che ti interessano?

Dim strConnessione As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & System.AppDomain.CurrentDomain.BaseDirectory() & "dbOggetti.mdb"
Dim Conn As OleDb.OleDbConnection
Conn = New OleDb.OleDbConnection(strConnessione)
Dim cmdClienti_b As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter("SELECT * FROM Anagrafica ORDER BY Denominazione", strConnessione)
Dim DSC As DataSet = New DataSet
cmdClienti_b.Fill(DSC, "Clienti")
Dim dvClienti As DataView = DSC.Tables("Clienti").DefaultView
With Me.DataGridView1
.DataSource = dvClienti
End With
dvClienti = Nothing
DSC = Nothing
Conn = Nothing

Prima verifica se funziona e se va ricordati di accettare la risposta.
se non ci sono problemi ti invierò il codice per visualizzare i dati della riga selezionata nel textbox

secondo me faresti bene ad inserire il codice nell'evento Load del form
ciao.
Domenico Mancina

gdlcore Profilo | Junior Member

No..non è un inserimento clienti..è un anagrafica unica, quella della mia azienda, che inserisco quando acquisto il softwar, quindi devo leggere i vari elementi della tabella "Anagrafica" e metterli dentro le TextBox già esistenti..

DomA Profilo | Expert

se guardi bene na query del codice che ti ho postato, potrai accorgerti che non si tratta di un inserimento ma di una semplice SELECT. Questo ti darà la possiblità di visualizzare i dati in una griglia. per visualizzare i dati nelle textbox puoi modificare il codice in questo modo:

Dim strConnessione As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & System.AppDomain.CurrentDomain.BaseDirectory() & "dbOggetti.mdb"
Dim Conn As OleDb.OleDbConnection
Conn = New OleDb.OleDbConnection(strConnessione)
Dim cmdClienti_b As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter("SELECT * FROM Anagrafica ORDER BY Denominazione", strConnessione)
Dim DSC As DataSet = New DataSet
cmdClienti_b.Fill(DSC, "Clienti")
Dim dvClienti As DataView = DSC.Tables("Clienti").DefaultView
With Me.DataGridView1
.DataSource = dvClienti
End With
Me.txtNome.Text = Me.DataGridView1(0, 0).Value
Me.txtIndirizzo.Text = Me.DataGridView1(1, 0).Value
'e così via...
'supponendo che la colonna 0 contegna il nome e la colonna 1 contenga l'indirizzo
dvClienti = Nothing
DSC = Nothing
Conn = Nothing

E' chiaro che dovrai personalizzare il codice secondo le tue esigenze.
N.B. se non vuoi visualizzare la grid ti basterà impostare la proprietà visible su false.
Domenico Mancina

gdlcore Profilo | Junior Member

Ok grazi mille, ho fatto come hai detto tu..ma ti volevo chiedere una cosa per quanto riguarda la scrittura su Access..come faccio a fermare la scrittura ad un unico record, cioè che continuo a scrivere su un unica riga, quindi sovrascrive sempre..si può?

dosa85 Profilo | Junior Member

In che senso? non capisco bene....

DomA Profilo | Expert

Non ho capito bene cosa vuoi dire. puoi spiegarmi con un esempio?
se quello che ti serve è un aggiornamento del record puoi fare così:

Dim strConnessione As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & System.AppDomain.CurrentDomain.BaseDirectory() & "dbOggetti.mdb"
Using ConnEl As New OleDb.OleDbConnection(strConnessione)
ConnEl.Open()
queryString = "UPDATE Anagrafica SET Nome = '" & txtNome& "' WHERE ID = " & id
Dim cmdModArt As New OleDb.OleDbCommand(queryString, ConnEl)
Dim Result As Integer
Result = cmdModArt.ExecuteNonQuery
End Using

Using ConnEl As New OleDb.OleDbConnection(strConnessione)
ConnEl.Open()
queryString = "UPDATE Anagrafica SET Indirizzo= '" & txtIndirizzo & "' WHERE ID = " & id
Dim cmdModArt As New OleDb.OleDbCommand(queryString, ConnEl)
Dim Result As Integer
Result = cmdModArt.ExecuteNonQuery
End Using

e così per ogni campo della tabella

n.b. l'id te lo puoi ricavare dalla data grid(collonna, riga).value sempre ammesso che vi sia un campo id nella tabella.

se va ricordati di accettare la risposta.

Domenico Mancina

DomA Profilo | Expert


dosa
a chi ti rivolgi?
see you later
Domenico Mancina

dosa85 Profilo | Junior Member

Ciao DoMa, mi riferisco all'ultimo Post di GDLCORE.


Ps. X DoMa: sono Domenico Sapia!!!

DomA Profilo | Expert

dosa credo che intenda fare una modifica al record.
se ti può interessare guarda il codice che ho postato.

ps. x dosa ho già visto un tuo thread...
Domenico Mancina
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-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5