DataAdapter.Fill(数据集)

Posted

技术标签:

【中文标题】DataAdapter.Fill(数据集)【英文标题】:DataAdapter.Fill(Dataset) 【发布时间】:2011-09-25 19:32:38 【问题描述】:

我尝试通过 DataSet 中的 OleDB 从 Access 数据库中获取一些数据。 但是 DataSetFill() 方法之后是空的。当我在 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());

现在上面发布了正确的代码,带有一个字典,可以更舒适地访问数据。 希望有人在这篇文章中找到帮助。谢谢大家让它工作!

【问题讨论】:

数据集中有表吗?我认为您可能需要添加一些具有相应结构的表 @Blabla:这不是必需的。架构会自动填充 【参考方案1】:
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:如果查询正确,这段代码将 100% 完成工作 @abatishchev:仍然没有具体说明问题,也没有提供解决方案。我认为这不是一个答案? 我怎样才能得到这些值? ds.Tables[0].Rows[0].ItemArray[0] 不起作用 @User:我看到你每次都打电话给ds.Tables[0].Rows[0]。不要那样做;改为缓存:var arr = ds.Tables[0].Rows[0].ItemArray,然后只使用arr【参考方案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 是什么?这应该是“数据集”。

【讨论】:

对不起,我看不到差异,OleDbDataAdapter 构造函数将第一个参数作为选择命令文本,并由 SelectCommand 使用。看起来你用不同的方式写了同样的东西。你能解释一下吗? 我和 Reniuz 在一起,我认为新代码不会改变逻辑 @User:请不要提出这样的修改。只需编辑您自己的帖子(问题) @Akram Shahda 和@Reniuz。我认为这个问题只是一个错字。用户没有编写 DataSet,而是编写了 DataSet1。 如何让访问更舒适如 ds.Tables[0].Rows[0].ItemArray ?这样object[]就没有Columnnames了。【参考方案3】:
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);

【讨论】:

你的答案应该包含对你的代码的解释和它如何解决问题的描述。【参考方案4】:

它适用于我,只需更改: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);

路易斯·蒙托亚

【讨论】:

以上是关于DataAdapter.Fill(数据集)的主要内容,如果未能解决你的问题,请参考以下文章

使用 C# dataAdapter.Fill() 和 dataAdapter.Update() 将表的数据从一个数据库传输到另一个数据库的同一个表

在不使用 DataAdapter.Fill 的情况下更新数据表 2 次

如何提高 dataadapter.fill 的性能?

DataAdapter.Fill 给出错误“在 sys.servers 中找不到服务器‘系统’。” [关闭]

向 dataAdapter.fill() 添加参数

如何同时执行 DataAdapter.Fill()