当前位置:首页 > 行业动态 > 正文

c#数据库数据导入导出

摘要:C#中数据库数据导入导出可通过多种方式实现,如使用内置函数、第三方工具等,能有效进行数据处理。

在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文件中可能存在的空值和数据类型转换问题。

c#数据库数据导入导出

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文件路径。

c#数据库数据导入导出

代码实现

     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格式要求,可能需要进一步设置单元格样式等。

c#数据库数据导入导出

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();
                 }
             }
         }
     }

注意事项:要确保目标数据库中的目标表已经存在,并且其结构与源表兼容,对于大数据量的导出,需要考虑网络传输和性能问题。

三、FAQs

1、如何提高数据导入/导出的性能?

对于大数据量的导入/导出,可以采用分批处理的方式,将数据分成多个小批次进行操作,避免一次性加载过多数据导致内存不足或性能下降,在从CSV文件导入到数据库时,可以每次读取一定行数的数据,然后插入到数据库中,再读取下一批数据,直到所有数据都导入完成,在从数据库导出到CSV文件时,也可以类似地分批查询数据并写入文件,可以使用多线程或并行处理来加快数据处理速度,但要注意线程安全和数据一致性问题,还可以优化数据库查询语句,合理使用索引,减少不必要的计算和数据传输,对于导出到Excel文件,可以考虑使用缓存和流式写入等方式,提高写入效率,在导出到其他数据库时,选择合适的批量复制工具和技术,如SQL Server的BCP工具或第三方的ETL工具,可以提高数据传输的性能,确保网络连接的稳定性和带宽足够,以避免数据传输过程中的延迟和中断,如果可能的话,对数据库服务器和应用程序服务器进行性能调优,如增加内存、优化磁盘I/O等,也可以提升整体性能。