【发布时间】:2010-11-29 10:29:09
【问题描述】:
我正在使用 asp.NET 和 c#,使用 MySQL 的连接器/NET 插件连接到 MySQL 数据库(这并不奇怪)。
而且效果很好,可以连接、运行查询等一切都很好,但是否可以返回一个 Hashtable 或类似的结果?保存在同一张表上运行描述以获取列名并使用这些值每次创建哈希。
【问题讨论】:
我正在使用 asp.NET 和 c#,使用 MySQL 的连接器/NET 插件连接到 MySQL 数据库(这并不奇怪)。
而且效果很好,可以连接、运行查询等一切都很好,但是否可以返回一个 Hashtable 或类似的结果?保存在同一张表上运行描述以获取列名并使用这些值每次创建哈希。
【问题讨论】:
我假设围绕 C# 包装的 MySQL C/C++ 连接器(而不是在 C# 中重新实现)返回一个包含结果的二元数组。这只是列和行数据,而不是列名。 API还通过mysql_fetch_field_direct()返回一个字段(列名)值——获取查询结果后的单独函数调用。这也是一个二元数组。连接器本身不包含用于将两个单独的结果(列名 + 列/行数据)合并到哈希表中的 API。
无需进行第二次查询来获取列名,您只需在分配值的过程中为每一列调用mysql_fetch_field_direct()。这将为您提供字段名称以及该列/行中包含的数据。此时,如何安排数据(例如将其存储在哈希表中等)取决于开发人员。
我使用一个辅助函数作为查询执行的包装器,它将每一行存储在一个二叉树中,列名是键,并返回一个树的链接列表供我处理我需要的事情。
【讨论】:
在 .net 中你只得到数据表和数据集,数据表由数据行组成,它们与哈希表非常相似,在大多数情况下你可以使用它们来完成任务,但如果你需要哈希表,你可以使用它代码
public static Hashtable convertDataRowToHashTable(DataRow dr)
{
if (dr == null)
{
return null;
}
Hashtable ret = new Hashtable(dr.Table.Columns.Count);
for (int iColNr = 0; iColNr < dr.Table.Columns.Count; iColNr++)
{
ret[dr.Table.Columns[iColNr].ColumnName] = dr[iColNr];
}
return ret;
}
其他方向(从表到 datrow)并不容易,因为 datarow 没有公共构造函数(按设计),您必须调用 newRow = myDataTable.NewRow();获取行的新实例,然后您几乎可以像使用哈希表一样使用行
newRow["column1"]="some value";
但是如果您需要在哈希表中添加新列,则必须将列添加到数据表而不是数据行 myTable.Columns.Add("name", "type");
希望对你有帮助
【讨论】: