DataAdapter.Fill(数据集)
Posted
技术标签:
【中文标题】DataAdapter.Fill(数据集)【英文标题】:DataAdapter.Fill(Dataset) 【发布时间】:2011-09-25 19:32:38 【问题描述】:我尝试通过 DataSet
中的 OleDB 从 Access 数据库中获取一些数据。
但是 DataSet
在 Fill()
方法之后是空的。当我在 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 次