大家好,我正在使用Visual C#2010和MySQL版本5.1.48社区。我希望你能帮我解决这个问题。我觉得它不适合我。我错过了什么?
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列不能为null
编辑:
但是当我尝试这段代码时。
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
非常感谢任何帮助。
EDITED: 的解决 我用了这段代码:
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();
非常感谢!
答案 0 :(得分:19)
您可以使用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();
OR
尝试使用?
代替@
,例如:
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();
希望它有所帮助...
答案 1 :(得分:6)
使用AddWithValue
方法:
comm.Parameters.AddWithValue("@person", "Myname");
comm.Parameters.AddWithValue("@address", "Myaddress");
答案 2 :(得分:4)
我有同样的问题 - 最后试过了吗? sigil而不是@,它起作用了。
根据文件:
请注意。提供程序的早期版本使用“@”符号标记SQL中的参数。这与MySQL用户变量不兼容,因此提供程序现在使用'?'用于在SQL中查找参数的符号。要支持旧代码,可以在连接字符串上设置“old syntax = yes”。如果这样做,请注意,如果您未能定义要在SQL中使用的参数,则不会抛出异常。
真的?如果有人试图使用所谓的旧语法,为什么不抛出异常呢?几个小时的耗水量为20线计划...
答案 3 :(得分:2)
三件事:使用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及更高版本中支持)
答案 4 :(得分:2)
我尝试使用Windows Form Application中的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);
}
}
答案 5 :(得分:0)
comm.Parameters.Add("person", "Myname");
答案 6 :(得分: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();
答案 7 :(得分:-1)
如有必要,请尝试调整“SqlDbType”中的代码以匹配您的数据库类型,并使用以下代码:
comm.Parameters.Add("@person",SqlDbType.VarChar).Value=MyName;
或:
comm.Parameters.AddWithValue("@person", Myname);
这应该可以工作但是记住使用Command.Parameters.Add(),你可以定义特定的SqlDbType并使用Command.Parameters.AddWithValue(),它会尝试隐式地获取基于参数值的SqlDbType,如果它有时会破坏无法隐式转换数据类型。
希望这有帮助。
答案 8 :(得分:-1)
尝试这是有效的
MySqlCommand dbcmd = _conn.CreateCommand();
dbcmd.CommandText = sqlCommandString;
dbcmd.ExecuteNonQuery();
long imageId = dbcmd.LastInsertedId;