C# 如何在web窗体应用程序中使用asp.net c将Excel数据上载到具有自动递增Id字段的SQL Server表中?
我读了穆达萨尔·艾哈迈德·汗在华盛顿的一篇精彩文章。它介绍了如何使用asp.net和C将Excel文件上载到SQL Server数据库表中 它工作得很好,但是我想让它在Id列自动递增的表中工作。我想知道如何修改代码,允许用户上传文件,而不必为Id列指定值 任何帮助都将不胜感激 我正在按原样使用上述教程中提供的代码-我没有做任何更改。在我尝试将其应用到实际应用程序之前,我只是想了解如何使用它 如果我需要提供更多信息,请告诉我 任何帮助都将不胜感激 谢谢, J 以下是我要修改的代码:C# 如何在web窗体应用程序中使用asp.net c将Excel数据上载到具有自动递增Id字段的SQL Server表中?,c#,asp.net,sql-server,excel,C#,Asp.net,Sql Server,Excel,我读了穆达萨尔·艾哈迈德·汗在华盛顿的一篇精彩文章。它介绍了如何使用asp.net和C将Excel文件上载到SQL Server数据库表中 它工作得很好,但是我想让它在Id列自动递增的表中工作。我想知道如何修改代码,允许用户上传文件,而不必为Id列指定值 任何帮助都将不胜感激 我正在按原样使用上述教程中提供的代码-我没有做任何更改。在我尝试将其应用到实际应用程序之前,我只是想了解如何使用它 如果我需要提供更多信息,请告诉我 任何帮助都将不胜感激 谢谢, J 以下是我要修改的代码: protect
protected void Upload(object sender, EventArgs e) {
//Upload and save the file
string excelPath = Server.MapPath("~/Files/") + Path.GetFileName(FileUpload1.PostedFile.FileName);
FileUpload1.SaveAs(excelPath);
string conString = string.Empty;
string extension = Path.GetExtension(FileUpload1.PostedFile.FileName);
switch (extension)
{
case ".xls": //Excel 97-03
conString = ConfigurationManager.ConnectionStrings["Excel03ConString"].ConnectionString;
break;
case ".xlsx": //Excel 07 or higher
conString = ConfigurationManager.ConnectionStrings["Excel07+ConString"].ConnectionString;
break;
}
conString = string.Format(conString, excelPath);
using (OleDbConnection excel_con = new OleDbConnection(conString))
{
excel_con.Open();
string sheet1 = excel_con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null).Rows[0]["TABLE_NAME"].ToString();
DataTable dtExcelData = new DataTable();
//[OPTIONAL]: It is recommended as otherwise the data will be considered as String by default.
dtExcelData.Columns.AddRange(new DataColumn[3] { new DataColumn("Id", typeof(int)),
new DataColumn("Name", typeof(string)),
new DataColumn("Salary",typeof(decimal)) });
using (OleDbDataAdapter oda = new OleDbDataAdapter("SELECT * FROM [" + sheet1 + "]", excel_con))
{
oda.Fill(dtExcelData);
}
excel_con.Close();
string consString = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
using (SqlConnection con = new SqlConnection(consString))
{
using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(con))
{
//Set the database table name
sqlBulkCopy.DestinationTableName = "dbo.tblPersons";
//[OPTIONAL]: Map the Excel columns with that of the database table
sqlBulkCopy.ColumnMappings.Add("Id", "PersonId");
sqlBulkCopy.ColumnMappings.Add("Name", "Name");
sqlBulkCopy.ColumnMappings.Add("Salary", "Salary");
con.Open();
sqlBulkCopy.WriteToServer(dtExcelData);
con.Close();
}
}
}
}
以下是aspx页面标记:
<asp:FileUpload ID="FileUpload1" runat="server" />
<asp:Button Text="Upload" OnClick = "Upload" runat="server" />
以下是Excel 2003和Excel 2007或更高格式的特定于Excel的连接字符串:
<add name = "Excel03ConString" connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='Excel 8.0;HDR=YES'"/>
<add name = "Excel07+ConString" connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 8.0;HDR=YES'"/>
由于不能将标识列用于bulkcopy,因此可以将列添加到datatable: //... 使用OLEDB数据适配器oda=新的OLEDB数据适配器从[+sheet1+]中选择*,excel\u con { oda.1数据; } excel\u con.Close; dtExcelData.Columns.AddId,typeofint; int i=0; dtExcelData.Rows中的foreachDataRow dr { dr[Id]=++i; } //...
由于不能将标识列用于bulkcopy,因此可以将列添加到datatable: //... 使用OLEDB数据适配器oda=新的OLEDB数据适配器从[+sheet1+]中选择*,excel\u con { oda.1数据; } excel\u con.Close; dtExcelData.Columns.AddId,typeofint; int i=0; dtExcelData.Rows中的foreachDataRow dr { dr[Id]=++i; } //...
不要将Id字段添加到列映射中,并将SQL中的列设置为自动递增的标识列。但这只是用于插入操作,还是必须根据名称更新数据库?我不确定,但我认为对于bulkcopy,必须在所有列中插入,这样标识列将失败。在这种情况下,向yor datatable添加一列,并通过for循环其行,并增加列:row[newColumn]=++i;谢谢你的回复。我想你可能是对的。我试图按照TheShaman的建议删除Id字段的映射,但收到一个错误,说明:无法将值NULL插入列“Id”。我不知道如何执行您的建议,但我会研究并尝试一下。我添加了一个答案,请尝试。尝试此引用不要将Id字段添加到列映射中,并将SQL中的列设置为自动递增的标识列。但这只是用于插入操作,还是必须根据名称更新数据库?我不确定,但我认为对于bulkcopy,必须在所有列中插入,这样标识列将失败。在这种情况下,向yor datatable添加一列,并通过for循环其行,并增加列:row[newColumn]=++i;谢谢你的回复。我想你可能是对的。我试图按照TheShaman的建议删除Id字段的映射,但收到一个错误,说明:无法将值NULL插入列“Id”。我不知道怎么做你的建议,但我会研究并尝试一下。我添加了一个答案,尝试一下。尝试一下这个参考