2013-09-13 3 views
0

Я хотел бы использовать многозначный доступ, чтобы сделать его проще для пользователя.чтение многозначных столбцов от доступа к C#

Но при чтении его в C# с помощью oledb я получаю первое значение с последующим мусором с помощью columnname.value получает меня несколько строк из тех же данных, и только этот столбец отличается, который кажется пустой тратой ко мне.

Есть ли лучший способ?

Я знаю, что многозначные значения не поддерживаются в sql или Oracle, но это сделает его намного проще для пользователя, поэтому я хотел бы сохранить его, если это возможно.

ответ

1

Есть ли лучший способ?

Да: 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 

, который затем может быть разделен на точку с запятой (;) характер и обрабатывается соответствующим образом.

+0

Удивительный, спасибо @Gord. Слишком поздно, вся идея доступа была сломана. :( – AngelicCore

+0

@AngelicCore О, ну, по крайней мере, этот вопрос может помочь следующему человеку. Спасибо, что согласился на ответ в любом случае. –

1

Это было давно, но вы решили эту проблему? Базы данных MultiValue могут, но не нужно хранить данные в многозначных атрибутах.

Одним из вариантов было бы нормализовать данные в СУБД с BASIC до экспорта, записывая новый рабочий файл в плоском формате, который может быть понят реляционными инструментами (ADO.NET и т. Д.).

В зависимости от инструментов, которые вы используете для извлечения данных из СУБД, вы, возможно, уже имеете возможность нормализовать многозначные записи в наборе данных. Примеры таких инструментов включают UniObjects или U2.NET Toolkit для Universe и Unidata, MVSP для D3 и mvBase, QMClient для QM и MVSP для всех платформ MV.

Если вы должны экспортировать многозначные значения, вы можете сделать простой Split на знаках ценности (xFD) и преобразовать их в строку [] или List.

Как вы сказали, средства RDBMS/SQL не поддерживают несколько значений. Поэтому для перемещения этих данных в реляционный/нормализованный формат вам потребуется либо создать несколько записей с дублированием данных, либо создать другую таблицу и присоединиться к ней с помощью внешнего ключа. Это один из способов использования различных продуктов, чтобы MV выглядел реляционным. Например, у вас будет запись Клиента, которая указывает на таблицу CustomerPhones, которая имеет одну запись для каждого телефона для этого клиента ... когда они изначально были просто многозначными в вашей отдельной записи Клиента.

+0

К сожалению нет, я вычистил эту идею, потому что она ни к чему не привела. – AngelicCore

+1

Если вы снова возьмете MVs, дайте мне знать. В зависимости от вашей платформы, местоположения и других факторов существует масса ресурсов, доступных для такого рода вещей. Вы не одиноки, но этот запрос был отправлен на сайт, который не посещают люди MV. Сейчас это начинает меняться. – TonyG

0

Использование поставщика msdatashape. Это обеспечивает; ограниченный список. Пример строки подключения: Provider = MsDataShape; поставщик данных = Microsoft.ACE.OleDb.12; Источник данных = (ваш путь)

Смежные вопросы