此代码部分有效。它给了我第一行的第一列和第二列。但是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;
}
}
注意,您的代码还有其他问题,但不属于问题的一部分:
你可以像下面这样做:
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);