Чтение многозначных столбцов из доступа в C#
Я хотел бы использовать многозначность в доступе, чтобы облегчить пользователю.
Но при чтении в C# с помощью oledb
Я получаю первое значение, за которым следует мусор, используя columnname.value
получает несколько строк с одними и теми же данными, и отличается только тот столбец, который кажется мне пустой тратой.
Есть ли способ лучше?
Я знаю, что множественные значения не поддерживаются ни в sql, ни в Oracle, но это облегчит пользователю задачу, поэтому я хотел бы сохранить их, если это возможно.
3 ответа
Есть ли способ лучше?
Да, ODBC.
Когда дело доходит до обработки многозначных полей (созданных "Мастером поиска" в Access), Odbc
кажется, делает лучше, чем OleDb
делает. Для тестовых данных в таблице с именем [multiValueTest]
+----+-------------+------------+
| ID | Description | Attributes |
+----+-------------+------------+
| | | attribute1 |
| 1 | foo | attribute2 |
| | | attribute4 |
+----+-------------+------------+
запрос
SELECT Attributes FROM multiValueTest WHERE ID=1
действительно возвращает символы мусора при получении OleDbDataReader
объект.
Тем не менее, тот же запрос, полученный OdbcDataReader
объект, в частности
using (OdbcConnection con = new OdbcConnection())
{
con.ConnectionString =
@"Driver={Microsoft Access Driver (*.mdb, *.accdb)};" +
@"Dbq=C:\Users\Public\Database1.accdb;";
con.Open();
using (OdbcCommand cmd = new OdbcCommand())
{
cmd.Connection = con;
cmd.CommandText = "SELECT Attributes FROM multiValueTest WHERE ID=1";
OdbcDataReader rdr = cmd.ExecuteReader();
rdr.Read();
Console.WriteLine(rdr[0]);
rdr.Close();
}
con.Close();
}
возвращает одно строковое значение, подобное этому
attribute1;attribute2;attribute4
который затем можно разделить на точку с запятой (;
) характер и обрабатывается соответствующим образом.
Прошло много времени, но вы решили эту проблему? Многозначные базы данных могут, но не обязаны хранить данные в многозначных атрибутах.
Одним из вариантов может быть нормализация данных в СУБД с помощью BASIC перед экспортом, запись в новый рабочий файл в простом формате, понятном для реляционных инструментов (ADO.NET и т. Д.).
В зависимости от инструментов, которые вы используете для извлечения данных из СУБД, у вас уже может быть возможность нормализовать многозначные записи в наборе данных. Примерами таких инструментов являются UniObjects или U2.NET Toolkit для Universe и Unidata, MVSP для D3 и mvBase, QMClient для QM и MVSP для всех платформ MV.
Если вам необходимо экспортировать многозначные значения, вы можете выполнить простое разделение на метках значений (xFD) и преобразовать их в строку [] или список.
Как вы сказали, инструменты RDBMS/SQL не поддерживают несколько значений. Таким образом, чтобы перевести эти данные в реляционный / нормализованный формат, вам нужно либо создать несколько записей с некоторым дублированием данных, либо создать другую таблицу и присоединиться к ней с помощью внешнего ключа. Это одна из техник, которую различные продукты используют для того, чтобы MV выглядела как реляционная. Например, у вас будет запись о клиенте, которая указывает на таблицу CustomerPhones, в которой есть одна запись для каждого телефона для этого клиента... когда они изначально были просто многозначными значениями в вашей отдельной записи о клиенте.
Используйте провайдера msdatashape. Это обеспечивает; список с разделителями. Пример строки подключения: поставщик =MsDataShape; поставщик данных =Microsoft.ACE.OleDb.12; источник данных =(ваш путь)