2

我正在使用 c# 导入 excel。但是 CustomerOrderNR 列包含这些类型的值:

20283
20213
20625
50749-50
30687
31975
82253

但是当我执行这些代码时:

    string QTam = @"SELECT Date, [Serial Number], [Status Code], Description, CustomerOrderNR FROM [Sheet1$]";

    DataSet ds = new DataSet();
    OleDbDataAdapter cmd = new OleDbDataAdapter(QTam, strConn);
    cmd.Fill(ds, "orders");

它返回 System.Double 数据类型的 CustomerOrderNR 列。我想更改数据表列类型,但随后返回异常,例如:

Cannot change DataType of a column once it has data.

不能在 SQL 语句中将 Column 的 DataType 从 Double 更改为 String 吗?

4

4 回答 4

2

excel 中的混合数据类型总是有问题的。

这是一个可能有助于
OleDB 和混合 Excel 数据类型的答案:缺失数据

这是另一个很好的解释

http://munishbansal.wordpress.com/2009/12/15/importing-data-from-excel-have-mixed-data-types-in-a-column-ssis/

于 2011-03-17T16:12:44.723 回答
2

我不确定如何在 SQL 中强制使用数据类型,但您可以通过克隆数据集模式在数据集中更改数据类型,然后使用 ImportRow 复制数据。

但是,如果要将 Excel 中的数据类型视为字符串,则应该将其更改为字符串。

于 2011-03-17T16:04:16.523 回答
2

查看您的连接字符串。您可能需要包含 ISAM=1 以便 excel 知道将混合列作为文本处理。

于 2011-03-17T17:34:21.670 回答
0

如果您有预先确定的字段列表及其预期的数据类型,我相信,这应该是最易于维护的方法:

创建一个 xml 架构,如下所示:

<?xml version="1.0" encoding="utf-16"?>
<xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
  <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="Table">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="Field1" type="xs:int" minOccurs="0" />
              <xs:element name="Field2" type="xs:string" minOccurs="0" />
              <xs:element name="Field3" type="xs:date" minOccurs="0" />
              <xs:element name="Field4" type="xs:double" minOccurs="0" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:choice>
    </xs:complexType>
  </xs:element>
</xs:schema>

并阅读:

string query = "SELECT Field1, Field2, Field3, Field4 FROM [" + row["TABLE_NAME"].ToString() + "]";

DataSet ds = new DataSet();
ds.ReadXmlSchema(@".\MySchema.xsd");
OleDbDataAdapter data = new OleDbDataAdapter(query, Connection);
data.Fill(ds);
ds.Tables[0].TableName = row["TABLE_NAME"].ToString().Replace("$", string.Empty);`

捕获日期格式必须对系统设置有效的问题是短日期为“dd/mm/yy”

一旦设置了类型,您可以根据需要进行格式化。

于 2014-11-03T09:17:39.230 回答