【发布时间】:2022-01-22 20:07:16
【问题描述】:
我正在编写一个表单应用程序。用户在文本框中输入他的姓名、电子邮件、地址等,就好像他在订购包裹一样。如果用户已经下了订单,我想让用户可以在文本框中输入他的电子邮件,并根据他的电子邮件填写包裹所需的所有其他个人信息。
我遇到的麻烦是他的数据在两个不同的表中。 customer表中的数据(他的名字和姓氏)我已经成功检索到,但是表地址中的数据我不知道如何获取。
代码如下:
{
try
{
var connection = getConnection();
var command = new SqlCommand
{
Connection = connection,
CommandText = "SELECT * FROM Customer WHERE Email = @Email"
};
command.Parameters.Clear();
command.Parameters.AddWithValue("@Email", mailBox.Text);
connection.Open();
reader = command.ExecuteReader(CommandBehavior.SingleRow);
if (reader.Read())
{
fnameBox.Text = reader["fname"].ToString();
lnameBox.Text = reader["lname"].ToString();
command.CommandText = "SELECT * FROM address WHERE customerID= "+ reader["customerID"].ToString();
stateBox.Text = reader["state"].ToString(); //part where the error happens
cityBox.Text = reader["city"].ToString();
addressBox.Text = reader["address"].ToString();
zipBox.Text = reader["zip"].ToString();
int result = command.ExecuteNonQuery();
connection.Close();
if (result > 0)
{
MessageBox.Show("Success");
}
else
{
MessageBox.Show("Error");
}
}
else
{
MessageBox.Show("E-mail entered doesn't exist");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
} ```
【问题讨论】:
-
另外,为什么你正确地参数化你的第一个语句,然后注入第二个?您显然知道参数化,那么为什么要在第二个查询中创建这样一个安全漏洞?
-
@Larnu 我已经收到了阅读那篇文章的建议,我确实做到了,但不幸的是,当我开始构建应用程序时,我不知道 AddWithValue() 的问题,现在我没有足够的是时候在我的截止日期前完成它了。这是一个学校项目,因此申请不必完美无缺。老实说,我真的不知道什么是参数化,我只是在网上找到了一堆代码,然后根据这些代码和我的教授给我的代码写了我的代码,哈哈。
-
您不能在开始时只运行 1 个查询,即两个表的 SQL 连接吗? select c.fname, c.lname, a..state, a.city, a.address from customer c JOIN address a c.id = a.customerId 或类似。
-
@DaneBalia 我认为这可能是修复它的最佳方法。我尝试创建一个类似
select c.fname,c.lname,c.Email, a.state,a.city,a.street, a.zip from customer c inner join address a on c.customerID = a.customerID where c.Email = 'mail@mail'的 SQL 连接,现在它告诉我它找不到我尝试使用和不使用“”的所需电子邮件
标签: c# sql sql-server database forms