Чтение многозначных столбцов из доступа в 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; источник данных =(ваш путь)

Другие вопросы по тегам