【问题标题】:Import data from an Excel sheet into a SQL Server database将数据从 Excel 工作表导入 SQL Server 数据库
【发布时间】:2020-03-27 22:53:06
【问题描述】:

如何将Excel表格中的数据导入asp net中的SQL Server数据库?

Dim OleDbcon As New OleDbConnection((Convert.ToString("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=") & path) + ";Extended Properties=Excel 12.0;")

Dim cmd As New OleDbCommand("SELECT * FROM [Sheet1$]", OleDbcon)
Dim objAdapter1 As New OleDbDataAdapter(cmd)

OleDbcon.Open()
Dim dr As DbDataReader = cmd.ExecuteReader()

Dim con_str As String = "Data Source=.;Initial Catalog=studentdetails;Integrated Security=True"

' Bulk Copy to SQL Server 
Dim bulkInsert As New SqlBulkCopy(con_str)
bulkInsert.DestinationTableName = "Table name"
bulkInsert.WriteToServer(dr)
OleDbcon.Close()e here

【问题讨论】:

标签: c# asp.net sql-server


【解决方案1】:

将其分解为两个步骤:

1) 将文件保存在某处 - 很常见:

string saveFolder = @"C:\temp\uploads"; //在你的机器上选择一个文件夹来存放上传的文件

string filePath = Path.Combine(saveFolder, FileUpload1.FileName);

FileUpload1.SaveAs(filePath); 现在您的文件在本地,可以完成真正的工作了。

2) 从文件中获取数据。您的代码应该按原样工作,但您可以简单地以这种方式编写连接字符串:

string excelConnString = String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties="Excel 12.0";", filePath); 然后,您可以考虑删除刚刚上传和导入的文件。

为了提供更具体的示例,我们可以将您的代码重构为两种方法:

private void SaveFileToDatabase(string filePath)
{
    String strConnection = "Data Source=.\\SQLEXPRESS;AttachDbFilename='C:\\Users\\Hemant\\documents\\visual studio 2010\\Projects\\CRMdata\\CRMdata\\App_Data\\Database1.mdf';Integrated Security=True;User Instance=True";

    String excelConnString = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0\"", filePath);
    //Create Connection to Excel work book 
    using (OleDbConnection excelConnection = new OleDbConnection(excelConnString))
    {
        //Create OleDbCommand to fetch data from Excel 
        using (OleDbCommand cmd = new OleDbCommand("Select [ID],[Name],[Designation] from [Sheet1$]", excelConnection))
        {
            excelConnection.Open();
            using (OleDbDataReader dReader = cmd.ExecuteReader())
            {
                using(SqlBulkCopy sqlBulk = new SqlBulkCopy(strConnection))
                {
                    //Give your Destination table name 
                    sqlBulk.DestinationTableName = "Excel_table";
                    sqlBulk.WriteToServer(dReader);
                }
            }
        }
    } 
}


private string GetLocalFilePath(string saveDirectory, FileUpload fileUploadControl)
{


    string filePath = Path.Combine(saveDirectory, fileUploadControl.FileName);

    fileUploadControl.SaveAs(filePath);

    return filePath;

}

然后您可以简单地调用 SaveFileToDatabase(GetLocalFilePath(@"C:\temp\uploads", FileUpload1));

考虑查看 Excel 连接字符串的其他扩展属性。它们很有用!

您可能想要进行的其他改进包括将 Sql 数据库连接字符串放入配置中,并添加适当的异常处理。请考虑此示例仅用于演示!

【讨论】:

  • 对不起,我只能用 C# 帮助你。
  • 按原样工作只是为了满足我的需要。美丽的。谢谢!
    更改了从 Appconfig 检索的连接
【解决方案2】:

我们将创建一个方法数据表,我们将在数据表或数据集中获取excel表信息,然后我们将使用SQL批量将该数据推送到SQL数据库表中

