正在读取c#中具有多列的SQL查询结果



此代码正在运行。它给出了第一行中的第一列和第二列。但是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_KapAntrepo_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);

最新更新