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

Posted

技术标签:

【中文标题】使用 DataGridView 控件和 Access 数据库查询时如何处理错误?【英文标题】:How to handle an error when using DataGridView controls and Access database queries? 【发布时间】:2011-02-20 01:55:26 【问题描述】:

我有两个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;

【问题讨论】:

您是否在 Access QBE 网格中测试了没有 WHERE 子句的 SQL 字符串?括号对我来说看起来不对,Jet/ACE 对此非常敏感。 【参考方案1】:

阅读和学习本教程会更好: http://msdn.microsoft.com/en-us/library/ms171884(v=VS.80).aspx 大概需要20分钟才能完成

然后(根据需要)其余的(谷歌数据演练)

他们将教您如何正确访问数据,并且在熟悉 Visual Studio 中用于连接数据库的高级工具后,您将能够生成一个在网格中显示数据库内容的应用,并且将它们保存回数据库,甚至比您在这里写帖子还要快..

与您在此处的代码相比,该代码将具有高性能、更安全且更易于编写 - 您在此处的代码质量低下,容易受到 SQL 注入攻击,不是模块化的,也不是以适合语言的方式排列的您正在使用并且需要很长时间才能编写;总而言之,它没有任何优点(请不要被冒犯)

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

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

【讨论】:

【参考方案2】:

我认为问题出在 private void button2_Click() 中

a.ToString();

什么是?

【讨论】:

它肯定有一个价值。不是这样的。我实际上已经发现了问题。所以我现在很酷。 如果您解决了问题,则接受答案或删除问题【参考方案3】:

尝试在 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);

【讨论】:

以上是关于使用 DataGridView 控件和 Access 数据库查询时如何处理错误?的主要内容,如果未能解决你的问题,请参考以下文章

DataGridView控件-[引用]

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

C#中的控件listView 和DataGridView在运用中哪个比较好?

如何使用 C# 在 datagridview 控件中显示某些表架构列?

求ASP.NET控件属性大全

DataGridView控件的使用---添加行