将数据表转换为哈希表或将SqlDataReader转换为哈希表的简便方法

17

有没有一种简单的方法将DataTable转换为HashTable,或者将SQLDataReader转换为HashTable?我必须通过javascriptserializer解析它。 我正在使用的代码存在一些问题:

try
{
    using (SqlConnection conn = new SqlConnection(ConnectionString))
    {
        using (SqlCommand cmd = new SqlCommand(query, conn))
        {
            conn.Open();
            SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            dt.Load(dr);
        }
    }

    Hashtable sendData = new Hashtable();

    foreach (DataRow drIn in dt.Rows)
    {

        sendData.Add(drIn["orderNumber"].ToString(), drIn["customerName"].ToString());

    }

    sendData.Add("orderNum", order);
    JavaScriptSerializer jss = new JavaScriptSerializer();
    string output = jss.Serialize(sendData);
    return output;
}
catch (Exception ex)
{
    return ex.Message + "-" + ex.StackTrace;
}

在从数据库中的一个表查询时,它能够给出正确结果,但在来自另一个表的查询中遇到了问题。

是否有其他方法可以解决这个问题?


3
请描述问题,并提供精确的错误信息。 - D'Arcy Rittich
你能否请发一下问题,即是哪种情况下出现了错误? - Gaurav Chaudhary
6个回答

1
您可以使用以下函数将 DataTable 转换为 HashTable:
public static Hashtable convertDataTableToHashTable(DataTable dtIn,string keyField,string valueField)   
{    
   Hashtable htOut = new Hashtable();    
   foreach(DataRow drIn in dtIn.Rows)    
   {    
      htOut.Add(drIn[keyField].ToString(),drIn[valueField].ToString());    
   }   
   return htOut;    
}

然后在您的代码中使用以下内容:

Hashtable sendData = new Hashtable();
//You need to pass datatable, key field and value field
sendData = convertDataTableToHashTable(dt, "orderNumber", "customerName");

参考:https://blog.dotnetframework.org/2006/05/03/converting-a-datatable-to-a-hashtable/将DataTable转换为Hashtable - Gauravsa

0
我认为你最好的选择是为此创建自己的扩展方法,因为这是一种特定的期望行为。
public static class DataTableExtensions 
{
    public static Hashtable ToHashtable(this DataTable dt, string key, string value)
    {
        Hashtable ht = new Hashtable();
        foreach(DataRow row in dt.Rows)
        {
            ht.Add(row[key].ToString(), row[value].ToString());
        }
        return ht;
    }

    public static Hashtable ToHashtable(this DataTable dt, int keyIndex, int valueIndex)
    {
        Hashtable ht = new Hashtable();
        foreach(DataRow row in dt.Rows)
        {
            ht.Add(row[keyIndex].ToString(), row[valueIndex].ToString());
        }
        return ht;
    }
}

以下是一些使用案例示例:

public class SomeClass{
    static void NormalWay(){
        DataTable dt = Library.RandomDataTable(); // Go get SQL Data
        Hashtable ht = dt.ToHashtable("some key column", "some value column");
        // Build a hashtable based on two specific columns
    }

    static Hashtable AnotherWay() => 
        Library
            .RandomDataTable()
            .ToHashtable(0,1); // build a hash table based on the first and second column
}

在你的代码中需要做的是适当的空值检查,因为出于简洁起见,我已经省略了它们。

0
你遇到的问题可能是表结构有问题,比如列名或数据类型, 请检查代码中使用的列名是否与查询的表中的列名匹配。
可以试试以下方法:将DataTable转换为HashTable
public static Hashtable ConvertDataTableToHashTable(DataTable dt)
{
    Hashtable ht = new Hashtable();
    foreach (DataRow dr in dt.Rows)
    {
        ht.Add(dr[0], dr[1]); // Assuming the first column contains keys and the second column contains values
    }
    return ht;
}

SQLDataReader 转换为 HashTable

 public static Hashtable ConvertDataReaderToHashTable(SqlDataReader dr)
    {
        Hashtable ht = new Hashtable();
        while (dr.Read())
        {
            // Assuming the first column contains keys and the second column contains values
            ht.Add(dr[0], dr[1]); 
        }
        return ht;
    }

你可以使用JavaScriptSerializer将其序列化为JSON格式,以便JavaScript解析。
Hashtable ht = ConvertDataTableToHashTable(dt); // Assuming dt is your DataTable object
JavaScriptSerializer serializer = new JavaScriptSerializer();
string json = serializer.Serialize(ht);

0
你可以将一列转换为MD5哈希值。

然后你可以比较两列。 - Aniket
你能提供一段简短的示例代码并将你的评论作为答案的一部分吗? - Brandon Essler
你能提供一段简短的示例代码,并将你的评论作为答案的一部分吗? - undefined

0
通常情况下,使用Linq可以避免编写foreach循环。
// Just for testing
var test = new DataTable();
test.Columns.Add("orderNumber");
test.Columns.Add("customerName");
test.Rows.Add(155, "Customer 1");

// Creating the Hashtable
Hashtable test2 = new Hashtable(
   test.Select()
       .Select(_ => new Tuple<string, string>(_.ItemArray[0].ToString(), _.ItemArray[1].ToString()))
       .ToDictionary(_=>_.Item1));

首先,您应该验证一下您的DataTable是否具有所需的两列,否则这个方法将无法工作。 第一个.Select()只是将所有数据行作为集合返回。 第二个.Select()是使用Linq进行的操作,它基本上将每个DataRow转换为指定的格式。在这种情况下是一个简单的Tuple。 使用这个Tuple集合,您现在可以创建一个Dictionary,在创建新的Hashtable时使用。
但是如果您不熟悉Linq,使用之前应该小心并了解其方法。
此外,在加载整个DataTable时,如果不使用枚举器,请注意资源的消耗。

-1
public static Hashtable Fn_ConvertDataTableToHashTable(DataTable dtTable, int iRow)
{
        Hashtable hshTable = new Hashtable();

        if (CommonUtil.Fn_CheckDatatableHasValue(dtTable))
        {
            foreach (DataColumn column in dtTable.Columns)
            {

                hshTable.Add(column.ColumnName, dtTable.Rows[iRow][column.ColumnName].ToString());
            }
        }

        return hshTable;
}

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