【问题标题】:Insert text file data into SQL Server database table of specific column将文本文件数据插入特定列的 SQL Server 数据库表
【发布时间】:2018-07-06 04:53:47
【问题描述】:

我附上了我的代码,我在其中尝试读取包含许多记录的.txt 文件。

我需要在特定列中插入 SQL Server 数据库表中的相同文本文件数据。这是我从某个地方引用的代码。

protected void BtnUpload_Click(object sender, EventArgs e)
{
    FileUpload(x);
}

private void FileUpload(List<string> x)
{       
    SqlConnection con = new SqlConnection(conStr);
    SqlCommand cmd = new SqlCommand();

    string fileName = Path.Combine(@"C:\Users\user\Desktop\SBS", FileUpload1.FileName);        

    if(FileUpload1.HasFile)
    {
        try
        {
            con.Open();
            List<string> x;

            for (int i = 0; i <= x.Count - 9; i += 9)
            {
                SqlCommand myCommand = new SqlCommand("INSERT INTO SBSFile (SBSBranchCode, BranchName, FinYear, BrChallanNo, TransDate, MajorHead, ReceiptPayment, Amount, PlanNonPlan) " +
                           string.Format("Values('{0}', '{1}',  '{2}', '{3}', '{4}', '{5}', '{6}', '{7}', '{8}', '{9}')", x[i], x[i + 1], x[i + 2], x[i + 3], x[i + 4], x[i + 5], x[i + 6], x[i + 7], x[i + 8], x[i + 9]), con);
                myCommand.ExecuteNonQuery();
         }
         catch (Exception ex)
         {
         }
     }
 }

我的文件示例:

1 |abc| |bcd| |101|

这里| 表示列的分隔符,是的,每一行都应该插入到特定列可用的表中

谁能帮我将文件数据插入到 SQL Server 表中?

请帮我解决问题

【问题讨论】:

  • 您需要先描述问题所在,然后才能有人提出解决问题的建议。你有错误吗?如果是这样,错误是什么?数据是否插入了错误的列?
  • 我在函数调用中遇到错误,我无法调用我创建的那个函数,我想确认我编写的代码是否足以执行一项工作
  • 你的文件怎么样?文件中的每一行都必须插入到数据库的列中?
  • 我的文件示例:1 |abc| |bcd| |101|这里“|”表示列的分隔符,是的,每一行都应该插入到特定列可用的表中
  • SQL Injection alert - 您应该将您的 SQL 语句连接在一起 - 使用 参数化查询 来避免 SQL 注入 - 查看 Little Bobby Tables

标签: c# asp.net sql-server


【解决方案1】:

我根本不会使用程序...我会使用 SQL Server 中的“导入”功能来导入以竖线分隔的文件。例如How to import pipe delimited text file data to SQLServer table

【讨论】:

    【解决方案2】:

    这是一个从文本文件中读取数据的工作代码示例,其中数据由| 分隔。多个插入语句将在单个事务中执行,以防万一失败,使用全有或全无原则。

    [TestMethod]
    public void TestInsertDataFromFile()
    {
        String fileName = @"D:\SampleData.txt";
        String connectionString = @"Server=MyTestDBServer; Database=TestingDatabase; Trusted_Connection=True;";
        using (SqlConnection conn = new SqlConnection(connectionString))
        {
            conn.Open();
    
            using (SqlTransaction transaction = conn.BeginTransaction())
            {
                String insertCommand = @"INSERT INTO SBSFile (SBSBranchCode, BranchName, FinYear, BrChallanNo, TransDate, MajorHead, ReceiptPayment, Amount, PlanNonPlan) ";
                insertCommand += @"VALUES (@sbsBranchCode, @branchName, @finYear, @brChallanNo, @transDate, @majorHead, @receiptPayment, @amount, @planNonPlan)";
    
                String[] fileContent = File.ReadAllLines(fileName);
    
                using (SqlCommand command = conn.CreateCommand())
                {
                    command.CommandText = insertCommand;
                    command.CommandType = CommandType.Text;
                    command.Transaction = transaction;
    
                    foreach (String dataLine in fileContent)
                    {
                        String[] columns = dataLine.Split('|');
                        command.Parameters.Clear();
    
                        command.Parameters.Add("sbsBranchCode", SqlDbType.VarChar).Value = columns[0];
                        command.Parameters.Add("branchName", SqlDbType.VarChar).Value = columns[1];
                        command.Parameters.Add("finYear", SqlDbType.VarChar).Value = columns[2];
                        command.Parameters.Add("brChallanNo", SqlDbType.VarChar).Value = columns[3];
                        command.Parameters.Add("transDate", SqlDbType.VarChar).Value = columns[4];
                        command.Parameters.Add("majorHead", SqlDbType.VarChar).Value = columns[5];
                        command.Parameters.Add("receiptPayment", SqlDbType.VarChar).Value = columns[6];
                        command.Parameters.Add("amount", SqlDbType.VarChar).Value = columns[7];
                        command.Parameters.Add("planNonPlan", SqlDbType.VarChar).Value = columns[8];
    
                        command.ExecuteNonQuery();
                    }
                }
    
                transaction.Commit();
            }
        }
    }
    

    需要注意的重要事项

    1. 永远不要有一个空的catch {} 处理程序,因为你永远不会知道是否有问题。
    2. 使用外部指定值与数据库通信时,始终使用参数来防止 SQL 注入攻击。
    3. 如果您从单一来源进行多次插入,请使用事务。这将使恢复成为可能,而无需手动取消选择数据。
    4. 在可能的情况下(当类实现IDisposable)使用using(...) 块来确保资源被释放而不是阻塞/锁定。

    【讨论】:

    • @Richardissimo OP 评论说是的,每一行都应该插入到特定列可用的表中让我认为每个字段都应该在自己的列中一行每行
    • 道歉.. 这是重要的信息,应该被编辑并添加到问题中,而不是在评论中。我会编辑它。
    【解决方案3】:

    使用此代码:

            SqlConnection con = new SqlConnection(conStr);
            SqlCommand cmd = new SqlCommand();
    
            string fileName = Path.Combine(@"C:\Users\user\Desktop\SBS", FileUpload1.FileName);
    
            if (FileUpload1.HasFile)
            {
                var lines = File.ReadAllLines(fileName);
                try
                {
                    con.Open();
    
                    foreach (var line in lines)
                    {
                        var columns = line.Split('|');
                        SqlCommand myCommand = new SqlCommand("INSERT INTO SBSFile (SBSBranchCode, BranchName, FinYear, BrChallanNo, TransDate, MajorHead, ReceiptPayment, Amount, PlanNonPlan) " +
                                   $"Values('{columns[0]}', '{columns[1]}','{columns[2]}','{columns[3]}','{columns[4]}','{columns[5]}','{columns[6]}','{columns[7]}','{columns[8]}''{columns[9]}')");
                        myCommand.ExecuteNonQuery();
                    }
                    con.Close();
                }
                catch (Exception ex)
                {
                }
            }
    

    【讨论】:

    • 这个答案遇到了与 cmets 中突出显示的原始代码相同的 SQLInjection、资源泄漏和异常抑制问题。它包含一个未使用的变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    • 2012-01-29
    • 2018-09-22
    • 2020-08-15
    • 2014-01-07
    • 1970-01-01
    相关资源
    最近更新 更多