【问题标题】:OleDB Can't Retrieve Rows With Different DataTypeOleDB 无法检索具有不同数据类型的行
【发布时间】:2012-04-11 20:32:28
【问题描述】:

我正在尝试从 .xls 文件中检索 DataTable。以下是我的代码:

OleDbConnection MyConnection = null;
DataSet DtSet = null;
OleDbDataAdapter MyCommand = null;
MyConnection = new OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0; Data Source='" + path + "';Extended Properties=Excel 8.0;");

//path is where the .xls file located
ArrayList TblName = new ArrayList();

MyConnection.Open();
DataTable schemaTable = MyConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
foreach (DataRow row in schemaTable.Rows)
{
    TblName.Add(row["TABLE_NAME"]);
}

MyCommand = new System.Data.OleDb.OleDbDataAdapter("select * from [" + TblName[0].ToString() + "] order by Material", MyConnection);
DtSet = new System.Data.DataSet();

MyCommand.Fill(DtSet);
MyCommand.FillSchema(DtSet, SchemaType.Source);

DataTable dt = new DataTable();
dt = DtSet.Tables[0];
MyConnection.Close();

问题是:我的表中有一些不一致的行,这意味着它们不遵循其他行的数据类型

假设在 A 列中,我的单元格应该是这样的:

105161610

146161701

196171717

…………

意思是说它应该是Int32 数据类型。

这些是大多数列单元格..

我还有一些其他单元格(仍在同一列中),如下所示:

ABC9012

KDJ0981

KLP0001

.......

他们以某种方式遵循string 数据类型。

当我执行代码时,我只能将Selectint 类型的单元格设置为string,而将其他类型的单元格(string)设置为null。虽然在我的代码中我基本上明确设置了select *

有人可以建议我如何始终如一地检索这两种数据类型(而不是像现在发生的那样只有一种)吗?

【问题讨论】:

标签: c# .net datatable oledb xls


【解决方案1】:

您必须将这两种类型的数据强制转换或转换为 SQL 等价字符串,例如 varchar

尝试以下任一方法:

1. select cast(Column_A as varchar) Column_A from TableName order by Material 
2. select convert(varchar, Column_A) Column_A from TableName order by Material

【讨论】:

    【解决方案2】:

    添加excel连接字符串IMEX=1; HDR={1} 像下面的完整刺痛

    说明:IMEX=1 可以强制将混合数据转换为文本 HDR={1} 表示第一行包含列名,而不是数据标题行,如果您不想要则输入 No

    【讨论】:

      猜你喜欢
      • 2014-05-30
      • 1970-01-01
      • 1970-01-01
      • 2014-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-23
      • 1970-01-01
      相关资源
      最近更新 更多