Я пытаюсь вставить некоторые данные в excel-лист, используя oledb dataadapter, который получен из MYSQL Db. Эти данные, полученные из mysql db, содержат очень длинные тексты, типы данных которых в MYSQL определены как (Varchar (1023), Text, Longtext и т.д.). Когда я пытаюсь передать их в oadd Dataadapter, я попытался использовать oledb.VarWChar, oledb.LongVarWChar с размером 5000 и так далее. Но я получаю следующее исключение, когда пытаюсь запустить da.update(...) команда.
Поле слишком мало, чтобы принять объем данных, которые вы пытались добавить. Попробуйте вставить или вставить меньше данных
У меня возникли проблемы с пониманием типов данных, с какими размерами я должен использовать в oledb для сопоставления с этими длинными текстовыми значениями.
Может ли кто-нибудь помочь мне в этом?
Спасибо.
Я делаю что-то подобное и сталкивался с той же ошибкой с типами данных 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 ГБ. Поэтому не беспокойтесь о том, чтобы размер был слишком большим.