Insert in VB.Net

martedì 07 agosto 2007 - 11.02

guli Profilo | Junior Member

Salve a tutti, ho un problema con l'insert, utilizzando un db sql, ecco il codice che io ho scritto:

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

ma nn mi fa niente, nel senso nn inserisce nessun elemnto nel db....Come si faaaaaaaaaaaaa.........
ciao

SSUPERPIPPO Profilo | Guru

>stringa = "Insert into Persona (Username,Password,Nome,Cognome,DataNascita,Telefono) VALUES
>('TextBox5.Text' ,'TextBox6.Text','TextBox1.Text','TextBox2.Text'," + TextBox3.Text + "," + TextBox4.Text + ")"

Questa sintassi non può sicuramente funzionare in quanto i campi parametrici devono essere inclusi come concatenazione di stringa, qui sotto trovi la stringa corretta:

>stringa = "Insert into Persona (Username,Password,Nome,Cognome,DataNascita,Telefono) VALUES
>('" & TextBox5.Text & "' ,'" & TextBox6.Text & "','" & TextBox1.Text & "','" & TextBox2.Text & "'," & TextBox3.Text & "," & TextBox4.Text & ")"

Ti consiglio vivamente di utilizzare i parametri per generare comandi sql, più sicure ed eleganti:

dim SqlCmd as new SqlCommand

SqlCmd.CommandText="Insert into Persona (Username,Password,Nome,Cognome,DataNascita,Telefono) VALUES (@Username,@Password,@Nome,@Cognome,@DataNascita,@Telefono)"

SqlCmd.Parameters.AddWithValue("@Username", TextBox5.Text)
SqlCmd.Parameters.AddWithValue("@Password", TextBox6.Text)
SqlCmd.Parameters.AddWithValue("@Nome", TextBox1.Text)
...

Se hai dubbi sono a disposizione

Ciao

Alessandro

guli Profilo | Junior Member

Ciao, allora ti scrivo il codice

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

In questo modo nn mi scrive i dati, ma mettendo 'sqlCmd.ExecuteNonQuery() mi dice
"Errore di overflow aritmetico durante la conversione di expression nel tipo di dati datetime."
Perchè nel data base ho messo come dataNascita un tipo date time...come si fa????

Grazie per la disponibilità

LukeProgrammer Profilo | Newbie

Ciao, invece di
sqlCmd.Parameters.AddWithValue("@DataNascita", TextBox3.Text)
usa
sqlCmd.Parameters.AddWithValue("@DataNascita", ctype(TextBox3.Text,date))

e vedi se funziona.
Ciao


***********************************
LukeProgrammer

guli Profilo | Junior Member

scusami ma scrivendo sempre

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

mi da sempre lo stesso errore , come devo fare sto impazzendo con l'inserimento.......
Grazie sempre

LukeProgrammer Profilo | Newbie

Per risolvere l'errore che sta nel tipo di dato che cerchi di inserire, tu tenti di inserire una stringa e lui vuole un tipo data, devi provare a mettere questo codice al posto della riga

sqlCmd.Parameters.AddWithValue("@DataNascita", TextBox3.Text)

metti:

dim DataNascita as date
DataNascita = Ctype(TextBox3.Text, Date)
sqlCmd.Parameters.AddWithValue("@DataNascita", DataNascita)

Vedi se così funziona tutto.

CIAO

PS: Il codice finale deve essere, secondo me, così:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
***********************************
LukeProgrammer

guli Profilo | Junior Member

ciao, allora l'errore nn me lo da più, il problema è che non inserisce niente.............. sto odiando questo inserimento
come si fa????????

Grazie e ciaoooooooooooooooooooooooo

MaxLinus Profilo | Newbie

Anche io ho lo stesso identico problema (ho omesso le eccezioni):

conn = ConnectionClass.getConnection();
string insert = "INSERT INTO DatiAnagrafici"+
"(nome, datadinascita, luogodinascita,"+
"statocivile, soprannome, domicilio, telefono, foto) "+
"values ('" +textBox1.Text+"',"+
"convert(datetime,'"+textBox2.Text+"'),"+
"'" + textBox3.Text + "',"+
"'" + textBox4.Text + "',"+
"'" + textBox5.Text + "',"+
"'" + textBox6.Text + "',"+
"'" + textBox7.Text + "',"+
"null)";
SqlTransaction tx = conn.BeginTransaction();
SqlCommand command = new SqlCommand(insert,conn);
command.Transaction = tx;
int i =command.ExecuteNonQuery();
tx.Commit();

