Aggiungere un nuovo record in un database

lunedì 27 agosto 2012 - 14.48
Tag Elenco Tags  VB.NET  |  Windows XP  |  Visual Studio 2010

MasterLed Profilo | Newbie

Buongiorno, dopo anni di VB6 sto sbarcando nel VB.NET con non pochi problemini...

come faccio a memorizzare in una tabella del mio database ODBC i dati contenuti in varie text di una form?

mentre prima nel VB6 me la cavavo con un semplice:
AdodcAnagForn.Recordset.Fields("CodForn") = Text1.Text
AdodcAnagForn.Recordset.Fields("Ragione_Sociale") = Text2.Text
.......
AdodcAnagForn.Recordset.Update
ed in questo modo riga per riga verificava anche la compatibilità del dato con il format del campo

ora in VB.NET non riesco a capire come fare



... ho trovato il comando:
INSERT INTO AnagForn (CodForn, Ragione_Sociale, ....... ) VALUES ('" & TextBox1.Text & "','" & TextBox2.Text & "',..........)
ma lo vedo poco pratico perchè se c'è anche solo 1 piccolo errore in una delle text (e sono 40) divento strabico e pazzo a trovarlo in 1 stringa kilometrica



sono passato anche per la classe BindingSource ma non mi piace la cosa perchè preferisco lasciare staccate text e database in modo da modificarli solo previa alcune verifiche... mi pare di aver comprendo che crea una connessione permanente come la proprietà RecordSource delle text in VB6



gira gira ho trovato questo altro metodo, che mi pare si avvicini maggiormente al mio modo di lavorare:
Dim ds As DataSet
Dim da As OdbcDataAdapter
Dim dr As DataRow

ds = New DataSet("AnagForn")
da = New OdbcDataAdapter("Select * from AnagForn", PathComuniT)
da.Fill(ds, "AnagForn")

dr = ds.Tables("AnagForn").NewRow
dr.BeginEdit()
dr.Item("codforn") = TextBox1.Text
dr.Item("ragione_sociale") = TextBox2.Text
........
dr.EndEdit()
ds.Tables("AnagForn").Rows.Add(dr)
da.Update(ds)
ma quando lo eseguo mi si inchioda sull'ultima riga con il seguente messaggio "Update non è in grado di trovare TableMapping['Table'] o DataTable 'Table'

.... se sostituisco l'ultima riga con
da.Update(ds, "AnagForn")
il msg di errore cambia in "Update richiede un InsertCommand valido se la raccolta DataRow viene passato con righe nuove"



mi dite dove sto sbagliando o cosa manca? la soluzione che ho trovato è corretta o ve ne è di più semplice per memorizzare il contenuto di tante text nei rispettivi campi del database?

grazie

alextyx Profilo | Expert

Personalmente, userei il comando che 'rischia di farti diventare pazzo', ma credo che la quasi totalità dei programmatori propenderebbe per il dataset, che mi ostino a non usare.
Potresti comunque preparare una funzioncina che ti esegua il comado SQL, magari usando un parametro per evitare problemi, e chiamarla per ognuna delle 40 textbox, passandogli di volta in volta il nome del campo da updatare e il valore da scriverci dentro, eventualmente anche il tipo di dato (testo, numero, data, ecc..). Questo ti permetterebbe di scomporre un debug in passi successivi e analizzare l'aggiornamento di ogni campo, singolarmente, se questo può esserti utile.
Comunque tieni presente che in genere si usano i dataset, sono io che vado controcorrente ;)
Ciao :)

darkeric Profilo | Senior Member

Io Invece sono daccordo per la connessione e le query da codice

rendono il codice più trasparente

basta solo saperle usare.

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

MasterLed Profilo | Newbie

si capito, grazie.. valuterò anche le vostre soluzioni per capire quale rispecchia meglio le mie esigenze.

tanto per capirci un po' di più su come funzionano, riguardo invece all'uso del DataRow e DataAdapter, mi potete delucidare su cosa è sbagliato e/o cosa manca in riferimento all'errore che mi esce?

alextyx Profilo | Expert

"Io Invece sono daccordo per la connessione e le query da codice

rendono il codice più trasparente

