如何在使用DataGridView控件和Access数据库查询时处理错误?

时间:2010-05-16 12:04:18

标签: c# sql ms-access datagridview

我有两个DataGridView控件。

对于第二个,我只是从第一个复制粘贴代码并改变差异所在的位置。但是当我想查看我的SQL代码的结果时,我在第二个时收到错误 用英语翻译时,错误表明至少有一个必需参数没有给出任何值。

private void button1_Click(object sender, EventArgs e)
{
    string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=save.mdb";

    try
    {
        database = new OleDbConnection(connectionString);
        database.Open();
        date =  DateTime.Now.ToShortDateString();

        string queryString = "SELECT zivila.naziv,(obroki_save.skupaj_kalorij/zivila.kalorij)*100 as Kolicina_v_gramih "
               + "FROM (users LEFT JOIN obroki_save ON obroki_save.ID_uporabnika=users.ID) "
               + "LEFT JOIN zivila ON zivila.ID=obroki_save.ID_zivila"
               + "WHERE users.ID= " + a.ToString();

        loadDataGrid(queryString);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
        return;
    }
}

public void loadDataGrid(string sqlQueryString)
{
    OleDbCommand SQLQuery = new OleDbCommand();
    DataTable data = null;
    dataGridView1.DataSource = null;
    SQLQuery.Connection = null;
    OleDbDataAdapter dataAdapter = null;
    dataGridView1.Columns.Clear(); // <-- clear columns

    SQLQuery.CommandText = sqlQueryString;
    SQLQuery.Connection = database;
    data = new DataTable();
    dataAdapter = new OleDbDataAdapter(SQLQuery);
    dataAdapter.Fill(data);
    dataGridView1.DataSource = data;
    dataGridView1.AllowUserToAddRows = false;
    dataGridView1.ReadOnly = true;
    dataGridView1.Columns[0].Visible = true;
}

private void button2_Click(object sender, EventArgs e)
{
    string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=save.mdb";

    try
    {
        database = new OleDbConnection(connectionString);
        database.Open();
        date = DateTime.Now.ToShortDateString();

        string queryString = "SELECT skupaj_kalorij  "
                + "FROM obroki_save "
                + "WHERE users.ID= " + a.ToString();

        loadDataGrid2(queryString);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
        return;
    }
}

public void loadDataGrid2(string sqlQueryString)
{
    OleDbCommand SQLQuery = new OleDbCommand();
    DataTable data = null;
    dataGridView2.DataSource = null;
    SQLQuery.Connection = null;
    OleDbDataAdapter dataAdapter = null;
    dataGridView2.Columns.Clear(); // <-- clear columns

    SQLQuery.CommandText = sqlQueryString;
    SQLQuery.Connection = database;
    data = new DataTable();
    dataAdapter = new OleDbDataAdapter(SQLQuery);
    dataAdapter.Fill(data);
    dataGridView2.DataSource = data;
    dataGridView2.AllowUserToAddRows = false;
    dataGridView2.ReadOnly = true;
    dataGridView2.Columns[0].Visible = true;
}

3 个答案:

答案 0 :(得分:1)

阅读和完成本教程你会好得多: http://msdn.microsoft.com/en-us/library/ms171884(v=VS.80).aspx 完成可能需要大约20分钟

然后(根据需要)其余部分(google for Data Walkthroughs)

他们将教您如何正确地进行数据访问,在熟悉Visual Studio中用于连接数据库的高级工具之后,您将能够生成一个将在网格中显示数据库内容的应用程序,以及把它们保存回数据库,比你在这里写帖子要快得多..

代码将是高性能,更安全,更容易编写 - 这里的代码质量低,容易出现SQL注入攻击,不是模块化的,或者以适合语言的方式排列你正在使用并且需要很长时间才能写出来;全部,它没有任何好处(请不要被冒犯)

我完全建议废弃整个事情并重新开始,按照微软教程提倡的方式做事。你花了这么多时间来做这种破碎,糟糕的做事方式,这似乎是错误的做法,但请相信我。你会很高兴你做到了;现在20分钟的投资将为您节省数千小时的编码时间

最后一点,如果您按照教程告诉您的方式执行操作时数据库数据似乎没有保存更改,请单击解决方案资源管理器中的数据库并将“复制到输出目录”更改为“如果更新则复制” - c#正在更新您的数据库,但您要么查找错误的数据库以检查它是否有效,或者每次启动应用程序时Visual Studio都会用新的数据库替换您编辑的数据库

答案 1 :(得分:0)

我认为问题出在私人空白button2_Click()和

a.ToString();

什么是?

答案 2 :(得分:0)

尝试在a.Tostring()附近加上引号:

string queryString = "SELECT zivila.naziv,(obroki_save.skupaj_kalorij/zivila.kalorij)*100 as Kolicina_v_gramih "
               + "FROM (users LEFT JOIN obroki_save ON obroki_save.ID_uporabnika=users.ID)"
               + " LEFT JOIN zivila ON zivila.ID=obroki_save.ID_zivila "
               + " WHERE users.ID= '" + a.ToString() + "'";

或使用string.format():

string queryString = string.format("SELECT zivila.naziv,(obroki_save.skupaj_kalorij/zivila.kalorij)*100 as Kolicina_v_gramih "
               + "FROM (users LEFT JOIN obroki_save ON obroki_save.ID_uporabnika=users.ID)"
               + " LEFT JOIN zivila ON zivila.ID=obroki_save.ID_zivila "
               + " WHERE users.ID= '{0}'", a);