guli Profilo | Junior Member

scusami l'insistenza ma portesti mettere il codice per intero perchè non so ad esempio SqlTransactio (ed altre) a che classe appartiene.....

GRAZIE MILLEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
CIAO

LukeProgrammer Profilo | Newbie

Il codice che ti ha postato è intero, l'unico problema è il linguaggio mentre tu stai utilizzando il VB.NET lui ha postato codice in C# ecco perchè non trovi le classi.

CIAO
***********************************
LukeProgrammer

MaxLinus Profilo | Newbie

SqlTransacrion è una classe nuova del framework 2.0 se la vuoi vedere devi aggiungere il relativo assembly nel progetto.

Cmq se non ti serve non la mettere serve solo a creare un oggetto transazione e sfruttarlo.

In ogni caso il problema continua ad esserci lo stesso e non riesco a risolvere porca pupazza.

Sto installando SQL Server 2005 (la versione non express) vediamo se è questo il motivo.

In ogni caso quel codice postato è completo.
La prima istruzione è una classe connessione singleton che mi sono creato io la puoi benissimo omettere e sostituire con la classica:

SqlConnection conn = SqlConnection(<...stringa di connessione...>)

SE Risolvi fammi sapere per favore....

MaxLinus Profilo | Newbie

Perfetto ho individuato e risolto il problema, non so perchè, ma se qualcuno me lo spiega gliene sono grato. O è un bug di VS oppure sbagliamo qualcosa noi.

Dunque creo una windows app e inserisco nel progetto un'origine dati, creo un database con una tabella.

Il file app.config viene modificato da VS aggiungendo la stringa di connessione seguente:

<connectionStrings>
<add name="WindowsApplication1.Properties.Settings.MioDbConnectionString"
connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\MioDb.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"
providerName="System.Data.SqlClient" />
</connectionStrings>

è proprio il riferimento relativo a dar problemi, proprio quel maledetto |DataDirectory|. Nel mio caso ho risolto sostituendo con il percorso assoluto del DB

<connectionStrings>
<add name="WindowsApplication1.Properties.Settings.MioDbConnectionString"
connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\MaxLinus\Documents\Visual Studio 2005\Projects\WindowsApplication1\WindowsApplication1\MioDb.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"
providerName="System.Data.SqlClient" />
</connectionStrings>

Ma non mi riesco ancora a spiegare:
1)Come mai nonostante le insert non funzionino le select funzionino perfetamente.
2)Il perchè accade questo problema. Sbaglio qualcosa??

Qualche Guro mi puo' illuminare per favore?

Ciao e grazie,
MaxLinus

Cteniza Profilo | Guru

Semplicemente dovresti smettere di utilizzare quella sintassi per la connectionstring, ad ogni sessione fa l'attach del database al server e passare alla "normale" stringa di connessione sql.
Anche l'addwithvalue a volte genera dei mostri perchè "tenta" di indovinare il tipo del textbox.text che gli viene passato, personalmente ti sconsiglio di usarlo con campi diversi da stringa o numerici interi.
Io non l'ho mai usato, uso sempre e solo l'add normale di parametri di cui io definisco le proprietà

MaxLinus Profilo | Newbie

Per quanto riguarda la stringa di connessione, cosa intendi per la stringa classica??
Questa?
SqlConection conn = SqlConection (stringa); ????
Se così fosse, uso già questa connessione. Metterla nel file app.config si usa semplicemente per rendere pù disaccoppiato il codice da eventuali parametri di configurazione sistemistici.

Inoltre la microsoft sconsiglia l'uso di add a favore dell' addwithvalue. Il primo sarà presto dichiarato obsoleto.

Cteniza Profilo | Guru

Stavo parlando di questo tipo di connessione:
"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\MaxLinus\Documents\Visual Studio 2005\Projects\WindowsApplication1\WindowsApplication1\MioDb.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"
Beh questa è la stringa che prevede l'attivazione della user instance, una vera porcheria introdotta con sql 2005.
Invece io consiglio di utilizzare la stringa classica:
"Data Source=.\SQLEXPRESS;Initial Catalog=MioDb;Integrated Security=True
Senza attach e detach vari, ovviamente devi aprere sql manager e "attaccare" il database in modo permanente.

