使用C#向MySQL数据库插入记录

4

我目前正在使用C# WPF开发应用程序。我试图将数据存储到MySQL数据库中。以下是我的代码。

 MySqlCommand cmd = new MySqlCommand("", conn);

                cmd.CommandText = "INSERT INTO BUG_REPORTS (bug_softwareID, bug_firstName, bug_lastName, bug_email, bug_description, bug_ip_addr, bug_dateReported) "
                    + "VALUES (@softwareID, @firstName, @lastName, @email, @description, @ip_addr, @dateReported)";

                cmd.Parameters.Add("@softwareID");
                cmd.Parameters.Add("@firstName");
                cmd.Parameters.Add("@lastName");
                cmd.Parameters.Add("@email");
                cmd.Parameters.Add("@description");
                cmd.Parameters.Add("@ip_addr");
                cmd.Parameters.Add("@dateReported");

                cmd.Parameters["@softwareID"].Value = softwareID;
                cmd.Parameters["@firstName"].Value = getFirstName();
                cmd.Parameters["@lastName"].Value = getLastName();
                cmd.Parameters["@email"].Value = getEmail();
                cmd.Parameters["@description"].Value = getDescription();
                cmd.Parameters["@ip_addr"].Value = ip_addr;
                cmd.Parameters["@dateReported"].Value = date;

                cmd.ExecuteNonQuery();

每次我尝试插入一条记录时,都会出现错误“只能存储MySQLParameter对象”。我做错了什么?我找到了文章,但似乎一切都没问题。

感谢您能提供的任何帮助。

4个回答

2
在你的参数中尝试使用以下内容:
cmd.Parameters.Add(new OdbcParameter("@softwareID", softwareID));

接下来的参数也是如此。

说实话,如果您不验证文本并担心注入攻击,直接构建 SQL 并执行命令可能会更简单。


1
谢谢您的帮助。我已经让它工作了,但不完全是您建议的方式,但您的答案确实帮了我。我没有使用Odbc,所以我省略了OdbcParameter,现在它已经过时并建议使用其他方法。因此,我使用了cmd.Parameters.AddWithValues("@softwareID", softwareID));。 - Boardy

0

MySql .NET 连接器中的参数标识符为“?”。

因此,您必须使用以下代码:

cmd.CommandText = "INSERT INTO BUG_REPORTS (bug_softwareID, bug_firstName, bug_lastName, bug_email, bug_description, bug_ip_addr, bug_dateReported) "
                        + "VALUES (?softwareID, ?firstName, ?lastName, ?email, ?description, ?ip_addr, ?dateReported)";

cmd.Parameters.Add("?softwareID");
cmd.Parameters.Add("?firstName");
cmd.Parameters.Add("?lastName");
cmd.Parameters.Add("?email");
cmd.Parameters.Add("?description");
cmd.Parameters.Add("?ip_addr");
cmd.Parameters.Add("?dateReported");

cmd.Parameters["?softwareID"].Value = softwareID;
cmd.Parameters["?firstName"].Value = getFirstName();
cmd.Parameters["?lastName"].Value = getLastName();
cmd.Parameters["?email"].Value = getEmail();
cmd.Parameters["?description"].Value = getDescription();
cmd.Parameters["?ip_addr"].Value = ip_addr;
cmd.Parameters["?dateReported"].Value = date;

0

我不确定它是否可以直接转换,但当我想要使用T-SQL插入或更新表时,我使用.ExecuteScalar()。


2
ExecuteNonQuery() 是调用 INSERT 或 UPDATE 的正确方法。ExecuteScalar() 用于返回单个值(如计数)或读取返回的第一行的第一列。 - womp

0

你尝试过使用这种风格吗?它更加紧凑,可能会解决你的问题。

cmd.Parameters.Add("@softwareID",softwareID);
cmd.Parameters.Add("@firstName",getFirstName());
cmd.Parameters.Add("@lastName",getLastName());
cmd.Parameters.Add("@email",getEmail());
cmd.Parameters.Add("@description",getDescription());
cmd.Parameters.Add("@ip_addr",ip_addr);
cmd.Parameters.Add("@dateReported",date);
cmd.ExecuteNonQuery();

是的,我尝试过那样做,但Visual Studio说add方法已经被弃用了,建议使用addwithvalues代替。 - Boardy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接