【问题标题】:C# with MySQL INSERT parameters带有 MySQL INSERT 参数的 C#
【发布时间】:2013-04-16 14:00:20
【问题描述】:

大家好,我正在使用 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();

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

Person 列不能为空

已编辑:

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

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

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

已编辑:

我尝试使用它。我发现它here 所以我认为它会工作但给了我这个错误

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

有什么想法吗?

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

谢谢!

【问题讨论】:

  • 你能发布你得到的确切异常吗? Normaly 你应该像其他人所说的那样使用 AddWithValue 。 Add 已折旧,因此您不应使用它
  • 那里。我在cmd.ExecuteNonQuery(); 中有一个例外@ 是的,我知道。你看我正在使用 Visual C# 2010 并且我尝试使用 AddWithValue 但似乎 2010 不支持它。不知道我说的对不对。
  • 我目前正在使用 vs2008 并使用它。在我的大学里,我们有 vs2010,我们正在使用 AddWithValue
  • 真的吗?这在我使用 AddWithValue 时出现。 MySql.Data.MySqlClient.MySqlParameterCollection' does not contain a definition for 'AddWithValue' and no extension method 'AddWithValue' accepting a first argument of type 'MySql.Data.MySqlClient.MySqlParameterCollection' could be found (are you missing a using directive or an assembly reference?)

标签: c# mysql database sql-insert


【解决方案1】:

使用AddWithValue 方法:

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

【讨论】:

  • 我做不到。我给了我一个错误。它只让我使用 comm.Parameters.Add("@person", )
  • @BoyKarton,可能是你的MySql连接器版本,你需要去掉@符号,换成?
  • 我尝试将所有 @ 更改为 ?是的..它不会给我错误,但不会插入到我的数据库中。
【解决方案2】:
comm.Parameters.Add("person", "Myname");

【讨论】:

    【解决方案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 及更高版本中支持)。

    【讨论】:

    • 您是否将 AllowUserVariables=true 添加到您的连接字符串中?
    • 可以,但不支持。
    • 您是否这样做过:ConnectionString = "DataSource=xx;Database=test;UserID=xx;Password=xx;PORT=xx;Allow Zero Datetime=True;allow user variables = true"; ?也许显示您的连接字符串...(从版本 5.2.2 开始支持,您有哪个版本?)
    • 这里。我添加了允许用户变量,但它说不支持。 connectionString="Server=localhost;Database=super;uid=root;password=root;允许用户变量=true;"
    • 你用的是什么mysql版本?
    【解决方案4】:

    您可以使用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();
    

    希望对你有帮助...

    【讨论】:

    • 我正在使用 Visual C# 2010 Express。第一个不允许我使用 AddWithValue.. 我已经尝试过第二个.. 不会给我错误但不会插入到我的数据库中。
    • 这太令人困惑了......官方文档说使用@ - dev.mysql.com/doc/connector-net/en/… - 但它对我不起作用,只有? 起作用。
    【解决方案5】:

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

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

    或:

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

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

    希望这会有所帮助。

    【讨论】:

    • 我试过这样做cmd.Parameters.Add("@person", MySqlDbType.VarChar).Value = "myname";,但仍然是同样的错误。不知道哪里出错了
    • comm.Parameters.Add("@person",SqlDbType.VarChar).Value = TextBox1.Text; //看看是否还会出现这样的错误。
    • 还是不行。我什至尝试重新输入所有内容。还是同样的错误。不知道我哪里错了。
    【解决方案6】:

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

    根据文档:

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

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

    MySQL::MySQLCommand

    【讨论】:

      【解决方案7】:

      尝试在 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);
          }
      }
      

      【讨论】:

        【解决方案8】:

        试试这个,它正在工作

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

        【讨论】:

          【解决方案9】:

          我的做法是这样的。

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

          【讨论】:

          • 你能补充一下你的答案有什么不同吗?解释您所做的事情有助于未来的读者更快地理解并获得更多代表。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-15
          • 2011-07-19
          • 1970-01-01
          • 2010-10-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多