C# 是否可以不指定图纸名称和列?

C# 是否可以不指定图纸名称和列?,c#,asp.net,sql-server,excel,C#,Asp.net,Sql Server,Excel,所以,我正在做一个程序,它将一个excel文件导入sql数据库,如果我指定excel和数据库列的列,以及工作表名称,所有工作都会正常进行。。。查看我的代码,然后我将详细说明问题所在: protected void Upload_Click(object sender, EventArgs e) { string excelPath = Server.MapPath("~/Nova pasta/") + Path.GetFileName(FileUpload1.PostedFile.Fil

所以,我正在做一个程序,它将一个excel文件导入sql数据库,如果我指定excel和数据库列的列,以及工作表名称,所有工作都会正常进行。。。查看我的代码,然后我将详细说明问题所在:

protected void Upload_Click(object sender, EventArgs e)
{
    string excelPath = Server.MapPath("~/Nova pasta/") + Path.GetFileName(FileUpload1.PostedFile.FileName);

    string filepath = Server.MapPath("~/Nova pasta/") + Path.GetFileName(FileUpload1.FileName);
    string filename = Path.GetFileName(filepath);
    FileUpload1.SaveAs(excelPath);
    string ext = Path.GetExtension(filename);

    String strConnection = @"Data Source=PEDRO-PC\SQLEXPRESS;Initial Catalog=costumizado;Persist Security Info=True;User ID=sa;Password=1234";
    string excelConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filepath + ";Extended Properties=\"Excel 12.0 Xml;HRD=YES;IMEX=1;\"";

    OleDbConnection excelConnection = new OleDbConnection(excelConnectionString);

    OleDbCommand cmd = new OleDbCommand("Select * from [rptListaMovs_4$]", excelConnection);

    excelConnection.Open();

    cmd.ExecuteNonQuery();

    DataSet ds = new DataSet();

    SqlDataAdapter da = new SqlDataAdapter("Select * from [rptListaMovs_4$] ", strConnection);

    OleDbDataReader dReader;
    dReader = cmd.ExecuteReader();

    using (SqlBulkCopy sqlBulk = new SqlBulkCopy(strConnection))
    {
        sqlBulk.DestinationTableName = "Dados";
        sqlBulk.ColumnMappings.Add("Data Mov", "Data Mov.");
        sqlBulk.ColumnMappings.Add("Data Valor", "Data Valor");
        sqlBulk.ColumnMappings.Add("Descrição do Movimento", "Descrição do Movimento");
        sqlBulk.ColumnMappings.Add("Valor em EUR", "Valor em EUR");

        sqlBulk.WriteToServer(dReader);
    }

    excelConnection.Close();
}
相反:
“从[rptListaMovs_4$]中选择*”

我想要这个:
“从[”+SheetNameWithoutCopyPastHisName+“]中选择*”

而不是这个

sqlBulk.ColumnMappings.Add("Data Mov", "Data Mov.");
sqlBulk.ColumnMappings.Add("Data Valor", "Data Valor");
sqlBulk.ColumnMappings.Add("Descrição do Movimento", "Descrição do Movimento");
sqlBulk.ColumnMappings.Add("Valor em EUR", "Valor em EUR");

我希望有一些东西,不需要输入列名称,因为有时我想导入具有不同架构的excel,但它不允许我使用以下内容获取第一个工作表名称:

DataTable schema = excelConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
string sheetName = schema.Rows[0]["TABLE_NAME"].ToString();
至于字段名,这应该可以做到:

for(int i = 0; i < dReader.FieldCount; i++)
{
    sqlBulk.ColumnMappings.Add(dReader.GetName(i), dReader.GetName(i));
}
for(int i=0;i
cmd.ExecuteNonQuery()毫无意义。稍后使用
dReader=cmd.ExecuteReader()正确执行该命令
ExecuteOnQuery
用于插入、删除、更新和DDL语句。@OlivierJacot Descombes是的,谢谢你说已经取出了嘿!因此,它的工作表名称,真的很好!谢谢,但是对于指定的名称,出现了这个异常“指定的ColumnMapping与源或目标中的任何列都不匹配”。我的经验是,这些架构表非常混乱。可用的表和列名称因提供程序而异。在行
string sheetName=schema.Rows[0][“TABLE_NAME”]上设置断点。ToString()
和quick watch
schema.Rows[0]
,然后向下钻取columns集合以查看可用的列名。