Проблема с использованием типов данных oledb для записи данных в таблицу Excel

0

Я пытаюсь вставить некоторые данные в excel-лист, используя oledb dataadapter, который получен из MYSQL Db. Эти данные, полученные из mysql db, содержат очень длинные тексты, типы данных которых в MYSQL определены как (Varchar (1023), Text, Longtext и т.д.). Когда я пытаюсь передать их в oadd Dataadapter, я попытался использовать oledb.VarWChar, oledb.LongVarWChar с размером 5000 и так далее. Но я получаю следующее исключение, когда пытаюсь запустить da.update(...) команда.

Поле слишком мало, чтобы принять объем данных, которые вы пытались добавить. Попробуйте вставить или вставить меньше данных

У меня возникли проблемы с пониманием типов данных, с какими размерами я должен использовать в oledb для сопоставления с этими длинными текстовыми значениями.

Может ли кто-нибудь помочь мне в этом?

Спасибо.

Теги:
excel
ado.net
oledb

1 ответ

0

Я делаю что-то подобное и сталкивался с той же ошибкой с типами данных varchar (max), которые поступают из SQL Server. Не имеет значения, откуда данные поступают. Когда вы получаете данные из своей базы данных, вам необходимо определить схему для типов и размеров столбцов. Я делаю это, вызывая FillSchema на адаптере данных, который я использую -

 DataTable dt = new DataTable();
 SqlDataAdapter da = new SqlDataAdapter(cmd);
 da.Fill(dt);
 da.FillSchema(dt, SchemaType.Source);
 return dt;

Вы также можете установить свойства столбца индивидуально, если хотите.

Затем я просматриваю каждый столбец в моей DataTable и настраиваю мои столбцы для экспорта с помощью oleDB с использованием ADOX.NET. Вам не нужно использовать ADOX.NET, основная концепция здесь - использовать размеры, которые поступают из исходной базы данных.

    foreach (DataColumn col in dt.Columns)
    {
       columnList.Append(dt.TableName + "." + col.ColumnName + ", ");
       ADOX.Column adoxCol = new Column();
       adoxCol.ParentCatalog = cat;
       adoxCol.Name = col.ColumnName;
       adoxCol.Type = TranslateType(col.DataType, col.MaxLength);
       int size = col.MaxLength > 0 ? col.MaxLength : 0;
       if (col.AllowDBNull)
       {
          adoxCol.Attributes = ColumnAttributesEnum.adColNullable;
       }
       adoxTable.Columns.Append(adoxCol, adoxCol.Type, size);
    }

Вот фрагмент моего метода TranslateType, который определяет, следует ли использовать LongVarWChar или VarWChar. Эти типы данных представляют собой ADOX.NET-версию типов данных oleDB. Я считаю, что что-то более 4000 символов должно использовать тип LongVarWChar, но я не уверен в этом. Вы не указали, какая версия Excel является вашей целью, но у меня это работает как с Excel 2003, так и с Excel 2007.

    case "System.String":
       if (maxLength > 4000)
       {
          return DataTypeEnum.adLongVarWChar;
       }
       return DataTypeEnum.adVarWChar;

LongVarWChar может принимать большие размеры, которые могут вмещать 2 ГБ. Поэтому не беспокойтесь о том, чтобы размер был слишком большим.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню