C# Excel数据列名在使用Microsoft.ACE.OLEDB.12.0加载到数据集中时发生更改

C# Excel数据列名在使用Microsoft.ACE.OLEDB.12.0加载到数据集中时发生更改,c#,excel,ado.net,excel-2007,import-from-excel,C#,Excel,Ado.net,Excel 2007,Import From Excel,我有一张excel表格,有18列。其中5列具有相同的列名调用\u REASON。但是当我使用Microsoft.ACE.OLEDB.12.0将excel工作表加载到数据集中时。对于具有相同名称的列,将更改数据集中的列名。它被加载为CALL\u REASON,CALL\u REASON1,CALL\u REASON2,CALL\u REASON3,CALL\u REASON4。它们在excelsheet中显示为CALL\u REASON,CALL\u REASON,CALL\u REASON,CA

我有一张excel表格,有18列。其中5列具有相同的列名
调用\u REASON
。但是当我使用Microsoft.ACE.OLEDB.12.0将excel工作表加载到数据集中时。对于具有相同名称的列,将更改数据集中的列名。它被加载为
CALL\u REASON,CALL\u REASON1,CALL\u REASON2,CALL\u REASON3,CALL\u REASON4
。它们在excelsheet中显示为
CALL\u REASON,CALL\u REASON,CALL\u REASON,CALL\u REASON,CALL\u REASON

String properties = "Excel 8.0; HDR=YES; IMEX=1;";//properties set for connection to excel
string sSourceConstr = @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:\uploads\" + fileName + ";Extended Properties=\"" + properties + "\"";

sSourceConnection = new OleDbConnection(sSourceConstr);//creating the OLEDB connection
try
{
    //select statement to select data from the first excel sheet
    string sql = string.Format("Select * FROM [{0}]", "Sheet1$");

    //commands to fill the dataset with excel data
    OleDbDataAdapter excelAdapter = new OleDbDataAdapter();
    OleDbCommand command = new OleDbCommand(sql, sSourceConnection);
    sSourceConnection.Open();
    excelAdapter.SelectCommand = command;
    excelAdapter.Fill(surveyItemDetails, "ExcelDataTable");
}

Access可能正在为您更改列名。在数据库中可以有同名字段吗?我不这么认为。如果执行select,除非它是*,那么当有许多字段具有相同名称时,如何选择调用原因。要进行实验,请尝试使用excel将包含列的数据导出到CSV文件。然后尝试导入CSV文件以访问。有一个向导会询问您是否要保留列名、选择一个字段作为键或让Access为您创建一个字段。若要追加或创建表等,Access将告诉您是否无法使用列名,并为您创建一个列名

Access可能正在为您更改列名。在数据库中可以有同名字段吗?我不这么认为。如果执行select,除非它是*,那么当有许多字段具有相同名称时,如何选择调用原因。要进行实验,请尝试使用excel将包含列的数据导出到CSV文件。然后尝试导入CSV文件以访问。有一个向导会询问您是否要保留列名、选择一个字段作为键或让Access为您创建一个字段。若要追加或创建表等,Access将告诉您是否无法使用列名,并为您创建一个列名

数据表中不能有同名字段。事实上,您甚至不能有
CALL\u REASON
CALL\u REASON
,例如,请参见以下内容中的
异常部分:

DuplicateNameException

集合已具有具有指定名称的列。(比较不区分大小写。)


列名必须是唯一的要求非常有意义。如果允许多个列使用该名称,那么,
DataRow.Field(“CALL_REASON”)
应该返回什么?

数据表中不能有同名字段。事实上,您甚至不能有
CALL\u REASON
CALL\u REASON
,例如,请参见以下内容中的
异常部分:

DuplicateNameException

集合已具有具有指定名称的列。(比较不区分大小写。)


列名必须是唯一的要求非常有意义。如果允许有多个列使用该名称,那么,
DataRow.Field(“CALL\u REASON”)
应该返回什么?

可以向我们显示代码,包括SQL查询吗?直觉上这是
bydesign
。你能给我们看看代码,包括SQL查询吗?直觉上,这是
bydesign
。仅供参考,如果导入Access时未列出字段名,则至少在2007开启时会自动填充字段[#]。仅供参考,如果导入Access时未列出字段名,则至少在2007开启时会自动填充字段[#]。