basta solo saperle usare.

piccolo esempio"

Incredibile, un altro marziano come me!

darkeric Profilo | Senior Member

Agli inizi ero anche io per i dataset, una volta provato il codice però non ho avuto dubbi.
Mi rende piû chiaro e leggibile, per non dire ricercabile, il codice.


Programmatore per passione!

MasterLed Profilo | Newbie

non ne esco... ho provato in questo modo:

Dim da As OdbcDataAdapter
da = New OdbcDataAdapter("Select * from AnagForn", PathComuniT)
Dim cmd As OdbcCommand = New OdbcCommand("INSERT INTO AnagForn (codforn, ragione_sociale) VALUES (@codforn, @Ragione_Sociale)", PathComuniT)
cmd.Parameters.Add("@codforn", OdbcType.VarChar, 6, "codforn").Value = TextBox1.Text
cmd.Parameters.Add("@Ragione_Sociale", OdbcType.VarChar, 100, "Ragione_Sociale").Value = TextBox2.Text
cmd.ExecuteNonQuery()

mi si blocca all'ultima riga con questo errore "column codforn does not exist"... quale è il problema ora? che mi sono dimenticato?

alextyx Profilo | Expert

Non capisco appieno il tuo codice, ma è il momento che tu faccia del debug.
Riduci tutta l'operazione ai minimi termini possibili (togli i parametri e magari vai con un solo campo per volta) e guarda se l'errore persiste. Potresti aver scritto male la colonna, oppure il codice, ma devi procedere partendo da una operazione 'semplicissima' e via via riaggiungere istruzioni finchè non vedi cosa ti blocca. Che DB usi?

MasterLed Profilo | Newbie


ho ridotto così:

Dim cmd As OdbcCommand = New OdbcCommand("INSERT INTO AnagForn (codforn) VALUES (@codforn)", PathComuniT)
cmd.Parameters.Add("@codforn", OdbcType.VarChar, 6, "codforn").Value = TextBox1.Text
cmd.ExecuteNonQuery()


ma stesso msg.. column codforn does not exist

come database uso PostgreSQL

Caleidoscopio Profilo | Newbie

Il problema è che probabilmente nella tua tabella AnagForn il campo non si chiama CodForn e quindi fallisce l'istanza del Data adapter.

Io i parametri li aborro... per due campi soltanto, ha senso fare tutto sto casino?

Ciao!
stefano

MasterLed Profilo | Newbie

dopo 10 anni che uso quel database, il nome dei campi non lo posso sbagliare... no, il problema non è quello, anche perchè se invece il comando lo dò in questo modo senza i parametri, me lo salva

INSERT INTO AnagForn (CodForn) VALUES ('" & TextBox1.Text & "')

darkeric Profilo | Senior Member

cmd.Parameters.Add("@codforn", OdbcType.VarChar, 6, "codforn").Value = TextBox1.Text

prova a dichiarare prima il parametro e poi ad aggiungerlo al cmd

dim parametro as new odbcparameter("@codforn",OdbcType.VarChar)
parametro.value = TextBox1.Text
cmd.parameters.add(parametro1)


Programmatore per passione!

MasterLed Profilo | Newbie

ho risolto sostituendo nella riga di comando le variabili con dei ?... ovvero

Dim cmd As OdbcCommand = New OdbcCommand("INSERT INTO AnagForn (codforn, ragione_sociale) VALUES (?, ?)", PathComuniT)
........


e ha verificato e salvato il tutto nel database e nei campi giusti... strana sta cosa, ma funziona

grazie a tutti per il supporto.. ci sentiamo presto per altri inconvenienti :)

darkeric Profilo | Senior Member

probabilmente è normale con i DB odbc


Programmatore per passione!

alextyx Profilo | Expert

Con access servono i punti interrogativi, ma visto che usi odbc e non oledb, ti avevo appunto chiesto quale db stavi usando.
Ti segnalo questo ottimo link
http://community.visual-basic.it/lucianob/articles/18386.aspx

MasterLed Profilo | Newbie

infatti non uso access... boh.. sarà... per fortuna ne sono uscito :)

grazie del link, ci darò una bella letta
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