我有一个代码可以检索一些内容并将其输入数据库:
MySqlConnection conn = new MySqlConnection(@"connection string");
MySqlCommand cmd = new MySqlCommand("INSERT INTO copy (id) VALUES ('" + Page.User.Identity.Name + "')", conn);
MySqlCommand cmd2 = new MySqlCommand("INSERT INTO copy (cv) VALUES ('" + mainEditor.Content.Replace("'", "''") + "')",conn);
conn.Open();
cmd.ExecuteNonQuery();
cmd2.ExecuteNonQuery();
conn.Close();
它连接并输入数据正常,但它输入数据而不是一个(它创建两行而不是一行)
我正在使用asp.net 3.5和mysql 5.0 我做错了什么,谢谢。
答案 0 :(得分:3)
它正在插入两行,因为您正在执行两个INSERT
语句。每次运行INSERT
时都会这样做:插入一行。
我猜你想要在填充了id
和cv
字段的情况下创建一行。其语法是INSERT INTO copy (id, cv) VALUES ('x', 'y');
所以:
MySqlCommand cmd = new MySqlCommand("INSERT INTO copy (id) VALUES ('" + Page.User.Identity.Name + "', '" + mainEditor.Content.Replace("'", "''") + "')",conn);
答案 1 :(得分:2)
这是因为正在运行两个单独的插入。您可以插入多个值,请尝试以下操作:
MySqlCommand cmd = new MySqlCommand("INSERT INTO copy (id, cv) VALUES ('" + Page.User.Identity.Name + "', '" + mainEditor.Content.Replace("'", "''") + "')", conn);
您可以用逗号分隔字段和值,以便将其插入到一个记录中。执行2个插入命令将始终创建2条记录。
答案 2 :(得分:0)
您没有说明您使用的驱动程序,因此我将使用我在dotConnect找到的文档。我会尝试沿着这些方向使用某些东西(下面的代码解释)
using( var conn = new MySqlConnection(@"connection string"))
using( cmd = new MySqlCommand("", conn) ){
cmd.CommandText = @"
INSERT INTO copy (id, cv)
VALUES (:name, :userContent)";
cmd.Parameters.Add("name", MySqlType.[correct type]]).Value = Page.User.Identity.Name;
cmd.Parameters.Add("userContent", MySqlType.[correct type], [column size]).Value = mainEditor.Content;
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
}
使用using构造是因为MySqlConnection和MySqlCommand类都实现了IDisposable接口,所以当你使用它们时需要将它们丢弃以避免可能的资源泄漏。
我在创建parametrized queries的文档中找到了:name
和:userContent
。这将允许数据库驱动程序负责从用户输入中转义所有特殊字符以避免SQL注入攻击。这部分实际上非常重要,那里有一些非常复杂的SQL注入攻击,所以有一个很好的机会只是转义'
(正如你所做的那样)是不够的。