在C# WinForm应用中,将Excel数据导入到数据库是一个常见的需求,这通常涉及到文件对话框控件的使用、Excel数据的读取以及数据库操作。以下是对提供的代码和任务的详细解析:
我们看到标题中提到的是"WinForm读取Excel 并导入到数据库相应的表里",这涉及两个主要步骤:读取Excel文件和导入数据到数据库。
1. **读取Excel文件**:
- 使用`OpenFileDialog`控件让用户选择Excel文件。在`buttonOpen_Click`事件中,当用户点击按钮并选择文件后,文件路径会存储在`ctlPath.Text`中。
- `ExceltoDataSet`方法是实现读取Excel数据的关键。这里使用了`OleDbConnection`类连接到Excel文件,采用的连接字符串是针对旧版Excel文件(.xls)的,使用了`Microsoft.Jet.OLEDB.4.0`提供程序,并指定了`HDR=Yes`表示第一行作为列名,`IMEX=1`用于处理混合数据类型。
- `conn.GetOleDbSchemaTable`获取Excel中的表格信息,然后选取第一个表格的名称。
- 使用`OleDbDataAdapter`从选定的表格中填充数据到`DataSet`,再进一步转换为`DataTable`返回。
2. **数据预处理**:
- `tsbRefresh_Click`方法用于刷新`DataGridView`显示的数据。它首先检查`ctlPath.Text`是否有值,然后移除`DataTable`的前7行数据(根据代码逻辑)。这可能是为了去除预设的表头或者其他不需要的行。
- `gridSource.DataSource = dTable`将处理后的数据绑定到`DataGridView`,以便用户查看或进一步处理。
3. **导入数据到数据库**:
- 提及了创建名为`SaleOrder`的数据库表,包含`Id`(自动递增主键)、`soCode`(nvarchar类型,不允许为空)和`soDate`(datetime类型)字段。
- 导入数据的方法有多种,这里提供了两种可能的方式:
- **方法一**:使用SQL命令批量插入。通过`SqlCommand`对象执行INSERT INTO语句,一次性将`DataTable`中的所有行插入到数据库表中。这种方法效率高,但需要处理可能出现的异常,如数据类型不匹配等。
- **方法二**:使用`SqlBulkCopy`类。这是一个高效且方便的工具,可以快速将大量数据从`DataTable`复制到SQL Server表。创建`SqlBulkCopy`实例,设置源和目标表信息,然后调用`WriteToServer`方法即可。
在实际操作中,还需要考虑错误处理、事务管理、数据库连接的关闭和释放等问题,以确保程序的健壮性和资源的有效利用。同时,对于较新的Excel格式(.xlsx),可能需要更换`ACE.OLEDB.12.0`提供程序,连接字符串也会有所不同。如果要导入的数据量很大,优化数据处理和导入过程至关重要,以避免性能瓶颈。