protected void Button1_Click(object sender, EventArgs e)
{
try
{
SqlConnection con = new SqlConnection(@"Data 
Source=SANI2711\SQLEXPRESS;Initial Catalog=customer;Integrated 
Security=True;");
con.Open();
DataTable dt = new DataTable();
dt = DataExcel();
if (dt.Rows.Count > 0)
{
 for()
}
}
catch(Exception ex)
{
Response.Write(ex);
}
}
protected void Button2_Click(object sender, EventArgs e)
{
try
{
SqlConnection con = new SqlConnection(@"Data 
Source=SANI2711\SQLEXPRESS;Initial Catalog=customer;Integrated 
Security=True;");
con.Open();
DataTable dt = new DataTable();
dt = DataExcel();
if (dt.Rows.Count > 0)
{
 SqlBulkCopy objbulk = new SqlBulkCopy(con);
 objbulk.DestinationTableName = "customer1";
 objbulk.ColumnMappings.Add("CustomerID", "CustomerID");
 objbulk.ColumnMappings.Add("City", "City");
 objbulk.ColumnMappings.Add("Country", "Country");
  objbulk.ColumnMappings.Add("PostalCode", "PostalCode");
  objbulk.WriteToServer(dt);
  }
 }
 catch (Exception ex)
 {
 Response.Write(ex);
 }
 }
 protected DataTable DataExcel()
 {
 DataTable dt = new System.Data.DataTable();
 try
 {
 string filenname=@"C:\Users\sani singh\Documents\Excel03.xls";
string sWorkbook = "[Sheet1$]";
 string ExcelConnectionString=@"Provider=Microsoft.Jet.OLEDB.4.0;Data 
Source="+filenname+";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'";
 OleDbConnection OleDbConn = new OleDbConnection(ExcelConnectionString);
 OleDbConn.Open();
 OleDbCommand OleDbCmd = new OleDbCommand(("SELECT * FROM " + sWorkbook), 
 OleDbConn);
 DataSet ds = new DataSet();
 OleDbDataAdapter sda = new OleDbDataAdapter(OleDbCmd);
 sda.Fill(ds);
 dt = ds.Tables[0];
 OleDbConn.Close();
 }
 catch(Exception ex) 
 {
 Response.Write(ex);
 }
 return dt;
 }
 }
 }

【讨论】:

    【解决方案3】:

    添加一个DataTable,可以保存通过OLEDb生成的Excel数据。

    string excelconnectionstring = String.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + excelfilepath + ";Excel 12.0 Xml;HDR=YES;IMEX=1;TypeGuessRows=0;ImportMixedTypes=Text;Jet OLEDB:Max Buffer Size=256;");
    
    using (OleDbConnection oledbconn = new OleDbConnection(excelconnectionstring))
      {
                        using (OleDbCommand oledbcmd = new OleDbCommand(myexceldataquery, oledbconn))
                        {
                            oledbconn.Open();
                            OleDbDataReader dr = oledbcmd.ExecuteReader();
    
    
                            dtBulkUpload.Load(dr);
    }
    }
    

    然后将这个DataTable序列化为XML,可以发送到SQL Stored Proc。如果字段太多,这种方法非常有用,您可以在单个参数中发送所有内容

    using (StringWriter strXML = new StringWriter())
    {
       dtBulkUpload.TableName = "BulkUpload";
       dtBulkUpload.WriteXml(strXML, XmlWriteMode.IgnoreSchema, false);
       xmlString = strXML.ToString();
    }                                     
    
    
    
    using (SqlCommand cmd = new SqlCommand("Stored PROC Name"))
    {
       cmd.Parameters.AddWithValue("@dtBulkUpload", bulkUploadData);
                            //SqlParameter returnParameter = cmd.Parameters.Add("@result", SqlDbType.NVarChar);
                            //returnParameter.Direction = ParameterDirection.Output;
                            cmd.Parameters.Add("@result", SqlDbType.NVarChar,3000);
                            cmd.Parameters["@result"].Direction = ParameterDirection.Output;
    
                            cmd.Connection = con;
                            cmd.CommandType = CommandType.StoredProcedure;
    
                            con.Open();
                            cmd.ExecuteNonQuery();
                            query = (string)(cmd.Parameters["@result"].Value.ToString());
                            con.Close();
    

    【讨论】:

    • 您正在使用“dtBulkUpload”对象,该对象未在代码中的任何位置初始化
    猜你喜欢
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    • 2018-04-17
    • 2012-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多