使用oledb数据类型将数据写入Excel工作表的问题

时间:2010-08-27 09:08:49

标签: mysql excel ado.net oledb

我正在尝试使用从MYSQL Db获得的oledb dataadapter将一些数据插入excel表。这个从mysql db获得的数据包含非常长的文本,其MYSQL中的数据类型已被定义为(Varchar(1023),Text,Longtext等当我尝试将这些传递给oledb Dataadapter时,我尝试使用大小为5000的oledb.VarWChar,oledb.LongVarWChar等等。但是当我尝试运行da.update(...)时,我得到以下异常。命令。

该字段太小,无法接受您尝试添加的数据量。尝试插入或粘贴较少的数据

我无法理解我应该在oledb中使用哪些数据类型来映射到这些长文本值。

有人可以帮帮我吗?

感谢。

1 个答案:

答案 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的大尺寸。所以不要担心尺寸太大。