试图使用C#/ASP.NET将数据从电子表格迁移到数据库

试图使用C#/ASP.NET将数据从电子表格迁移到数据库,c#,asp.net,C#,Asp.net,我收到一份Excel电子表格,需要导入数据库中的表中。我以前问过如何从电子表格中提取单个单元格的数据(),我正试图以此为基础,将整个电子表格移动到数据库中 信息格式为第1列=姓名,第2列=工资,第3列=部门 现行守则如下: #region Initialize Connection var Class_Connection = new SQL_Connection(); var sql = new SQL_Statements(); Class_Connection.cnn.Close(); #

我收到一份Excel电子表格,需要导入数据库中的表中。我以前问过如何从电子表格中提取单个单元格的数据(),我正试图以此为基础,将整个电子表格移动到数据库中

信息格式为第1列=姓名,第2列=工资,第3列=部门

现行守则如下:

#region Initialize Connection
var Class_Connection = new SQL_Connection();
var sql = new SQL_Statements();
Class_Connection.cnn.Close();
#endregion

string properties = String.Format(@"Provider = Microsoft.ACE.OLEDB.12.0; Data Source = \\Hera\Public\LumberPrices\lbr_ems.xls; Extended Properties = 'Excel 8.0; HDR = NO;'");
string Price = "";

using (OleDbConnection conn = new OleDbConnection(properties))
{
    string sqlpull = "SELECT * FROM [" + worksheet + "$" + Cell1 + ":" + Cell2 + "]";
    conn.Open();

    DataSet ds = new DataSet();
    //string columns = String.Join(",", columnNames.ToArray());

    using (OleDbDataAdapter da = new OleDbDataAdapter(sqlpull, properties))
    {
        string temp2 = "";

        var dt = new DataTable();
        da.Fill(dt);

        for (int i = 0; i < dt.Columns.Count; i++)
        {
            temp2 = dt.Columns[i].ColumnName.ToString();
        }

        foreach (DataRow dr in dt.Rows)
        {
            Price = dr[temp2].ToString();
        }
    }
}

int Freight = GetFreight(LumbDesc);
int price1 = Convert.ToInt32(Price);
int addon = Convert.ToInt32(AddTo);
int Total = price1 + addon + Freight;

//TODO: insert into TLumberprice
string sqlStatement = "insert table([LumberCode], [Price], [PriceDate], [UserName], [Factor], [Op])" +
                      "values ('" + LumbDesc + "', '" + Total + "', '" + DateTime.Now + "', '" + LoginSession.userName.Remove(LoginSession.userName.Length - 1) + "', '" + Factor + "', '" + OP + "')";

#region Insert Lumber Prices
Class_Connection.cnn.Open();

SqlCommand InsertLumberPrices = new SqlCommand(sqlStatement, Class_Connection.cnn);
InsertLumberPrices.ExecuteNonQuery();

Class_Connection.cnn.Close();
#endregion

有一种方法可以将数据从数据表导入SQL表。 您需要使用SqlBulkCopy

var sqlBulkCopy=新的sqlBulkCopy(conn)

您甚至可以将哪个数据表列映射到哪个SQL表列

这里有一个例子

using(var sqlBulkCopy = new SqlBulkCopy(conn))
{
    sqlBulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping("Column 1", "Name"));
    sqlBulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping("Column 2", "Wage"));
    sqlBulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping("Column 3", "Department"));
    sqlBulkCopy.DestinationTableName = "table" // table name in SQL

    conn.Open();
    sqlBulkCopy.WriteToServer(dt);
    conn.Close();
}
其中conn是您的SqlConnection

如果不想使用数据表,可以直接转到BulkImport

只需将OleDbDataAdapter更改为OleDbCommand,并将该值放入IDataReader变量中,然后您就可以在上面的代码中使用该变量而不是dt


在最后一部分中,我过去只在两个彼此没有链接的SQL服务器之间执行此操作。我不能百分之百确定它是否能与OleDb一起工作。

我喜欢您的解决方案简洁明了,易于理解。我的后续问题是“这是否允许外部信息?”具体来说,我需要根据工资字段输入日期和加班率。我会坦率地承认我不是一个程序员,查阅技术数据会让我目瞪口呆。等等。。。我可以将需要的数据插入DataTable,然后使用SqlBulkCopy将整个内容移动到数据库表中。对吗?在使用SqlBulkCopy之前,您可以在DataTable中输入数据,但是您需要在使用Excel数据填充DataTable之前创建DataTable,或者在Excel中添加其他空列,然后将其加载到DataTable中。如果不这样做,您将无法在DataTable中添加额外信息的列。或者,您可以使用SqlBulkCopy,然后对SQL数据库进行更新。因此,就这个回答线程而言,我希望让代码尽可能自动化,就是执行一个BulkCopy,然后返回并“在当前日期为空的表中插入一个日期”,对吗?还有第二个参数(“第1列”,“名称”)我需要将其更改为Excel表和表格中的实际值,对吗?例如(“员工姓名”、“员工姓名”)
using(var sqlBulkCopy = new SqlBulkCopy(conn))
{
    sqlBulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping("Column 1", "Name"));
    sqlBulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping("Column 2", "Wage"));
    sqlBulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping("Column 3", "Department"));
    sqlBulkCopy.DestinationTableName = "table" // table name in SQL

    conn.Open();
    sqlBulkCopy.WriteToServer(dt);
    conn.Close();
}