选择不返回结果

3

我有一个关于这个SELECT语句的问题。当我在MS Access上执行它时,结果返回正确且完整。但是当我尝试通过C#执行它时,相同的查询没有返回任何结果。之前的SELECT语句是通过适配器实现的,以在dataGridView中显示选择结果。但是当我执行它时,我只得到一个带有列名的空表格。

private void getByObjectAndPollutant(string Object, string Pollutant, 
    int firstYear, int lastYear) 
{
    List<string> result = new List<string>();
    // line breaks added without concatenation, for readability.
    cmd = new OleDbCommand("SELECT object_name, p_name, mpc, emission_concentration, 
        [year] FROM Pollutants INNER JOIN (Objects INNER JOIN Emissions 
        ON Objects.o_id = Emissions.e_o_id) ON Pollutants.p_id = Emissions.e_p_id 
        WHERE (object_name = '" + Object + "' AND p_name = '" + Pollutant + "' AND 
        [year] BETWEEN " + firstYear + " AND " + lastYear + ") ;", con);          
    con.Open();
    reader = cmd.ExecuteReader();
    while (reader.Read()) {
        var myString = reader.GetString(0);
        result.Add(myString);
        richTextBox1.Text += myString;
    }
    con.Close();
}

这是我在程序中的称呼:
private void button5_Click(object sender, EventArgs e) {
    string localObject = comboBox5.Text.ToString();
    string localPollutant = comboBox4.Text.ToString();
    int localFirstYear = Convert.ToInt32(comboBox6.Text);
    int localLastYear = Convert.ToInt32(comboBox7.Text);
    getByObjectAndPollutant(localObject,localPollutant,localFirstYear,localLastYear);
}

这是 MS Access 中的 SELECT 查询:

SELECT object_name, p_name, mpc, emission_concentration, year  
FROM Pollutants 
INNER JOIN (Objects 
    INNER JOIN Emissions ON Objects.o_id=Emissions.e_o_id) 
ON Pollutants.p_id=Emissions.e_p_id  
WHERE object_name="some name" And p_name="some name" And year Between 2011 And 2015;

这是先前的方法代码:


private void getByObjectAndPollutant(string Object, string Pollutant, int firstYear, 
    int lastYear) 
{
    con.Open(); 
    DataTable dt = new DataTable(); 
    adapt = new OleDbDataAdapter(this long select); 
    adapt.Fill(dt); 
    dataGridView2.DataSource = dt; 
    con.Close();
}

我使用Reader或Adapter的主要原因是为了得到SELECT查询的结果。这个SELECT是否返回了一些内容?当这个工作成功后,我将编写基于SELECT绘制图表的方法。


也许使用string.Join(reader.GetValues(), “.”)作为快速检查,而不是使用getstring(0)。 - Alexandru Clonțea
在追加行之后,您可能还需要新的行。 - Alexandru Clonțea
可能是如何在C#中使用数据读取器循环遍历行?的重复问题。 - Alexandru Clonțea
@Progman,谢谢。我已经在问题中添加了它。 - Ysadoriel
List<string result = new List<string(); 上缺少闭合的角括号。 - wazz
显示剩余4条评论
2个回答

0

可能是组合框/下拉列表的问题。奇怪的是,comboBox5.Text 返回的是所选的,而不是文本。

尝试更改为

string localObject = comboBox5.SelectedItem.Text;
string localPollutant = comboBox4.SelectedItem.Text;

很遗憾,这个答案并没有改变什么。但是它比仅仅从组合框中获取文本要好得多。 - Ysadoriel
1
我之前进行了测试,我的组合框文本返回了正确的值,并且它们确实返回了正确的值。 - Ysadoriel

0
你好!终于我找到了解决方法。SELECT的主要目的是从数据库中获取一些数据,但是在获取时,我使用的不是Item的ID,而是Item的名称,导致没有返回结果。所以我想尝试使用IDs进行条件筛选。
因此,现在这个函数的代码如下:
private void getByObjectAndPollutant(int Object, int Pollutant, int firstYear, int lastYear)
            {          
                con.Open();
                DataTable dt = new DataTable();
                adapt = new OleDbDataAdapter("SELECT mpc, emission_concentration FROM Pollutants INNER JOIN (Objects INNER JOIN Emissions ON Objects.o_id = Emissions.e_o_id) ON Pollutants.p_id = Emissions.e_p_id WHERE Objects.o_id=" + Object + " AND Pollutants.p_id=" + Pollutant + " AND Emissions.[year] BETWEEN " + firstYear + " AND " + lastYear + ";", con);
                adapt.Fill(dt);
                dataGridView2.DataSource = dt;
                con.Close();
            }

工作函数调用的代码:
private void button5_Click(object sender, EventArgs e)
        {
            int localObject = Convert.ToInt32(comboBox4.SelectedValue.ToString());
            int localPollutant = Convert.ToInt32(comboBox5.SelectedValue.ToString());
            int localFirstYear = Convert.ToInt32(comboBox6.SelectedItem.ToString());
            int localLastYear = Convert.ToInt32(comboBox7.SelectedItem.ToString());

            getByObjectAndPollutant(localObject,localPollutant,localFirstYear,localLastYear);
        }

在结果DataGridView中,我得到了正确的数据,非常高兴!!!感谢所有试图帮助我的人!!!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接