【问题标题】:Associative Array/Hash/Hashtable using Connector/NET使用连接器/NET 的关联数组/哈希/哈希表
【发布时间】:2010-11-29 10:29:09
【问题描述】:

我正在使用 asp.NET 和 c#,使用 MySQL 的连接器/NET 插件连接到 MySQL 数据库(这并不奇怪)。

而且效果很好,可以连接、运行查询等一切都很好,但是否可以返回一个 Hashtable 或类似的结果?保存在同一张表上运行描述以获取列名并使用这些值每次创建哈希。

【问题讨论】:

    标签: c# mysql hashtable


    【解决方案1】:

    我假设围绕 C# 包装的 MySQL C/C++ 连接器(而不是在 C# 中重新实现)返回一个包含结果的二元数组。这只是列和行数据,而不是列名。 API还通过mysql_fetch_field_direct()返回一个字段(列名)值——获取查询结果后的单独函数调用。这也是一个二元数组。连接器本身不包含用于将两个单独的结果(列名 + 列/行数据)合并到哈希表中的 API。

    无需进行第二次查询来获取列名,您只需在分配值的过程中为每一列调用mysql_fetch_field_direct()。这将为您提供字段名称以及该列/行中包含的数据。此时,如何安排数据(例如将其存储在哈希表中等)取决于开发人员。

    我使用一个辅助函数作为查询执行的包装器,它将每一行存储在一个二叉树中,列名是键,并返回一个树的链接列表供我处理我需要的事情。

    【讨论】:

    • 那么我可以在 C# 应用程序中使用该 API 吗?我以为它只适用于 C/C++ 应用程序。
    【解决方案2】:

    在 .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");

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2011-03-09
      • 2012-09-02
      • 2010-11-21
      • 1970-01-01
      • 2017-07-13
      • 2016-09-05
      • 1970-01-01
      • 2014-01-30
      • 2015-08-09
      相关资源
      最近更新 更多