Insert into parametrica e DataTable

lunedì 29 ottobre 2007 - 12.18

skater Profilo | Newbie

Ciao, ho un problema nell'effettuare una INSERT INTO parametrica.
Ciò che fa la pagina è: recuperare due 'id' tramite due differenti select; vengono assegnate a delle variabili; dopodichè devo inserire i valori di queste variabili in un'altra tabella con INSERT INTO (al clik di un bottone).
Non penso sia complicato, sto seguendo una procedura per fare cio, ma a un certo punto devo inserire un DataTable che sarebbe la fonte dei dati, giusto? quale sarebbe nel mio caso?? le due tabelle originali della select? oppure le mie variabili (che non costituiscono un DataTable) ???

Posto il codice per essere piu esplicito (ho commentato le righe in questione)

..grazie mille in anticipo!!!!

protected void Button1_Click(object sender, EventArgs e)
{


SqlConnection MyConnection;
SqlCommand MyCommand;
SqlDataAdapter MyAdapter;
SqlParameter user;
SqlParameter aziendaid;
DataTable MyTable = new DataTable();

MyConnection = new SqlConnection();
MyConnection.ConnectionString = ConfigurationManager.ConnectionStrings["securejobConnectionString"].ConnectionString;

MyCommand = new SqlCommand();
MyCommand.CommandText = "INSERT INTO UsersInAzienda (user, aziendaid) VALUES (@user,@aziendaid)";
MyCommand.CommandType = CommandType.Text;
MyCommand.Connection = MyConnection;


user = new SqlParameter();
user.ParameterName = "@user";
user.SqlDbType = SqlDbType.VarChar;
user.Size = 15;
user.Direction = ParameterDirection.Input;

aziendaid = new SqlParameter();
aziendaid.ParameterName = "@aziendaid";
aziendaid.SqlDbType = SqlDbType.VarChar;
aziendaid.Size = 15;
aziendaid.Direction = ParameterDirection.Input;

MyCommand.Parameters.Add(user);
MyCommand.Parameters.Add(aziendaid);
////////////////////////////////////////////////////////////righe interessate
MyAdapter = new SqlDataAdapter();
MyAdapter.InsertCommand = MyCommand;
MyAdapter.Fill(MyTable);

GridView1.DataSource = MyTable.DefaultView;
GridView1.DataBind();
/////////////////////////////////////////////////////////////////////////////////
MyAdapter.Dispose();
MyCommand.Dispose();
MyConnection.Dispose();


}

alx_81 Profilo | Guru

>Ciao,
Ciao!

>ho un problema nell'effettuare una INSERT INTO parametrica.
>Ciò che fa la pagina è: recuperare due 'id' tramite due differenti
>select; vengono assegnate a delle variabili; dopodichè devo inserire
>i valori di queste variabili in un'altra tabella con INSERT INTO
>(al clik di un bottone).
>Non penso sia complicato, sto seguendo una procedura per fare
>cio, ma a un certo punto devo inserire un DataTable che sarebbe
>la fonte dei dati, giusto? quale sarebbe nel mio caso?? le due
>tabelle originali della select? oppure le mie variabili (che
>non costituiscono un DataTable) ???
>Posto il codice per essere piu esplicito (ho commentato le righe
>in questione)
Spero di aver capito bene.. Dunque, tu vuoi fare una insert into che dipende da due select precedenti, vero? O meglio, le select precedenti valorizzano due variabili che poi devono essere i parametri della successiva insert into, corretto?
Se sì, modifico parte del tuo codice:

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

>..grazie mille in anticipo!!!!
di nulla!
Alx81 =)

http://blogs.dotnethell.it/suxstellino

skater Profilo | Newbie

ciao... grazie mille per la risposta e tante altre per il codice postato!!! non è da tutti e soprattutto è quello che mi ci vuole.... perchè il codice riesco a capirlo, ma non a scriverlo!!!! ahi!!

leggendo il codice mi sono reso conto di aver descritto erroneamente il problema. Infatti, i paramentri per fare l'insert into, non li prende da altre select, ma da delle GridView tramite
string user = GridView1.SelectedDataKey.Value.ToString();
Label3.Text = user;

e

string aziendaid = GridView2.SelectedDataKey.Value.ToString();
Label2.Text = aziendaid;


penso che non ci sia molto da cambiare rispetto a cio che mi hai scritto..

ciao e ancora grazie

alx_81 Profilo | Guru

