关于C#和Access DB检索/导航记录

时间:2016-04-28 18:21:27

标签: c# .net ms-access

我已经通过C#建立了与Access数据库的连接,虽然不是通过正常的源绑定方式,而是通过类...见下文

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace WindowsFormsApplication1
{
static class staticConnectionString
{
    public static string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=CustOrders.accdb";
}
}

当按下“下一个”按钮时,我已经记录了导航,但是我似乎无法将“上一个”按钮设置为正确,非常感谢任何帮助,这就是我用于'下一个' '按钮。

private void btnNext_Click(object sender, EventArgs e)
    {
        if (dr.Read())
        {
            txtID.Text = dr["OrderNumber"].ToString();
            //int customerID = Convert.ToInt16(dr["CustomerID"].ToString());

            txtBread.Text = dr["BreadType"].ToString();
            txtFilling.Text = dr["Filling"].ToString();
            txtTop1.Text = dr["Topping1"].ToString();
            txtTop2.Text = dr["Topping2"].ToString();
            txtTop3.Text = dr["Topping3"].ToString();
            txtTop4.Text = dr["Topping4"].ToString();
            txtSauce.Text = dr["SauceType"].ToString();
            txtToasted.Text = dr["Toasted"].ToString();
            txtCheese.Text = dr["Cheese"].ToString();
            txtDrink.Text = dr["DrinkType"].ToString();
            txtCookie.Text = dr["CookieType"].ToString();
            txtCrisp.Text = dr["CrispType"].ToString();
            txtTime.Text = dr["PickupTime"].ToString();
            txtOR.Text = dr["OrderReady"].ToString();
            txtOC.Text = dr["OrderCollected"].ToString();
            txtCode.Text = dr["Codeword"].ToString();
        }
    }

我知道它是一个简单的代码翻转以向后导航,但我无法理解它!

编辑:

namespace WindowsFormsApplication1
{
public partial class Form2 : Form
{
    String connectionString = staticConnectionString.connectionString;
    OleDbConnection con;
    OleDbCommand cmd;
    OleDbDataReader dr;

    public Form2()
    {
        InitializeComponent();
    }

    private void Form2_Load(object sender, EventArgs e)
    {
        con = new OleDbConnection(connectionString);
        try
        {
            con.Open();
            cmd = new OleDbCommand();
            cmd.CommandText = @"SELECT * FROM Orders;";
            cmd.Connection = con;
            dr = cmd.ExecuteReader();
        }
        catch (Exception err)
        {
            MessageBox.Show("A database error has occurred: " +     Environment.NewLine + err.Message);
        }
        finally
        {
            btnNext_Click(sender, e);
        }
        btnSave.Enabled = false;

    }

1 个答案:

答案 0 :(得分:1)

这里有一些问题:

  1. DataReader仅向前数据的读者。因此它无法回复记录"。
  2. 保持与数据库的持续开放连接是一个着名的坏主意。
  3. 鉴于此,您需要重新设计一下您的方法。首先,您需要定义" Next"的概念。和"以前"甚至意味着。考虑一下您的问题:

    SELECT * FROM Orders
    

    返回记录的顺序是什么?未定义。除非您实际指定排序顺序,否则数据库无法保证排序。这可能是一件简单的事情:

    SELECT * FROM Orders ORDER BY Id
    

    关键是,您需要定义一个排序。并且还了解基础数据可以在程序运行时发生变化

    一旦你有了这个,在高层次上考虑一个如下设计:

    1. 打开表单,选择"首先"记录(TOP 1?不确定Access是否使用它,您可能需要修改语法。),在表单控件中显示记录。
    2. 点击"下一步"时,使用当前显示的记录的数据来查询" next"记录。类似于:SELECT TOP 1 * FROM Orders WHERE Id > @current_id ORDER BY Id
    3. 点击&#34;上一页&#34;时,使用当前显示的记录的数据来查询&#34;之前的&#34;记录。也许类似于:SELECT TOP 1 * FROM Orders WHERE Id < @current_id ORDER BY Id DESC
    4. 每个操作都应该连接到数据库,获取所需的数据,并在非常严格的范围内关闭连接。

      基本上,不要将此应用程序视为直接与数据库表的开放接口。相反,请考虑应用程序中的每个离散操作以及特定操作应如何获取所需的数据。