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

如何用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}");
                    }
                }
            }
        }
    }
}

关键优化点说明

  1. 资源自动释放:
    用using包裹StreamReader、SqlConnection、SqlCommand,这些实现了IDisposable的对象会在代码块结束后自动释放资源,避免内存泄漏或文件/数据库连接占用。

  2. 参数化查询:
    不再直接拼接SQL字符串,改用@参数名的形式传递值,彻底避免SQL注入风险,同时能正确处理包含单引号、换行符等特殊字符的字段值。

  3. 数据有效性验证:
    分割每行后先检查字段数量是否为5,避免因行格式错误导致的数据库插入失败,同时给出明确的错误提示。

  4. 异常处理:
    针对IO异常、SQL异常和通用异常分别捕获,方便排查问题,同时给用户清晰的错误反馈。

  5. 逻辑修正:
    直接对每行分割后的字段数组按索引取值,匹配数据库的5个列,解决了原代码中循环逻辑混乱的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:04:49