在C#中进行数据库数据的导入导出是一个常见的需求,无论是将数据从其他数据源导入到数据库,还是将数据库中的数据导出到文件或其他格式,以便进行备份、迁移或与其他系统共享,以下是关于C#数据库数据导入导出的详细内容:
1、从CSV文件导入到SQL Server数据库
准备工作:确保有一个包含数据的CSV文件和一个目标SQL Server数据库及相应的表结构。
代码实现:
using System; using System.Data.SqlClient; using System.Data; using System.IO; namespace CsvToDatabase { class Program { static void Main(string[] args) { string csvFilePath = @"C:pathtoyourfile.csv"; string connectionString = "Your_Connection_String_Here"; string tableName = "TargetTableName"; using (SqlConnection conn = new SqlConnection(connectionString)) { conn.Open(); string sqlQuery = "SELECT * FROM OPENROWSET('MSDASQL', 'Driver={Microsoft Text Driver (*.txt; *.csv)};DefaultDir=C:\;', 'SELECT * FROM yourfile.csv')"; SqlCommand cmd = new SqlCommand(sqlQuery, conn); SqlDataAdapter adapter = new SqlDataAdapter(cmd); DataSet ds = new DataSet(); adapter.Fill(ds, tableName); conn.Close(); } } } }
注意事项:需要确保SQL Server允许使用OPENROWSET
函数,并且正确配置了文本驱动和默认目录,CSV文件的格式应与目标表的结构相匹配。
2、从Excel文件导入到SQL Server数据库
准备工作:安装EPPlus
库用于读取Excel文件,以及配置好SQL Server连接。
代码实现:
using System; using System.Data.SqlClient; using OfficeOpenXml; using System.IO; namespace ExcelToDatabase { class Program { static void Main(string[] args) { string excelFilePath = @"C:pathtoyourfile.xlsx"; string connectionString = "Your_Connection_String_Here"; string sheetName = "Sheet1"; string tableName = "TargetTableName"; FileInfo existingFile = new FileInfo(excelFilePath); using (var package = new ExcelPackage(existingFile)) { var worksheet = package.Workbook.Worksheets[sheetName]; var rowCount = worksheet.Dimension.Rows; using (SqlConnection conn = new SqlConnection(connectionString)) { conn.Open(); for (int row = 2; row <= rowCount; row++) // Assuming first row is header { string sqlQuery = $"INSERT INTO {tableName} (Column1, Column2, Column3) VALUES (@Column1, @Column2, @Column3)"; SqlCommand cmd = new SqlCommand(sqlQuery, conn); cmd.Parameters.AddWithValue("@Column1", worksheet.Cells[row, 1].Text); cmd.Parameters.AddWithValue("@Column2", worksheet.Cells[row, 2].Text); cmd.Parameters.AddWithValue("@Column3", worksheet.Cells[row, 3].Text); cmd.ExecuteNonQuery(); } conn.Close(); } } } } }
注意事项:需要根据实际情况修改列名和索引,确保Excel文件的列与数据库表的列对应准确,要注意处理Excel文件中可能存在的空值和数据类型转换问题。
3、从其他数据库导入到SQL Server数据库
准备工作:确定源数据库的类型(如MySQL、Oracle等),并安装相应的数据库客户端和.NET数据提供程序。
代码实现(以从MySQL导入为例):
using System; using MySql.Data.MySqlClient; using System.Data.SqlClient; namespace DatabaseToDatabase { class Program { static void Main(string[] args) { string mysqlConnectionString = "Your_MySQL_Connection_String_Here"; string sqlConnectionString = "Your_SQL_Server_Connection_String_Here"; string query = "SELECT * FROM SourceTable"; string tableName = "TargetTableName"; using (MySqlConnection mysqlConn = new MySqlConnection(mysqlConnectionString)) { mysqlConn.Open(); MySqlCommand mysqlCmd = new MySqlCommand(query, mysqlConn); MySqlDataReader reader = mysqlCmd.ExecuteReader(); using (SqlConnection sqlConn = new SqlConnection(sqlConnectionString)) { sqlConn.Open(); SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConn); bulkCopy.DestinationTableName = tableName; bulkCopy.WriteToServer(reader); sqlConn.Close(); } mysqlConn.Close(); } } } }
注意事项:不同数据库之间的数据类型可能存在差异,需要进行适当的转换和处理,要确保目标表的结构与源表兼容。
1、从SQL Server数据库导出到CSV文件
准备工作:确定要导出的数据表和目标CSV文件路径。
代码实现:
using System; using System.Data.SqlClient; using System.Data; using System.IO; namespace DatabaseToCsv { class Program { static void Main(string[] args) { string connectionString = "Your_Connection_String_Here"; string tableName = "SourceTableName"; string csvFilePath = @"C:pathtoyourfile.csv"; using (SqlConnection conn = new SqlConnection(connectionString)) { conn.Open(); string sqlQuery = $"SELECT * FROM {tableName}"; SqlCommand cmd = new SqlCommand(sqlQuery, conn); SqlDataAdapter adapter = new SqlDataAdapter(cmd); DataSet ds = new DataSet(); adapter.Fill(ds, tableName); using (StreamWriter sw = new StreamWriter(csvFilePath)) { for (int i = 0; i < ds.Tables[tableName].Columns.Count; i++) { sw.Write(ds.Tables[tableName].Columns[i].ColumnName + (i < ds.Tables[tableName].Columns.Count 1 ? "," : "")); } sw.WriteLine(); foreach (DataRow row in ds.Tables[tableName].Rows) { for (int i = 0; i < row.ItemArray.Length; i++) { sw.Write(row[i].ToString() + (i < row.ItemArray.Length 1 ? "," : "")); } sw.WriteLine(); } } conn.Close(); } } } }
注意事项:需要处理数据中的逗号、引号等特殊字符,以确保CSV文件的正确格式,对于大数据量的导出,需要考虑性能和内存使用情况。
2、从SQL Server数据库导出到Excel文件
准备工作:安装EPPlus
库,并确定要导出的数据表和目标Excel文件路径。
代码实现:
using System; using System.Data.SqlClient; using OfficeOpenXml; using System.IO; namespace DatabaseToExcel { class Program { static void Main(string[] args) { string connectionString = "Your_Connection_String_Here"; string tableName = "SourceTableName"; string excelFilePath = @"C:pathtoyourfile.xlsx"; using (SqlConnection conn = new SqlConnection(connectionString)) { conn.Open(); string sqlQuery = $"SELECT * FROM {tableName}"; SqlCommand cmd = new SqlCommand(sqlQuery, conn); SqlDataAdapter adapter = new SqlDataAdapter(cmd); DataSet ds = new DataSet(); adapter.Fill(ds, tableName); conn.Close(); using (ExcelPackage package = new ExcelPackage()) { ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("Sheet1"); int rowCount = 1; foreach (DataRow row in ds.Tables[tableName].Rows) { for (int i = 0; i < ds.Tables[tableName].Columns.Count; i++) { worksheet.Cells[rowCount, i + 1].Value = row[i].ToString(); } rowCount++; } FileInfo existingFile = new FileInfo(excelFilePath); if (existingFile.Exists) { existingFile.Delete(); // Delete old Excel file } package.SaveAs(excelFilePath); // Save and close the document } } } } }
注意事项:同样需要注意数据类型转换和特殊字符的处理,对于复杂的Excel格式要求,可能需要进一步设置单元格样式等。
3、从SQL Server数据库导出到其他数据库
准备工作:确定目标数据库的类型和连接信息,以及要导出的数据表。
代码实现(以导出到MySQL为例):
using System; using MySql.Data.MySqlClient; using System.Data.SqlClient; using System.Data; namespace DatabaseToOtherDatabase { class Program { static void Main(string[] args) { string sqlConnectionString = "Your_SQL_Server_Connection_String_Here"; string mysqlConnectionString = "Your_MySQL_Connection_String_Here"; string tableName = "SourceTableName"; string query = $"SELECT * FROM {tableName}"; string targetTableName = "TargetTableName"; using (SqlConnection sqlConn = new SqlConnection(sqlConnectionString)) { sqlConn.Open(); SqlCommand sqlCmd = new SqlCommand(query, sqlConn); SqlDataReader reader = sqlCmd.ExecuteReader(); using (MySqlConnection mysqlConn = new MySqlConnection(mysqlConnectionString)) { mysqlConn.Open(); MySqlCommand mysqlCmd = new MySqlCommand($"TRUNCATE TABLE {targetTableName}", mysqlConn); mysqlCmd.ExecuteNonQuery(); MySqlBulkCopy bulkCopy = new MySqlBulkCopy(mysqlConn); bulkCopy.DestinationTableName = targetTableName; bulkCopy.WriteToServer(reader); mysqlConn.Close(); } sqlConn.Close(); } } } }
注意事项:要确保目标数据库中的目标表已经存在,并且其结构与源表兼容,对于大数据量的导出,需要考虑网络传输和性能问题。
1、如何提高数据导入/导出的性能?
对于大数据量的导入/导出,可以采用分批处理的方式,将数据分成多个小批次进行操作,避免一次性加载过多数据导致内存不足或性能下降,在从CSV文件导入到数据库时,可以每次读取一定行数的数据,然后插入到数据库中,再读取下一批数据,直到所有数据都导入完成,在从数据库导出到CSV文件时,也可以类似地分批查询数据并写入文件,可以使用多线程或并行处理来加快数据处理速度,但要注意线程安全和数据一致性问题,还可以优化数据库查询语句,合理使用索引,减少不必要的计算和数据传输,对于导出到Excel文件,可以考虑使用缓存和流式写入等方式,提高写入效率,在导出到其他数据库时,选择合适的批量复制工具和技术,如SQL Server的BCP
工具或第三方的ETL工具,可以提高数据传输的性能,确保网络连接的稳定性和带宽足够,以避免数据传输过程中的延迟和中断,如果可能的话,对数据库服务器和应用程序服务器进行性能调优,如增加内存、优化磁盘I/O等,也可以提升整体性能。