34

大家好,我正在使用 Visual C# 2010 和 MySQL 版本 5.1.48-community。我希望你能帮助我处理这段代码。我不觉得它对我有用。我错过了什么?

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

当我尝试编译它时。它说:

人员列不能为空

编辑:

但是当我尝试这段代码时。

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

但是这段代码很容易受到 sql 注入攻击,但它可以工作,不会给我一个错误。

编辑:

我试着用这个。我在这里找到了它,所以我认为它会起作用,但给了我这个错误

索引(从零开始)必须大于或等于零且小于参数列表的大小。

任何想法?

    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

任何帮助将非常感激。

已编辑: 已解决 我使用了以下代码:

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

谢谢!

4

9 回答 9

27

您可以使用AddWithValue如下方法:

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

或者

尝试使用?而不是@,例如:

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

希望能帮助到你...

于 2013-04-23T11:23:12.267 回答
6

使用AddWithValue方法:

comm.Parameters.AddWithValue("@person", "Myname");
comm.Parameters.AddWithValue("@address", "Myaddress");
于 2013-04-23T11:16:51.487 回答
5

我有同样的问题 - 最后尝试了?sigil 而不是@,它起作用了。

根据文档:

笔记。提供程序的早期版本使用“@”符号来标记 SQL 中的参数。这与 MySQL 用户变量不兼容,因此提供程序现在使用“?” 用于在 SQL 中定位参数的符号。要支持旧代码,您可以在连接字符串上设置 'old syntax=yes'。如果您这样做,请注意,如果您未能定义您打算在 SQL 中使用的参数,则不会引发异常。

真的吗?如果有人试图使用所谓的旧语法,为什么不直接抛出异常呢?一个 20 行的程序花费了几个小时……

MySQL::MySQL 命令

于 2014-09-02T23:21:33.057 回答
4

尝试在 Windows 窗体应用程序中使用 mysql-connector-net-5.1.7-noinstall 和 Visual Studio(2015) 插入数据时,我遇到了非常类似的问题。我不是 C# 大师。因此,解决所有问题大约需要 2 个小时。

以下代码最近有效:

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);
    }
}
于 2016-11-10T09:43:30.087 回答
3

三件事:使用using语句,使用AddWithValue和前缀参数?并添加Allow User Variables=True到连接字符串。

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

另请参阅http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.parameters.aspx了解有关命令用法的更多信息,以及http://dev.mysql.com/doc/ refman/5.1/en/connector-net-connection-options.html以获取有关允许用户变量选项的信息(仅在 5.2.2 及更高版本中支持)。

于 2013-04-23T11:19:43.437 回答
0
comm.Parameters.Add("person", "Myname");
于 2013-04-23T11:17:21.737 回答
0

我所做的是这样的。

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();
于 2018-02-12T14:09:11.597 回答
-1

如有必要,请尝试调整“SqlDbType”处的代码以匹配您的数据库类型并使用此代码:

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

或者:

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

这应该有效,但请记住使用 Command.Parameters.Add(),您可以定义特定的 SqlDbType,使用 Command.Parameters.AddWithValue(),它将尝试基于参数值隐式获取 SqlDbType,如果不能隐式,有时可能会中断转换数据类型。

希望这可以帮助。

于 2013-04-23T12:30:03.710 回答
-2

试试这个它正在工作

 MySqlCommand dbcmd = _conn.CreateCommand();
    dbcmd.CommandText = sqlCommandString;
    dbcmd.ExecuteNonQuery();
    long imageId = dbcmd.LastInsertedId;
于 2016-12-06T10:26:52.800 回答