web-dev-qa-db-fra.com

C # avec les paramètres MySQL INSERT

Bonne journée à tous, j'utilise Visual C # 2010 et MySQL Version 5.1.48-community. J'espère que vous pourrez m'aider avec ce code. Je ne trouve pas que cela fonctionne sur moi. Qu'est-ce que je rate?

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();

Et quand j'essaye de le compiler. Ça dit:

La colonne Personne ne peut pas être nulle

ÉDITÉ:

Mais quand j'essaye ce code. 

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

Mais ce code est sujet aux attaques par injection SQL mais cela fonctionne, cela ne me donne pas d'erreur. 

ÉDITÉ:

J'ai essayé de l'utiliser. Je l'ai trouvé ici alors j'ai pensé que cela fonctionnerait, mais me donne cette erreur

L'indice (basé sur zéro) doit être supérieur ou égal à zéro et inférieur à la taille de la liste d'arguments.

Une idée?

    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

Toute aide serait très appréciée.

EDITED: RÉSOLU J'ai utilisé ce code:

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();

Merci beaucoup!

26
Boy Karton

Vous pouvez utiliser la méthode AddWithValue comme:

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();

OR

Essayez avec ? au lieu de @, comme ceci:

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();

J'espère que ça aide...

18
Rahul

Utilisez la méthode AddWithValue:

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

J'ai eu le même problème - Enfin essayé le? Sigil au lieu de @, et cela a fonctionné.

Selon les docs:

Remarque. Les versions précédentes du fournisseur utilisaient le symbole "@" pour marquer les paramètres en SQL. Ceci est incompatible avec les variables utilisateur MySQL, le fournisseur utilise maintenant le '?' symbole pour localiser les paramètres en SQL. Pour prendre en charge les anciens codes, vous pouvez définir "old syntax = yes" sur votre chaîne de connexion. Dans ce cas, sachez qu’une exception ne sera pas levée si vous ne parvenez pas à définir un paramètre que vous souhaitez utiliser dans votre code SQL.

Vraiment? Pourquoi ne lancez-vous pas une exception si quelqu'un essaie d'utiliser l'ancienne syntaxe? Quelques heures à perdre pour un programme de 20 lignes ...

MySQL :: MySQLCommand

4
Gerard ONeill

J'étais confronté à un problème très similaire lors de l'insertion de données à l'aide de mysql-connector-net-5.1.7-noinstall et de Visual Studio (2015) dans Windows Form Application. Je ne suis pas un gourou C #. Il faut donc environ 2 heures pour tout résoudre. 

Le code suivant fonctionne dernièrement:

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);
    }
}
2
arsho

Trois choses: utilisez l'instruction using, utilisez AddWithValue et les paramètres de préfixe avec? et ajoutez Allow User Variables=True à la chaîne de connexion.

 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();
  }

Consultez également http://msdn.Microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.parameters.aspx pour plus d'informations sur l'utilisation de la commande, et http: // dev. mysql.com/doc/refman/5.1/fr/connector-net-connection-options.html pour plus d'informations sur l'option Autoriser les variables utilisateur (uniquement pris en charge par les versions 5.2.2 et supérieures).

2
L-Four
comm.Parameters.Add("person", "Myname");
0
DarkBee

Ce que j'ai fait est comme ça.

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
Barry