如何用C#将TXT文件数据插入数据库?代码问题咨询
用C#将TXT文件数据插入数据库的优化实现
我看了你的代码片段,发现几个需要修正和优化的地方,下面是改进后的完整实现,同时会解释关键要点:
先说说原代码里的核心问题:
- 直接拼接SQL字符串存在严重的SQL注入风险,而且如果字段值里包含单引号,会直接导致SQL语法错误。
StreamReader没有正确释放资源,可能造成文件句柄泄漏。- 循环逻辑混乱:你把每行分割成数组后,用
foreach遍历单个字段再用索引取字符,这和插入5个字段的需求完全不匹配。 - 数据库连接和命令没有用
using管理,容易导致连接泄漏。
修正后的完整代码
using System; using System.IO; using System.Data.SqlClient; using System.Windows.Forms; public class TxtToDatabaseImporter { public void ImportData(string dbConnectionString) { string txtFilePath = "planificari.txt"; char[] splitDelimiter = { '*' }; // 用using自动释放StreamReader资源,避免文件句柄泄漏 using (StreamReader sr = new StreamReader(txtFilePath)) { string line; // 逐行读取TXT内容 while ((line = sr.ReadLine()) != null) { // 跳过空行 if (string.IsNullOrWhiteSpace(line)) continue; // 分割每行数据,移除空条目 string[] fields = line.Split(splitDelimiter, StringSplitOptions.RemoveEmptyEntries); // 验证字段数量是否符合要求(需要5个字段对应数据库列) if (fields.Length != 5) { MessageBox.Show($"无效行:{line},字段数量不正确,请检查格式"); continue; } // 用using管理数据库连接,自动释放连接资源 using (SqlConnection con = new SqlConnection(dbConnectionString)) { try { con.Open(); // 使用参数化查询,彻底避免SQL注入,同时处理特殊字符 string insertSql = @"INSERT INTO Planificari(Localitate, Frecventa, DataStart, DataStop, caleFisier) VALUES(@Localitate, @Frecventa, @DataStart, @DataStop, @caleFisier)"; // 用using管理SqlCommand,自动释放命令资源 using (SqlCommand cmd = new SqlCommand(insertSql, con)) { // 为参数赋值,同时去除字段前后空格 cmd.Parameters.AddWithValue("@Localitate", fields[0].Trim()); cmd.Parameters.AddWithValue("@Frecventa", fields[1].Trim()); cmd.Parameters.AddWithValue("@DataStart", fields[2].Trim()); cmd.Parameters.AddWithValue("@DataStop", fields[3].Trim()); cmd.Parameters.AddWithValue("@caleFisier", fields[4].Trim()); // 执行插入操作 int affectedRows = cmd.ExecuteNonQuery(); MessageBox.Show($"成功插入{affectedRows}条数据,行内容:{line}"); } } catch (IOException ex) { MessageBox.Show($"读取文件出错:{ex.Message}"); } catch (SqlException ex) { MessageBox.Show($"数据库操作出错:{ex.Message}"); } catch (Exception ex) { MessageBox.Show($"未知错误:{ex.Message}"); } } } } } }
关键优化点说明
资源自动释放:
用using包裹StreamReader、SqlConnection、SqlCommand,这些实现了IDisposable的对象会在代码块结束后自动释放资源,避免内存泄漏或文件/数据库连接占用。参数化查询:
不再直接拼接SQL字符串,改用@参数名的形式传递值,彻底避免SQL注入风险,同时能正确处理包含单引号、换行符等特殊字符的字段值。数据有效性验证:
分割每行后先检查字段数量是否为5,避免因行格式错误导致的数据库插入失败,同时给出明确的错误提示。异常处理:
针对IO异常、SQL异常和通用异常分别捕获,方便排查问题,同时给用户清晰的错误反馈。逻辑修正:
直接对每行分割后的字段数组按索引取值,匹配数据库的5个列,解决了原代码中循环逻辑混乱的问题。
内容的提问来源于stack exchange,提问作者Razvan Cristea
相关产品推荐
相关产品推荐

