Ассоциативный массив/хэш/хеш-таблица с использованием соединителя/NET
Вопрос
Привет, ребята, работая с asp.NET и C#, я использую плагин MySQL Connector/NET для подключения к базе данных MySQL (никаких сюрпризов!).
И это работает нормально, может подключаться, выполнять запросы и т. д. и т. п., все отлично, но можно ли вернуть хеш-таблицу или аналогичный результат?Сохраните выполнение описания той же таблицы, чтобы получить имена столбцов, и используйте эти значения для создания хэша каждый раз.
Спасибо,
Псих
Решение
Коннектор MySQL C/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");
надеюсь это поможет