此代码正在运行。它给出了第一行中的第一列和第二列。但是SQL查询结果有3行,我也想读取它们。我该怎么做?也许我的方法不对,但我想不通。谢谢
private void GetDataAN()
{
string sqlAN = "SELECT SUM(Original_Kap_Adeti +Bag_Kap_Adeti), SUM(Original_Kg + Bag_Kg) FROM Antrepo_Form WHERE Antrepo_No LIKE '" + Antrepo_No.Text + "' GROUP BY Form_Tipi";
SqlCommand cmdAN = new(sqlAN, Antrepo_DB.con);
SqlDataReader drAN = cmdAN.ExecuteReader();
while (drAN.Read())
{
Antrepo_Kap.Text = drAN[0].ToString(); //1. row, 1. column
Antrepo_Kg.Text = drAN[1].ToString(); //1. row, 2. column
// Ellecleme_Kap.Text = drAN[0].ToString(); //2. row, 1. column
// Ellecleme_Kg.Text = drAN[1].ToString(); //2. row, 2. column
// Ihracat_Kap.Text = drAN[0].ToString(); //3. row, 1. column
// Ihracat_Kg.Text = drAN[1].ToString(); //3. row, 2. column
}
AN_Kap.Text = (Antrepo_Kap.Text + Ellecleme_Kap.Text + Ihracat_Kap.Text);
AN_Kg.Text = (Antrepo_Kg.Text + Ellecleme_Kg.Text + Ihracat_Kg.Text);
}
我假设Form_Tipi是一个列,它告诉您拥有什么类型的数据(Anthrepo、Ellecleme或Ihracat(。
您需要将此列包含在选择结果中,以便将其作为结果的一部分进行访问:
string sqlAN = @"SELECT SUM(Original_Kap_Adeti +Bag_Kap_Adeti),
SUM(Original_Kg + Bag_Kg),
Form_Tipi
FROM Antrepo_Form
WHERE Antrepo_No LIKE '" + Antrepo_No.Text + @"'
GROUP BY Form_Tipi";
然后,您可以在循环结果集的同时读取Form_Tipi列的值,以决定将该行的数据放在哪里:
while (drAN.Read())
{
// Get the values of the row into local variables
var kap = drAN[0].ToString();
var kg = drAN[1].ToString();
var formTipi = drAN[2].ToString();
// Now depending on formTipi fill the correct text box:
if (formTipi == 'anthrepo')
{
Antrepo_Kap.Text = kap;
Antrepo_Kg.Text = kg;
} else if (formTipi == 'ellecleme')
{
Ellecleme_Kap.Text = kap;
Ellecleme_Kg.Text = kg;
} else if (formTipi == 'ihracat')
{
Ihracat_Kap.Text = kap;
Ihracat_Kg.Text = kg;
}
}
请注意,您的代码还有其他问题,这些问题不属于问题的一部分:
- 在将用户输入用作sql语句的一部分之前,应该对其进行净化
- 在执行语句之前,应清除所有文本框,以便在找不到适合它们的数据时它们为空
- 数据库中的数据可能不是真正的字符串,而是数字数据。使用数字数据类型而不是字符串
您可以按照以下方式进行操作:
private void GetDataAN()
{
string sqlAN = "SELECT SUM(Original_Kap_Adeti +Bag_Kap_Adeti), SUM(Original_Kg + Bag_Kg) FROM Antrepo_Form WHERE Antrepo_No LIKE @Antrepo_No GROUP BY Form_Tipi";
SqlCommand cmdAN = new(sqlAN, Antrepo_DB.con);
cmdAN.Parameters.AddWithValue("@Antrepo_No", Antrepo_No.Text);
SqlDataReader drAN = cmdAN.ExecuteReader();
If(drAN.HasRows)
{
drAN.Read(); // read first row
Antrepo_Kap.Text = drAN[0].ToString(); //1. row, 1. column
Antrepo_Kg.Text = drAN[1].ToString(); //1. row, 2. column
drAN.Read(); // read second row
Ellecleme_Kap.Text = drAN[0].ToString(); //2. row, 1. column
Ellecleme_Kg.Text = drAN[1].ToString(); //2. row, 2. column
drAN.Read(); // read third row
Ihracat_Kap.Text = drAN[0].ToString(); //3. row, 1. column
Ihracat_Kg.Text = drAN[1].ToString(); //3. row, 2. column
}
AN_Kap.Text = (Antrepo_Kap.Text + Ellecleme_Kap.Text + Ihracat_Kap.Text);
AN_Kg.Text = (Antrepo_Kg.Text + Ellecleme_Kg.Text + Ihracat_Kg.Text);
}
这应该会让你开始,但我建议你在第一行放一个断点,遍历所有代码行,了解发生了什么。另外,请注意有关SQL注入的注释。此外,还要研究如何以及为什么要处理正在创建的对象(SqlDataReader和SQLCommand(。
更改:
Antrepo_Kap.Text = drAN[0].ToString(); //1. row, 1. column
Antrepo_Kg.Text = drAN[1].ToString();
收件人:
Antrepo_Kap.Text += drAN[0].ToString(); //1. row, 1. column
Antrepo_Kg.Text += drAN[1].ToString();
方法drAN.Read()
将尝试移动到下一行。如果没有下一行,它将返回false
。
您的代码将在所有行中循环,但会不断地用新行的值覆盖Antrepo_Kap
和Antrepo_Kg
,只显示最后一行的结果。
在这种情况下,您需要用数据填充6个单独的文本框。您可以使用以下内容:
// Go to the first row
drAN.Read();
Antrepo_Kap.Text = drAN[0].ToString(); //1. row, 1. column
Antrepo_Kg.Text = drAN[1].ToString(); //1. row, 2. column
// Go to the second row
drAN.Read();
Ellecleme_Kap.Text = drAN[0].ToString(); //2. row, 1. column
Ellecleme_Kg.Text = drAN[1].ToString(); //2. row, 2. column
// Go to the third row
drAN.Read();
Ihracat_Kap.Text = drAN[0].ToString(); //3. row, 1. column
Ihracat_Kg.Text = drAN[1].ToString(); //3. row, 2. column
在这种情况下,我假设总是有3行(或更多(。最好在每次调用中检查drAN.Read()
的结果,并在它为false时停止代码(或执行其他操作(,否则您将在代码的其余部分中获得异常。这还假设数据库中结果的顺序总是相同的。检查查询以确保始终保留相同的顺序,或者添加额外信息以便识别行。
此外,与前面提到的其他查询一样,您的查询容易受到sql注入的攻击。如果有人输入类似O'Brian
的文本,则会出现错误。最好使用参数,这可以如下所示:
string sqlAN = "SELECT SUM(Original_Kap_Adeti +Bag_Kap_Adeti), SUM(Original_Kg + Bag_Kg) FROM Antrepo_Form WHERE Antrepo_No LIKE @no GROUP BY Form_Tipi";
SqlCommand cmdAN = new(sqlAN, Antrepo_DB.con);
cmdAN.Parameters.AddWithValue("@no", Antrepo_No.Text);