>ciao... grazie mille per la risposta e tante altre per il codice
>postato!!! non è da tutti e soprattutto è quello che mi ci vuole....
>perchè il codice riesco a capirlo, ma non a scriverlo!!!! ahi!!
Figurati
>leggendo il codice mi sono reso conto di aver descritto erroneamente
>il problema. Infatti, i paramentri per fare l'insert into, non
>li prende da altre select, ma da delle GridView tramite
> string user = GridView1.SelectedDataKey.Value.ToString();
> Label3.Text = user;
>
>e
>
>string aziendaid = GridView2.SelectedDataKey.Value.ToString();
> Label2.Text = aziendaid;
>
>
>penso che non ci sia molto da cambiare rispetto a cio che mi
>hai scritto..
direi che si semplificherà molto.. togli i select command e valorizzi le variabili non con gli ExecuteScalar ma con quello che hai a disposizione dal gridview..
>
>ciao e ancora grazie
di nulla!

ps: se ritieni che ti abbia aiutato, accetta la risposta che chiudiamo il thread,

Alx81 =)

http://blogs.dotnethell.it/suxstellino

skater Profilo | Newbie

scusa la tontaggine.... ma ti ho detto che non il codice non vado molto d'accordo. ti posto le modifiche e mi dici...

SqlConnection MyConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["securejobConnectionString"].ConnectionString);
SqlCommand MyInsertCommand = new SqlCommand("INSERT INTO UsersInAzienda (user, aziendaid) VALUES (@user,@aziendaid)", MyConnection);


// sorgente del gridview
SqlCommand MyGVCommand = new SqlCommand("SELECT * FROM UsersInAzienda", MyConnection);
SqlDataAdapter DA = new SqlDataAdapter(MyGVCommand);
DataTable dt = new DataTable("Contenitore");

// variabili per il risultato scalare delle select
string user = GridView1.SelectedDataKey.Value.ToString();
string aziendaid = GridView2.SelectedDataKey.Value.ToString();


// ritorno i valori della select con ExecuteScalar



MyInsertCommand.Parameters.Add("@user", SqlDbType.VarChar, 15).Value = user;
MyInsertCommand.Parameters.Add("@aziendaid", SqlDbType.Int).Value = aziendaid;

// eseguo la insert
MyInsertCommand.ExecuteNonQuery();


MyAdapter.Dispose();
MyCommand.Dispose();
MyConnection.Dispose();


giusto ???

alx_81 Profilo | Guru

>scusa la tontaggine.... ma ti ho detto che non il codice non
>vado molto d'accordo. ti posto le modifiche e mi dici...
>
>SqlConnection MyConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["securejobConnectionString"].ConnectionString);
>SqlCommand MyInsertCommand = new SqlCommand("INSERT INTO UsersInAzienda
>(user, aziendaid) VALUES (@user,@aziendaid)", MyConnection);
>
>
> // sorgente del gridview
>SqlCommand MyGVCommand = new SqlCommand("SELECT * FROM UsersInAzienda", MyConnection);
> SqlDataAdapter DA = new SqlDataAdapter(MyGVCommand);
> DataTable dt = new DataTable("Contenitore");
>
> // variabili per il risultato scalare delle select
>string user = GridView1.SelectedDataKey.Value.ToString();
>string aziendaid = GridView2.SelectedDataKey.Value.ToString();
>
>
> // ritorno i valori della select con ExecuteScalar
>
>
>
>MyInsertCommand.Parameters.Add("@user", SqlDbType.VarChar, 15).Value
>= user;
>MyInsertCommand.Parameters.Add("@aziendaid", SqlDbType.Int).Value
>= aziendaid;
>
> // eseguo la insert
> MyInsertCommand.ExecuteNonQuery();
>
>
> MyAdapter.Dispose();
> MyCommand.Dispose();
> MyConnection.Dispose();
>
>
>giusto ???

se ti basta fare la insert sì, ma rimuovi queste che non ti servono:
// sorgente del gridview
SqlCommand MyGVCommand = new SqlCommand("SELECT * FROM UsersInAzienda", MyConnection);
SqlDataAdapter DA = new SqlDataAdapter(MyGVCommand);
DataTable dt = new DataTable("Contenitore");

servivano se volevi riempire una ulteriore griglia..


Alx81 =)

http://blogs.dotnethell.it/suxstellino

skater Profilo | Newbie

scusami. ma mi restituisce errore:

"ExecuteNonQuery richiede una oggetto Connection aperto e disponibile. Lo stato attuale della connessione è chiuso."

ho provato a inserire "MyInsertCommand.Connection = MyConnection;" pensando che aprisse la connessione, ma non funzia uguale..

pozzoli.samuele Profilo | Senior Member

alx, scusa se intervengo io... ma questa è facile...

Prima di
> MyInsertCommand.ExecuteNonQuery();
, inserisci
>myConnection.open()

alx_81 Profilo | Guru

>alx, scusa se intervengo io... ma questa è facile...
ahahah.. già.. non era aperta laconnessione..
ciao!
Alx81 =)

http://blogs.dotnethell.it/suxstellino

skater Profilo | Newbie

ciao... grazie ancora per le risposte!!! in effetti bastava aprire la connessione.

Ora però mi dà altri problemi relativi ai tipi di dati.

