在C#中查询Access '07数据库的问题

时间:2012-03-28 05:23:15

标签: c# .net sql database ms-access

我正在做一个.NET单元作为我学习的一部分。我刚刚开始,有一位讲师,因为有点没能给我最坚实的.NET基础,所以请原谅那些无趣。

我正在制作一个非常简单和通用的数据库驱动的应用程序。我正在使用C#而我正在访问Microsoft Access 2007数据库。

我已经把数据库的东西放在它自己的类中,方法只是吐出我用来提交的OleDbDataAdapters。我提供任何从主程序中执行查询DataSet对象的方法,这是我保存数据的地方(数据库中有多个表)。

我已经创建了一个非常通用的私有方法,用于执行SQL SELECT查询,并使用一些公共方法包装该方法来获取产品,orders.etc(它是一个通用的零售数据库)。

泛型方法使用单独的Connect方法实际建立连接,如下所示:

private static OleDbConnection Connect()
{
    OleDbConnection conn = new OleDbConnection(
        @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:\Temp\db.accdb");
    return conn;
}

通用方法如下:

private static OleDbDataAdapter GenericSelectQuery(
    DataSet ds, string namedTable, String selectString)
{
    OleDbCommand oleCommand = new OleDbCommand();
    OleDbConnection conn = Connect();
    oleCommand.CommandText = selectString;
    oleCommand.Connection = conn;
    oleCommand.CommandType = CommandType.Text;

    OleDbDataAdapter adapter = new OleDbDataAdapter();
    adapter.SelectCommand = oleCommand;
    adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
    adapter.Fill(ds, namedTable);

    return adapter;
}

包装器方法只传递它们从主程序接收的DataSet,命名表字符串是数据集中表的名称,然后传入要进行的查询。

我给它的哪个查询无关紧要(即使像SELECT * FROM TableName那样简单)我仍然会抛出OleDbException,说明查询的FROM子句出错了。我只是使用Access构建查询,但仍然没有用。显然我的代码有问题,这实际上并不让我感到惊讶。

以下是我正在使用的一些包装方法。

public static OleDbDataAdapter GetOrderLines(DataSet ds)
{
    OleDbDataAdapter adapter = GenericSelectQuery(
        ds, "orderlines", "SELECT OrderLine.* FROM OrderLine;");
    return adapter;
}

它们看起来都一样,只是改变的SQL。

2 个答案:

答案 0 :(得分:0)

您是否尝试过更简单的方法,看看您是否可以连接到您正在寻找的表格。像

这样的东西
  DataSet ds = new DataSet();
  using (OleDbConnection myConnection = new OleDbConnection
         (@"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:\Temp\db.accdb"))
            {
            myConnection.Open();
            OleDbDataAdapter myAdapter = new OleDbDataAdapter("SELECT OrderLine.* FROM OrderLine;, myConnection);
            myAdapter.TableMappings.Add("Table", "TestTable");
            myAdapter.Fill(ds);               
            }                    

然后从那里检查是否有东西在ds中

  ds.Tables[0].Rows.Count()

这实际上会告诉您是否正在点击数据库并获得结果。从那里你可以使它更优雅

答案 1 :(得分:0)

方括号似乎解决了这个问题。事实证明我使用的是关键字。哼。