You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Excel的GridView数据导入ASPxGridView并存入SQL Server数据库

实现需求的代码调整方案

1 基础调整:绑定数据到ASPxGridView

你现有代码仅完成了读取Excel数据绑定到标准GridView的逻辑,首先做如下基础修改:

  • 确保页面中已正确引入DevExpress控件库,且ASPxGridView控件已声明(假设控件ID为ASPxGridView1,可替换为你实际的ID)
  • 补充缺失的DataSet实例化、上传文件校验逻辑,新增using语句自动释放OLEDB相关资源,避免内存泄漏
  • 替换原有GridView绑定逻辑为ASPxGridView绑定
  • 适配xls、xlsx两种格式的Excel连接字符串

基础调整后的代码如下:

using System.Data.OleDb;
using System.Data.SqlClient;
using System.Configuration;
using System.IO;

protected void btnUpload_Click(object sender, EventArgs e)
{
    // 上传文件有效性校验
    if (!FileUpload1.HasFile) return;
    string fileName = Path.GetFileName(FileUpload1.FileName);
    string filePath = Server.MapPath("~/Temp/" + fileName);
    // 临时保存上传的Excel文件
    FileUpload1.SaveAs(filePath);
    
    // 区分Excel版本生成对应连接字符串
    string ext = Path.GetExtension(fileName);
    string ConStr;
    if (ext.Equals(".xls", StringComparison.OrdinalIgnoreCase))
    {
        ConStr = $"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={filePath};Extended Properties='Excel 8.0;HDR=YES;IMEX=1;'";
    }
    else
    {
        ConStr = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={filePath};Extended Properties='Excel 12.0 Xml;HDR=YES;IMEX=1;'";
    }
    
    DataSet ds = new DataSet();
    string query = "SELECT * FROM [Sheet$]";
    // using自动释放数据库连接资源
    using (OleDbConnection conn = new OleDbConnection(ConStr))
    {
        if (conn.State == ConnectionState.Closed) 
        {      
            conn.Open();
        }
        OleDbCommand cmd = new OleDbCommand(query, conn);
        OleDbDataAdapter da = new OleDbDataAdapter(cmd);    
        da.Fill(ds);    
    }
    // 临时保存数据表到Session,避免回发时数据丢失
    Session["ExcelImportData"] = ds.Tables[0];
    // 绑定数据到ASPxGridView
    ASPxGridView1.DataSource = ds.Tables[0];    
    ASPxGridView1.DataBind();
    
    // 删除临时保存的Excel文件
    File.Delete(filePath);
}

2 新增逻辑:数据保存到SQL Server数据库

根据业务场景选择以下两种实现方式:

方案1:SqlBulkCopy批量插入(适合数据量较大、无需逐行校验的场景)

将以下代码添加到上述方法的File.Delete(filePath);之前即可:

// 替换为你实际的SQL Server连接字符串名称(需在Web.config中提前配置)
string sqlConStr = ConfigurationManager.ConnectionStrings["SqlServerConn"].ConnectionString;
using (SqlConnection sqlConn = new SqlConnection(sqlConStr))
{
    sqlConn.Open();
    using (SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConn))
    {
        // 替换为你实际的SQL Server目标表名
        bulkCopy.DestinationTableName = "业务表名";
        // 若Excel列名和SQL表列名不一致,需手动添加映射关系,示例如下:
        // bulkCopy.ColumnMappings.Add("Excel列名A", "SQL表列名A");
        // bulkCopy.ColumnMappings.Add("Excel列名B", "SQL表列名B");
        bulkCopy.WriteToServer(ds.Tables[0]);
    }
}

方案2:逐行插入(适合需要对每行数据做业务校验、数据量较小的场景)

将以下代码添加到上述方法的File.Delete(filePath);之前即可:

string sqlConStr = ConfigurationManager.ConnectionStrings["SqlServerConn"].ConnectionString;
using (SqlConnection sqlConn = new SqlConnection(sqlConStr))
{
    sqlConn.Open();
    foreach (DataRow row in ds.Tables[0].Rows)
    {
        // 此处可自定义添加数据校验逻辑,不符合要求的数据可直接跳过插入
        // 替换为你实际的插入SQL语句和对应参数
        string insertSql = "INSERT INTO 业务表名(字段1,字段2,字段3) VALUES(@v1,@v2,@v3)";
        SqlCommand cmd = new SqlCommand(insertSql, sqlConn);
        cmd.Parameters.AddWithValue("@v1", row["Excel对应列1"]);
        cmd.Parameters.AddWithValue("@v2", row["Excel对应列2"]);
        cmd.Parameters.AddWithValue("@v3", row["Excel对应列3"]);
        cmd.ExecuteNonQuery();
    }
}

3 可选优化

如果需要支持用户在ASPxGridView中编辑数据后再保存到数据库,可单独新增保存按钮,点击时读取Session["ExcelImportData"]存储的DataTable,或者直接遍历ASPxGridView的行获取修改后的数据,再执行上述SQL插入逻辑即可。

内容的提问来源于stack exchange,提问作者kaziveh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 09:09:04