Praticamente, i tipi di dati che seleziono dalla GridView sono rispettivamente Uniqueidentifier e Int. Ma per assegnarli a delle varibili li converto in String.

Per cui quando vado a fare la query, mi ritorna un errore sulla conversione dei dati.

il codice per ora è questo:
void Button1_Click(object sender, EventArgs e)
{
SqlConnection MyConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["securejobConnectionString"].ConnectionString);
SqlCommand MyInsertCommand = new SqlCommand("INSERT INTO UsersInAzienda (UserId, azienda_id) VALUES (@user, @aziendaid)", MyConnection);


String user = GridView1.SelectedDataKey.Value.ToString();
String aziendaid = GridView2.SelectedDataKey.Value.ToString();


MyInsertCommand.Parameters.Add("@user", SqlDbType.UniqueIdentifier, 15).Value = user;
MyInsertCommand.Parameters.Add("@aziendaid", SqlDbType.Int, 15).Value = aziendaid;

// eseguo la insert
MyConnection.Open();
MyInsertCommand.ExecuteNonQuery();
MyInsertCommand.Connection = MyConnection;

MyConnection.Dispose();


come posso fare??? grasias

alx_81 Profilo | Guru

>ciao... grazie ancora per le risposte!!! in effetti bastava aprire
>la connessione.
di nulla..
>come posso fare??? grasias
perchè non ci posti l'errore preciso? e poi, comunque, hai una classe Convert con dei metodi shared coi quali puoi effettuare facilmente le conversioni. Per ora posta l'errore..

Alx81 =)

http://blogs.dotnethell.it/suxstellino

skater Profilo | Newbie

...scusami.... modifico il post perchè quel messaggio lo dà con codice diverso da quello postato. Il messaggio d'errore è questo:

Errore server nell'applicazione '/autentika'.
--------------------------------------------------------------------------------

Cast da 'System.String' a 'System.Guid' non valido.
Descrizione: Eccezione non gestita durante l'esecuzione della richiesta Web corrente. Per ulteriori informazioni sull'errore e sul suo punto di origine nel codice, vedere l'analisi dello stack.

Dettagli eccezione: System.InvalidCastException: Cast da 'System.String' a 'System.Guid' non valido.

Errore nel codice sorgente:


Riga 59: // eseguo la insert
Riga 60: MyConnection.Open();
Riga 61: MyInsertCommand.ExecuteNonQuery();
Riga 62: MyInsertCommand.Connection = MyConnection;
Riga 63:


File di origine: c:\...\prova_gridview.aspx Riga: 61

alx_81 Profilo | Guru

Intanto ho notato che hai scritto String in maiuscolo..
per usare il tipo string, scrivilo minuscolo..
poi, prova a stampare il valore del datakey per capire se hai al suo interno chiavi composte..
Alx81 =)

http://blogs.dotnethell.it/suxstellino

skater Profilo | Newbie

allora. ho stampato a video varie cose:

void Button1_Click(object sender, EventArgs e)
{
SqlConnection MyConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["securejobConnectionString"].ConnectionString);
SqlCommand MyInsertCommand = new SqlCommand("INSERT INTO UsersInAzienda (UserId, azienda_id) VALUES (@user, @aziendaid)", MyConnection);

// variabili per il risultato scalare delle select
string userDB = GridView1.SelectedDataKey.Value.ToString();
string aziendaidDB = GridView2.SelectedDataKey.Value.ToString();
Label4.Text = userDB;
Label5.Text = aziendaidDB;
// -----------e questo lo stampa correttamente, ma se aggiungo:

string datakey = GridView1.DataKeys;
Label6.Text = datakey;
// -------- mi da questo errore di compilazione CS0029: Impossibile convertire implicitamente il tipo 'System.Web.UI.WebControls.DataKeyArray' in 'string'.


è forse questa la chiave del problema??? ma considera che io prelevo dalla gridview solo il valore selezionato, non il DataKeys.


ancora grasias

alx_81 Profilo | Guru

> string datakey = GridView1.DataKeys;
> Label6.Text = datakey;
>// -------- mi da questo errore di compilazione CS0029: Impossibile
>convertire implicitamente il tipo 'System.Web.UI.WebControls.DataKeyArray'
>in 'string'.
>
>è forse questa la chiave del problema??? ma considera che io
>prelevo dalla gridview solo il valore selezionato, non il DataKeys.
Il valore selezionato è corretto infatti. Queste righe non lo sono, poichè stai cercando di convertire una collection in una stringa in maniera implicita. Quindi l'errore è del tutto normale..
ma ancora non ho capito bene che ti succede.. mi cambi le carte in tavola troppo spesso ..
Questo è da correggere sicuramente in questo modo:

string datakey = GridView1.DataKeys[indice];

poi del resto aspetto tue notizie..
>
>
>ancora grasias
de nada
>
>

Alx81 =)

http://blogs.dotnethell.it/suxstellino
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