OleDbDataAdapter и приведение столбцов при импорте Excel в ASP.NET - PullRequest
2 голосов
/ 17 марта 2011

Я импортирую Excel, используя C #. Но столбец 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");

Возвращается столбец CustomerOrderNR в типе данных System.Double. Я хочу изменить тип столбца с данными, но затем он возвращает исключение, например:

Cannot change DataType of a column once it has data.

Не могу ли я изменить тип данных столбца с Double на String в операторе SQL?

Ответы [ 4 ]

2 голосов
/ 17 марта 2011

Смешанные типы данных в Excel всегда проблематичны.

Вот ответ, который может помочь
OleDB и смешанные типы данных Excel: пропущенные данные

Вот еще одно приятное объяснение

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

2 голосов
/ 17 марта 2011

Посмотрите на вашу строку подключения. Возможно, вам придется включить ISAM = 1, чтобы Excel знал, что обрабатывать смешанные столбцы как текст.

2 голосов
/ 17 марта 2011

Я не уверен, как вы можете принудительно установить тип данных в SQL, но вы можете впоследствии изменить тип данных в наборе данных, клонировав схему набора данных, и скопировать данные с помощью ImportRow.

Но скорее вывероятно, следует изменить тип данных в Excel на строку, если вы хотите рассматривать его как строку.

0 голосов
/ 03 ноября 2014

Если у вас есть заранее заданный список полей и их ожидаемых типов данных, я считаю, что это должен быть наиболее приемлемый подход:

создать 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);`

улов в том, что формат даты должен быть действителен для системных настроек, в короткие сроки, как «дд / мм / гг»

как только тип установлен, вы можете отформатировать его как требуется.

...