我正在尝试使用从MYSQL Db获得的oledb dataadapter将一些数据插入excel表。这个从mysql db获得的数据包含非常长的文本,其MYSQL中的数据类型已被定义为(Varchar(1023),Text,Longtext等当我尝试将这些传递给oledb Dataadapter时,我尝试使用大小为5000的oledb.VarWChar,oledb.LongVarWChar等等。但是当我尝试运行da.update(...)时,我得到以下异常。命令。
该字段太小,无法接受您尝试添加的数据量。尝试插入或粘贴较少的数据
我无法理解我应该在oledb中使用哪些数据类型来映射到这些长文本值。
有人可以帮帮我吗?
感谢。
答案 0 :(得分:0)
我正在做类似的事情,并且遇到来自SQL Server的varchar(max)数据类型的相同错误。然而,数据的来源并不重要。从数据库获取数据时,需要为列数据类型和大小定义模式。我通过在我正在使用的数据适配器上调用FillSchema来实现这一点 -
DataTable dt = new DataTable();
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(dt);
da.FillSchema(dt, SchemaType.Source);
return dt;
如果需要,您还可以单独设置列属性。
然后我循环遍历DataTable中的每一列,并使用ADOX.NET设置我的列以便用oleDB导出。您不必使用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。这些数据类型是oleDB数据类型的ADOX.NET版本。我相信超过4000个字符应该使用LongVarWChar类型,但我不确定。您没有提到哪个版本的Excel是您的目标,但我使用Excel 2003和Excel 2007。
case "System.String":
if (maxLength > 4000)
{
return DataTypeEnum.adLongVarWChar;
}
return DataTypeEnum.adVarWChar;
LongVarWChar可以采用可容纳2 GB的大尺寸。所以不要担心尺寸太大。