我正在做一个.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。
答案 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)
方括号似乎解决了这个问题。事实证明我使用的是关键字。哼。