DataAdapter.Fill(Dataset)

11

我试图通过 OleDB 在 DataSet 中获取 Access 数据库中的一些数据。但是在调用 Fill() 方法后,DataSet 是空的。当我手动在 D* 中触发它们时,相同的语句有效并返回 1 行。

OleDbConnection connection = 
   new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Inventar.accdb");
DataSet1 DS = new DataSet1();
connection.Open();

OleDbDataAdapter DBAdapter = new OleDbDataAdapter(
    @"SELECT tbl_Computer.*,  tbl_Besitzer.*
      FROM tbl_Computer 
      INNER JOIN tbl_Besitzer ON tbl_Computer.FK_Benutzer = tbl_Besitzer.ID 
      WHERE (((tbl_Besitzer.Vorname)='ma'));", 
    connection);

DBAdapter.Fill(DS);

提前感谢。

新的工作代码:

DataSet ds = new DataSet();
OleDbDataAdapter DBAdapter = new OleDbDataAdapter();

OleDbConnection connection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Inventar.accdb");
string query = @"
    SELECT tbl_Computer.*,  tbl_Besitzer.*
    FROM tbl_Computer 
    INNER JOIN tbl_Besitzer ON tbl_Computer.FK_Benutzer = tbl_Besitzer.ID 
    WHERE (((tbl_Besitzer.Vorname)='ma'));";

connection.Open();

using (OleDbCommand command = new OleDbCommand(query, connection))
using (OleDbDataAdapter adapter = new OleDbDataAdapter(command))
{
    adapter.Fill(ds);
}

Dictionary<string, string> DictValues = new Dictionary<string, string>();

for (int i = 0; i <= ds.Tables[0].Rows[0].ItemArray.Length - 1; i++)
{
    MessageBox.Show(ds.Tables[0].Rows[0].ItemArray[i] + " -- " + ds.Tables[0].Rows[0].Table.Columns[i]);
    DictValues.Add(ds.Tables[0].Rows[0].Table.Columns[i].ToString(), ds.Tables[0].Rows[0].ItemArray[i].ToString());
}

现在正确的代码已经发布,使用字典可以更方便地访问数据。 希望有人能从这篇文章中找到帮助。感谢大家的支持!


你的数据集中有任何表格吗?我认为你可能需要添加一些具有相应结构的表格。 - Blablablaster
2
@Blabla:这不是必需的。模式将自动填充。 - abatishchev
4个回答

21
DataSet ds = new DataSet();

using (OleDbConnection connection = new OleDbConnection(connectionString))
using (OleDbCommand command = new OleDbCommand(query, connection))
using (OleDbDataAdapter adapter = new OleDbDataAdapter(command))
{
    adapter.Fill(ds);
}

return ds;

@abatishchev:那只是一个建议,不是吗?它解决了问题吗? - Akram Shahda
@Akram:如果查询正确,这段代码将百分之百地完成工作。 - abatishchev
怎样获取这些值呢?ds.Tables[0].Rows[0].ItemArray[0]不起作用。 - Marcus
我需要与数据库中的格式相同的格式。我在我的问题中放了一些代码,你可以看一看它是alpha版的 :-) 希望你能给我一个提示。 - Marcus
2
@用户:我看到你每次都调用ds.Tables[0].Rows[0]。不要这样做,应该缓存起来:var arr = ds.Tables[0].Rows[0].ItemArray,然后下次直接使用arr - abatishchev
显示剩余4条评论

2
你需要做以下事情:
OleDbConnection connection = new OleDbConnection(
    "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Inventar.accdb");
DataSet DS = new DataSet();
connection.Open();

string query = 
    @"SELECT tbl_Computer.*,  tbl_Besitzer.*
    FROM tbl_Computer 
    INNER JOIN tbl_Besitzer ON tbl_Computer.FK_Benutzer = tbl_Besitzer.ID 
    WHERE (((tbl_Besitzer.Vorname)='ma'))";
OleDbDataAdapter DBAdapter = new OleDbDataAdapter();
DBAdapter.SelectCommand = new OleDbCommand(query, connection); 
DBAdapter.Fill(DS);

顺便问一下,这个 DataSet1 是什么?应该是 "DataSet"。

我同意Reniuz的看法,我认为这段新代码在逻辑上没有带来任何变化。 - Marcus
@用户:请不要提出这样的编辑建议。只需编辑您自己的帖子(问题)。 - abatishchev
1
@ Akram Shahda 和 @Reniuz。问题只是一个打字错误。用户写的不应该是 DataSet1,而是 DataSet。 - Hasan Fahim
如何使得访问 ds.Tables[0].Rows[0].ItemArray 更加方便?这种方式下,object[] 中没有列名。 - Marcus
@user820831,您想从数据集中访问数据吗? - Hasan Fahim
显示剩余2条评论

0

对我来说它有效,只需更改:Provider=Microsoft.Jet.OLEDB.4.0 (VS2013)

OleDbConnection connection = new OleDbConnection(
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Z:\\GENERAL\\OFMPTP_PD_SG.MDB");
DataSet DS = new DataSet();
connection.Open();

string query =
@"SELECT * from MONTHLYPROD";
OleDbDataAdapter DBAdapter = new OleDbDataAdapter();
DBAdapter.SelectCommand = new OleDbCommand(query, connection);
DBAdapter.Fill(DS);

路易斯·蒙托亚


0
leDbConnection connection = 
new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Inventar.accdb");
DataSet1 DS = new DataSet1();
connection.Open();

OleDbDataAdapter DBAdapter = new OleDbDataAdapter(
@"SELECT tbl_Computer.*,  tbl_Besitzer.*
  FROM tbl_Computer 
  INNER JOIN tbl_Besitzer ON tbl_Computer.FK_Benutzer = tbl_Besitzer.ID 
  WHERE (((tbl_Besitzer.Vorname)='ma'));", 
connection);

1
你的答案应该包含代码解释和描述它如何解决问题。 - AbcAeffchen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接