2016-01-12 3 views
0

У меня возникают проблемы с загрузкой данных в DataTable с помощью IDataReader. Для того, чтобы держать его очень просто, я просто называю ExecuteReader() по команде, создать DataTable, вызовите Load() на нем и кормить его объект, реализующий IDataReader:Не удается вызвать DataTable.Load(), когда источник IDataReader имеет столбец Identity VARCHAR (256)

... 
if(dataReader.HasRows) 
{ 
    DataTable tempDT = new DataTable();        
    tempDT.Load(dataReader); 
    .... 
} 
... 

Это работает в подавляющем большинстве случаев. Однако, в (редких) обстоятельства, я получаю следующее исключение (имя столбца, очевидно, переменная - в данном случае, это ID):

Error - MaxLength applies to string data type only. You cannot set Column `ID` property MaxLength to be a non-negative number 

Я исследовал исходную таблицу, я пытался загрузить, и я подозреваю, что проблема связана с тем, что он имеет столбец идентификатора VARCHAR (256), который является обязательным, уникальным ключом (проблема не возникает, когда PK является обычным старым int). Этот тип ситуации действительно необычен в исходных данных, и хотя это определенно не ideal, я не могу изменить схему исходных данных.

Я посмотрел на SchemaTable более подробно, и я в недоумении:

  • ColumName - ID
  • ColumnSize - 256
  • ProviderType - NVARCHAR
  • DataType - {Имя = "String" FullName = "System.String"}
  • IsIdentity - Правда
  • IsKey - Правда
  • IsAutoIncrement - Правда
  • IsUnique - Правда

Это просто не имеет смысла для меня. Исходная таблица использует уникальные коды как идентификатор, и хотя это не так, как я бы ее разработал, это нормально. Но я не понимаю, как String/Varchar может когда-либо быть идентификатором, автоинкрементом и т. Д.

К сожалению, я нахожусь во власти этих исходных данных и не могу возиться с ним, поэтому Я надеюсь, что кто-то здесь может лучше понять, что именно происходит. Может ли кто-нибудь понять, как мне загружать() мой DataTable без, применяя все ограничения из исходных данных IDataReader? Есть ли альтернативный подход, который позволил бы избежать этой проблемы?

Спасибо за чтение, заблаговременно за помощь. Это мой первый вопрос, поэтому будьте осторожны. Если есть дополнительная информация, которая поможет, пожалуйста, дайте мне знать!

EDIT: Некоторые люди запросили полный код для загрузки DataTable. Прилагается здесь. Следует добавить, что CacheCommand/etc. приходит из этого «Assassin InterSystems.Data.CacheClient». Надеюсь, что проблема может быть решена в более общем плане. В этом случае строка Query представляет собой тест «SELECT TOP 10 *».

using (CacheConnection cacheConnection = new CacheConnection()) 
{ 
    cacheConnection.ConnectionString = connectionString; 

    cacheConnection.Open(); 

    using (CacheCommand cacheCommand = new CacheCommand(Query, cacheConnection)) 
    {      
     using (CacheDataReader cacheDataReader = cacheCommand.ExecuteReader()) 
     { 
      if (cacheDataReader.HasRows) 
      { 
       DataTable tempDT = new DataTable(); 
       tempDT.Load(cacheDataReader); // Exception thrown here. 
       cacheConnection.Close(); 
       return tempDT; 
      } 
      else 
      { 
       cacheConnection.Close(); 
       return null; 
      } 
     } 
    } 
} 

EDIT 2: В случае, если это не ясно, я пытаюсь извлечь полноту (небольшой) таблицы из кэша БД в DataTable. Обычно я делаю это, вызывая dataTable.Load (cacheDataReader), который отлично работает 99% времени, но ломается, когда исходная таблица в БД кэша имеет столбец идентификатора типа VARCHAR.

Вызов Load() на моем объекте DataTable (который пуст) заставляет его выводить схему на основе набора результатов из импортированного IDataReader (в данном случае CacheDataReader). Проблема в том, что схема в CacheDataReader указывает данные в списке выше ^, и DataTable, похоже, не позволяет свойство MaxLength, хотя тип - VARCHAR/String.

+1

Какую базу данных это? – Steve

+2

Разделите код SQL для создания таблицы, чтобы воспроизвести проблему. –

+0

@JackK вы можете показать, как вы объявляете и/или заполняете DataReader ..? покажите нам свою инструкцию Sql, пожалуйста. – MethodMan

ответ

0
SELECT TOP 10 * FROM table 
WHERE IsNumeric(ColumName) = 0 

Это будет возвращать только данные, где первичный ключ имеет тип Int

+0

, к сожалению, мне нужно извлечь таблицу, где первичный ключ _isn't_ типа int. Это varchar/string в DataTable, но DataTable, похоже, думает, что это похоже на смесь как int, так и varchar. Он не разрешает MaxLenght, как int, но говорит, что тип varchar. –

+0

затем измените его на = 0, он отбросит все значения varchar -check edit – MethodMan

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

  • Нет связанных вопросов^_^