MaxLinus Profilo | Newbie

Ah ok in effetti cio' che viene consigliato nei libri e che mi sono trovato all'esame di certificazione è l'approccio che tu stesso usi. Non capisco come mai VS2005 sfrutti questo tipo di configurazione. In ogni caso come faccio a fare l'attach permanente? Tieni conto che utilizzo SQL Express dentro VS2005 anche se ho installato SQL2005 EE per scopi aziendali.

Cteniza Profilo | Guru

Le limitazioni imposte dal wizard per visual express determinano che quella che costruisce è l'unica connessione possibile, infatti "imprigiona" l'applicazione e la vincola all'accesso "fisico" ad un singolo database.
Dopo che il wizard è passato e hai creato il tuo dataset / tableadapter ecc, puoi benissimo cambiare la stringa di connessione con quella "normale".
Per quanto riguarda invece l'attach permanente devi aprire il sql management studio express, andare sui database e scegliere di collegare il database.

MaxLinus Profilo | Newbie

grazie mille!

guli Profilo | Junior Member

Scusate ma potete scrivere, per cortesia, il codice per intero, xkè mi sono un po' confuso....

Grazie mille
ciaoooooooooooo

MaxLinus Profilo | Newbie

Il codice per intero sarebbe qualcosa di questo tipo (in c#):

string stringa_di_connesione= "Data Source=.\sqlexpress; Initial Catalog=<MioDB>; Integrated Security = true;";
//Chiaramente sostituisci <MioDB> con l'effettivo nome del tuo DB
SqlConnection conn = new SqlConnection(stringa_di_connesione);
string insert = "insert into miatabella(campo1,campo2) values (@campo1,@campo2)";

try {
conn.Open();
SqlCommand command = new SqlCommand(insert,conn);
SqlTransaction tx = conn.BeginTransaction();
command.Parameters.AddWithValue("@campo1",oggetto1);
command.Parameters.AddWithValue("@campo2",oggetto2);
command.Transaction = tx;
command.ExecuteNoQuery(); // visto che non ci sono valori di ritorno
tx.Commit();
}catch (SqlException e){
tx.RollBack();
MessageBox.Show("Errore durante l'inserimento:\n"+e.ToString()+"\n RollBack Eseguito");
}
finally{
conn.Close();
}

Se ti serve recuperare la stringa di connessione dal file app.config ti consiglio di studiarti il metodo ConfigurationManager.AppSettings di System.Configuration

guli Profilo | Junior Member

scusate l'insistenza, ma pultroppo il c nn lo conosco..potete scrivere in visual basic dot net??

Grazie di tutto

StefanoLep Profilo | Senior Member

Ciao, ti segnalo un sito dove è possibile copiare codice i C# e averlo in VB (non un intero programma ovviamente... :-))

http://www.carlosag.net/Tools/CodeTranslator/Default.aspx

Nel caso specifico il codice di sopra diventa:

Dim stringa_di_connesione As String = "Data Source=.\sqlexpress; Initial Catalog=<MioDB>; Integrated Security = true;"
Dim conn As SqlConnection = New SqlConnection(stringa_di_connesione)
Dim insert As String = "insert into miatabella(campo1,campo2) values (@campo1,@campo2)"
Try
conn.Open
Dim command As SqlCommand = New SqlCommand(insert, conn)
Dim tx As SqlTransaction = conn.BeginTransaction
command.Parameters.AddWithValue("@campo1", oggetto1)
command.Parameters.AddWithValue("@campo2", oggetto2)
command.Transaction = tx
command.ExecuteNoQuery
' visto che non ci sono valori di ritorno
tx.Commit
Catch e As SqlException
tx.RollBack
MessageBox.Show(("Errore durante l'inserimento:"& vbLf _
+ (e.ToString + ""& vbLf&" RollBack Eseguito")))
Finally
conn.Close
End Try

Ci sono altri modi per convertire c# --> VB e viceversa ma questo lo trovo comodissimo

guli Profilo | Junior Member

ok, grazie mille problema risolto
ciaooo
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