2013-04-23 16 views
23

Buongiorno a tutti, sto usando Visual C# 2010 e MySQL Versione 5.1.48-community. Spero che tu possa aiutarmi con questo codice. Non trovo che funzioni su di me. Cosa mi manca?C# con parametri INSERT MySQL

string connString = ConfigurationManager.ConnectionStrings["default"].ConnectionString; 
MySqlConnection conn = new MySqlConnection(connString); 
conn.Open(); 
MySqlCommand comm = conn.CreateCommand(); 
comm.CommandText = "INSERT INTO room(person,address) VALUES(@person, @address)"; 
comm.Parameters.Add("@person", "Myname"); 
comm.Parameters.Add("@address", "Myaddress"); 
comm.ExecuteNonQuery(); 
conn.Close(); 

E quando provo a compilarlo. Dice:

colonna persona non può essere nullo

CURA:

Ma quando provo questo codice.

comm.CommandText = "INSERT INTO room(person,address) VALUES('Myname', 'Myaddress')"; 

Ma questo codice è soggetto ad attacco SQL injection ma funziona, non mi dà un errore.

Modificato:

ho cercato di utilizzare questo. Ho trovato here così ho pensato che avrebbe funzionato, ma mi dà questo errore

Indice (base zero) deve essere maggiore o uguale a zero e minore la dimensione della lista di argomenti.

Qualche idea?

string a = "myname"; 
    MySqlCommand cmd = new MySqlCommand(); 
    cmd.Connection = conn; 
    cmd.CommandText = "INSERT INTO room(person,address) VALUES(?,?)"; 
    //cmd.Prepare(); 

    cmd.Parameters.Add("person", MySqlDbType.VarChar).Value = a; 
    cmd.Parameters.Add("address", MySqlDbType.VarChar).Value = "myaddress"; 
    cmd.ExecuteNonQuery(); // HERE I GOT AN EXCEPTION IN THIS LINE 

Qualsiasi aiuto sarebbe molto apprezzato.

Modificato: risolto Ho usato questo codice:

cmd.CommandText = "INSERT INTO room(person,address) VALUES(?person,?address)"; 
cmd.Parameters.Add("?person", MySqlDbType.VarChar).Value = "myname"; 
cmd.Parameters.Add("?address", MySqlDbType.VarChar).Value = "myaddress"; 
cmd.ExecuteNonQuery(); 

Grazie!

+0

potresti pubblicare l'eccezione esatta che stai ricevendo? Normalmente dovresti usare AddWithValue come ogni altro dichiarato. Aggiungi è deprezzato quindi non dovresti usarlo –

+0

Lì. Ho ottenuto un'eccezione in 'cmd.ExecuteNonQuery();' Sì, lo so. Vedete che sto usando Visual C# 2010 e ho provato ad usare AddWithValue ma sembra che il 2010 non lo supporti. Non so se ho ragione. –

+0

Attualmente lavoro con vs2008 e lo uso. Al mio college avevamo vs2010 e stavamo usando AddWithValue –

risposta

4

utilizzare il metodo AddWithValue:

comm.Parameters.AddWithValue("@person", "Myname"); 
comm.Parameters.AddWithValue("@address", "Myaddress"); 
+0

Non posso farlo. Mi dà un errore Mi consente di utilizzare comm.Parameters.Add ("@ person", ) –

+1

@BoyKarton, potrebbe essere con la tua versione del connettore MySql, devi rimuovere il simbolo '@' e sostituirlo con '?'. – Habib

+0

@BoyKarton vedi se il commento di Habib risolve il problema. –

0
comm.Parameters.Add("person", "Myname"); 
+0

Ancora mi dà un errore. Non so cosa mi manca. –

2

tre cose: utilizzare l'istruzione using, utilizzare AddWithValue e parametri prefisso con? e aggiungere Allow User Variables=True alla stringa di connessione.

string connString = ConfigurationManager.ConnectionStrings["default"].ConnectionString; 
using (var conn = new MySqlConnection(connString)) 
{ 
     conn.Open(); 
     var comm = conn.CreateCommand(); 
     comm.CommandText = "INSERT INTO room(person,address) VALUES(@person, @address)"; 
     comm.Parameters.AddWithValue("?person", "Myname"); 
     comm.Parameters.AddWithValue("?address", "Myaddress"); 
     comm.ExecuteNonQuery(); 
    } 

vedono anche http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.parameters.aspx Per ulteriori informazioni sull'uso dei comandi, e http://dev.mysql.com/doc/refman/5.1/en/connector-net-connection-options.html per informazioni sull'opzione Variabili utente (supportato solo nella versione 5.2.2 e superiori) Consenti.

+0

Ancora .. Stesso errore. –

+0

hai aggiunto AllowUserVariables = true alla tua stringa di connessione? –

+0

Sì ma non è supportato. –

15

È possibile utilizzare AddWithValue metodo come:

string connString = ConfigurationManager.ConnectionStrings["default"].ConnectionString; 
MySqlConnection conn = new MySqlConnection(connString); 
conn.Open(); 
MySqlCommand comm = conn.CreateCommand(); 
comm.CommandText = "INSERT INTO room(person,address) VALUES(@person, @address)"; 
comm.Parameters.AddWithValue("@person", "Myname"); 
comm.Parameters.AddWithValue("@address", "Myaddress"); 
comm.ExecuteNonQuery(); 
conn.Close(); 

