[英]Update MySQL in C#
我有以下代码:
public partial class LogintoProfile : Form
{
public LogintoProfile()
{
InitializeComponent();
}
private void BoxPawo_TextChanged(object sender, EventArgs e)
{
//Boxen viser stjerner i stedet for text
BoxPawo.PasswordChar = '*';
//Maxlængde på Password
BoxPawo.MaxLength = 36;
}
private void BoxCopawo_TextChanged(object sender, EventArgs e)
{
//Boxen viser stjerner i stedet for text
BoxPawo.PasswordChar = '*';
//Maxlængde på Password
BoxPawo.MaxLength = 36;
}
private void Update_Click(object sender, EventArgs e)
{
string connStr = "server=localhost;user=root;database=p4_projekt;port=3306;password=Jeppesen95;charset=latin1;";
MySqlConnection conn = new MySqlConnection(connStr);
try
{
MessageBox.Show("Forbinder til databasen");
conn.Open();
string sql = "UPDATE p4_projekt.customer_table set First_name='" + BoxFornavn.Text + "',Last_name='" + BoxEfternavn.Text + "',Email='" + textBoxEmail.Text + "',Password=" + BoxPawo.Text + "WHERE Customer_id=@id";
MySqlCommand cmd = new MySqlCommand(sql, conn);
MySqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
Console.WriteLine(rdr[0] + " -- " + rdr[1]); // [] kan ikke huske om det er array plads?!
}
rdr.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
conn.Close();
Console.WriteLine("Done.");
Console.ReadLine();
}
private void TankOp_Click(object sender, EventArgs e)
{
string connStr = "server=localhost;user=root;database=p4_projekt;port=3306;password=**********;charset=latin1;";
MySqlConnection conn = new MySqlConnection(connStr);
try
{
MessageBox.Show("Forbinder til databasen");
conn.Open();
string sql = "UPDATE p4_projekt.customer_table set Balance'" + Balance.Text + "WHERE Customer_id=@id";
MySqlCommand cmd = new MySqlCommand(sql, conn);
MySqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
Console.WriteLine(rdr[0] + " -- " + rdr[1]); // [] kan ikke huske om det er array plads?!
}
rdr.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
conn.Close();
Console.WriteLine("Done.");
Console.ReadLine();
}
private void Back_Click(object sender, EventArgs e)
{
this.Hide();
Login.Login name = new Login.Login();
name.ShowDialog();
}
}
是导致我出现问题的Update_Click
方法。 我正在开发一个登录应用程序。
该页面允许用户编辑他们的信息。 但是要拥有一个update
子句,您需要一个where
语句。 如果用户知道它的ID,就可以了,因为那样我就知道了。 但就我而言,他们没有。
我读了一些可以使用参数的文章,但是我不确定。 这是登录代码:
public partial class Login : Form
{
private string connStr;
private MySqlConnection conn;
public Login()
{
InitializeComponent();
}
private void connect_to_DB()
{
try
{
connStr = "server=localhost;user=root;database=p4_projekt;port=3306;password=**********;charset=latin1;";
conn = new MySqlConnection(connStr);
conn.Open();
}
catch (MySqlException e)
{
throw;
}
}
private bool login_validation(string email, string pass)
{
connect_to_DB();
MySqlCommand cmd = new MySqlCommand();
cmd.CommandText = "Select * from customer_table where Email=@email and Password=@pass";
cmd.Parameters.AddWithValue("@email", email);
cmd.Parameters.AddWithValue("@pass", pass);
cmd.Connection = conn;
MySqlDataReader login = cmd.ExecuteReader();
if (login.Read())
{
conn.Close();
return true;
}
else
{
conn.Close();
return false;
}
}
private void buttonSubmit_Click(object sender, EventArgs e)
{
string email = textBoxEmail.Text;
string pass = textBoxPass.Text;
if (email == "" || pass == "")
{
MessageBox.Show("Tomme felter, udfyld venligst begge felter");
return;
}
bool r = login_validation(email, pass);
if (r)
{
MessageBox.Show("Korrekte oplysninger");
this.Hide();
LogintoProfile name = new LogintoProfile();
name.ShowDialog();
}
else
MessageBox.Show("Forkerte oplysninger");
}
}
您的最后一个值(密码)不在文本字段要求的单引号之间。 因此,解决该问题似乎微不足道,但是由于另一个原因,您的代码是错误的。 您永远不要将值串联在一起以形成sql命令。 这种方法会导致类似您遇到的问题,或者导致更糟的情况,即使用Sql Injection可以很容易地入侵您的代码。
请使用此处的参数化查询
string sql = @"UPDATE p4_projekt.customer_table
set First_name=@firstname, Last_name=@lastname,
Email=@email,Password=@password
WHERE Customer_id=@id";
MySqlCommand cmd = new MySqlCommand(sql, conn);
cmd.Parameters.Add("@firstname", MySqlDbType.VarChar).Value = BoxFornavn.Text;
cmd.Parameters.Add("@lastname", MySqlDbType.VarChar).Value = BoxEfternavn.Text;
cmd.Parameters.Add("@email", MySqlDbType.VarChar).Value = textBoxEmail.Text;
cmd.Parameters.Add("@password", MySqlDbType.VarChar).Value = BoxPawo.Text;
cmd.Parameters.Add("@id", MySqlDbType.Int32).Value = ???? // no value for id ???
我也注意到最后一个参数没有给出值。 @id一个,这对于更新工作至关重要。 ID参数唯一标识要更新的记录。 我想这是您检查登录是否成功时检索到的ID。 要使用此登录ID,您需要存储某种在应用程序生存期内可用的全局变量。 因此,您可以在登录表单中使用静态变量
public partial class Login : Form
{
public static int CurrentUserID = -1;
public Login()
{
......
}
private bool login_validation(string email, string pass)
{
.....
if (login.Read())
{
Login.CurrentUserID = login.GetInt32(login.GetOrdinal("ID"));
conn.Close();
return true;
}
else
{
conn.Close();
return false;
}
}
现在,在更新表单中,您可以使用CurrentUserID设置您的最后一个参数
....
cmd.Parameters.Add("@id", MySqlDbType.Int32).Value = Login.CurrentUserID;
....
您没有SQL问题* ,有业务逻辑问题。
您具有一个输入表单,其中包括以下字段:
现在,您希望用户既可以在系统未知时插入其信息,又可以在已知时更新其信息。
因此,您需要将这些属性中的一个或多个标识为唯一标识用户,以便他们在更新信息时可以提供这些属性。 该电子邮件地址将是一个不错的选择。
然后,您可以将更新查询编写为:
UPDATE ...
WHERE Email = @Email
并参数化您的查询。
* :很好,您有一个巨大的SQL注入漏洞。 请参阅如何将用户提供的输入添加到SQL语句? 。
我看不懂德语(?),但是在设计方式上有很多问题。
我本来想增加点数,但现在太多了。 我以后可以添加更多,但是连接字符串在这里吗? 为什么在这里输入密码?
这是原型吗?
首先,为什么不按要求更新问题,以便我们了解您要执行的操作。
是的,将参数提供给存储过程会更好。 一经了解,便可以添加更多信息和重构建议。 用户可以识别哪些独特信息? 您必须使用某些东西才能进行查找。 同样,我需要更多信息来帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.