作为学习的一部分,我正在做一个.net单元。我才刚开始,有一位讲师说我没能给.NET提供最坚实的基础,所以请原谅我的笨拙。
我正在制作一个非常简单和通用的数据库驱动应用程序。我正在使用c,我正在访问一个microsoft access 2007数据库。
我把数据库的东西放在它自己的类中,方法只是抛出我用来提交的oledbdataadapters。我提供任何从主程序执行数据集对象查询的方法,这是我保存数据的地方(数据库中有多个表)。
我制作了一个非常通用的私有方法,用于执行sql select查询,并使用一些公共方法包装该方法以获取产品、订单等(它是一个通用零售数据库)。
泛型方法使用单独的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;
}
包装器方法只传递它们从主程序接收的数据集,namedtable字符串是数据集中表的名称,您传递希望进行的查询。
不管我给它哪个查询(甚至是select*from tablename之类的简单查询),我仍然会被抛出一个oledbexception,指出查询的from子句有错误。我只是使用access构建查询,但仍然没有用。很明显我的代码有问题,这并不会让我吃惊。
下面是一些我正在使用的包装方法。
public static OleDbDataAdapter GetOrderLines(DataSet ds)
{
OleDbDataAdapter adapter = GenericSelectQuery(
ds, "orderlines", "SELECT OrderLine.* FROM OrderLine;");
return adapter;
}
它们看起来都一样,只是sql发生了变化。
最佳答案
您是否尝试过更简单的方法来查看您是否与要查找的表有连接。有点像
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.Tables[0].Rows.Count()
这实际上会告诉你,如果你击中数据库并得到结果。从那里你可以使它更优雅