O

Prova con ? invece di @, come:

string connString = ConfigurationManager.ConnectionStrings["default"].ConnectionString; 
MySqlConnection conn = new MySqlConnection(connString); 
conn.Open(); 
MySqlCommand comm = conn.CreateCommand(); 
comm.CommandText = "INSERT INTO room(person,address) VALUES(?person, ?address)"; 
comm.Parameters.Add("?person", "Myname"); 
comm.Parameters.Add("?address", "Myaddress"); 
comm.ExecuteNonQuery(); 
conn.Close(); 

Speranza che aiuta ...

+0

Sto usando Visual C# 2010 Express. Il primo non mi permetterà di usare AddWithValue .. E ho già provato il secondo .. Non mi daranno errori ma non verranno inseriti nel mio database. –

-1

provare a regolare il codice a "SqlDbType" per abbinare il vostro tipo DB, se necessario, e utilizzare questo codice:

comm.Parameters.Add("@person",SqlDbType.VarChar).Value=MyName; 

o:

comm.Parameters.AddWithValue("@person", Myname); 

che dovrebbero funzionare ma ricordare con Command.Parameters. Aggiungi(), è possibile definire lo specifico SqlDbType e con Command.Parameters.AddWithValue(), esso tenterà di ottenere lo SqlDbType basato sul valore del parametro implicitamente che può interrompersi a volte se non può convertire implicitamente il tipo di dati.

Spero che questo aiuti.

+0

Ho provato a fare questo 'cmd.Parameters.Add (" @ person ", MySqlDbType.VarChar) .Value =" myname ";' e ancora lo stesso errore. Non so dove sono andato storto –

+0

Hai provato ad aggiungere nel DB con una casella di testo? Prova: – user2310201

+0

comm.Parameters.Add ("@ person", SqlDbType.VarChar) .Value = TextBox1.Text; // Verifica se l'errore si verifica ancora in questo modo. – user2310201

4

Ho avuto lo stesso problema - Alla fine ho provato il? sigillo invece di @, e ha funzionato.

Secondo la documentazione:

Nota. Le versioni precedenti del provider utilizzavano il simbolo '@' per contrassegnare i parametri in SQL. Questo è incompatibile con le variabili utente di MySQL, quindi il provider ora usa il '?' simbolo per individuare i parametri in SQL. Per supportare il codice precedente, puoi impostare 'old syntax = yes' sulla stringa di connessione. Se si esegue questa operazione, tenere presente che non verrà generata un'eccezione se non si riesce a definire un parametro che si desidera utilizzare nel proprio SQL.

Davvero? Perché non butti un'eccezione se qualcuno cerca di usare la cosiddetta vecchia sintassi? Poche ore buttati per un programma di 20 linee ...

MySQL::MySQLCommand

2

stavo affrontando problema molto simile durante il tentativo di inserire i dati usando mysql-connector-net-5.1.7-noinstall e Visual Studio (2015) nell'applicazione Windows Form. Non sono un guru del C#. Quindi, ci vogliono circa 2 ore per risolvere tutto.

Le seguenti opere codice ultimamente:

string connetionString = null; 
connetionString = "server=localhost;database=device_db;uid=root;pwd=123;"; 

using (MySqlConnection cn = new MySqlConnection(connetionString)) 
{ 
    try 
    { 
     string query = "INSERT INTO test_table(user_id, user_name) VALUES (?user_id,?user_name);"; 
     cn.Open(); 
     using (MySqlCommand cmd = new MySqlCommand(query, cn)) 
     { 
      cmd.Parameters.Add("?user_id", MySqlDbType.Int32).Value = 123; 
      cmd.Parameters.Add("?user_name", MySqlDbType.VarChar).Value = "Test username"; 
      cmd.ExecuteNonQuery(); 
     } 
    } 
    catch (MySqlException ex) 
    { 
     MessageBox.Show("Error in adding mysql row. Error: "+ex.Message); 
    } 
} 
-1

provare questo si sta lavorando

MySqlCommand dbcmd = _conn.CreateCommand(); 
    dbcmd.CommandText = sqlCommandString; 
    dbcmd.ExecuteNonQuery(); 
    long imageId = dbcmd.LastInsertedId; 
0

Quello che ho fatto è così.

String person; 
String address; 
person = your value; 
address =your value; 
string connString = ConfigurationManager.ConnectionStrings["default"].ConnectionString; 
    MySqlConnection conn = new MySqlConnection(connString); 
    conn.Open(); 
    MySqlCommand comm = conn.CreateCommand(); 
    comm.CommandText = "INSERT INTO room(person,address) VALUES('"+person+"','"+address+"')"; 
    comm.ExecuteNonQuery(); 
    conn.Close(); 
+0

Puoi aggiungere la risposta in modo diverso per favore? Spiegare cosa hai fatto aiuta i futuri lettori a capire più velocemente e ti dà più rappresentanti. –