【问题标题】:How to import text file and save data into database? [closed]如何导入文本文件并将数据保存到数据库中? [关闭]
【发布时间】:2017-01-30 10:29:35
【问题描述】:

我有这个项目:

  1. 导入.txt 文件
  2. 连接到 SQL Server 数据库
  3. 将所有数据传输到数据库中

文本文件按tab分为四个字段,如数据库。

我使用富文本框完成了第一步,并将所有数据保存在一个字符串中。我的想法是分割每一行字符串并将其保存在一个数组中,但是:如何分割每一行以便正确保存字段?如何将 SQL Server 上的数据库连接到 C# 上的项目?

【问题讨论】:

    标签: c# sql sql-server


    【解决方案1】:

    让我们一步一步来……

    获取数据:


    将文本文件放入字符串变量中。
    string readText = File.ReadAllText("path to my file.txt");
    

    更多关于here

    现在我们将它放在一个字符串中,我们可以解析它

    List<string> listStrLineElements = List<string> listStrLineElements = line.Split(new string[] { Environment.NewLine }, StringSplitOptions.None).ToList();// You need using System.Linq at the top.
    

    更多在新行拆分的选项可以找到here

    现在,您需要将每个元素分成自己的行;你说你有它标签 delimited 这很好(像逗号分隔(CSV)这样的东西在现代更常见,但标签可以工作!)......为此我们可以做这样的事情:

    List<string> rowList = listStrLineElements.SelectMany(s => s.Split('\t')).ToList();// The \t is an *escape character* meaning tab.
    

    现在,您需要一个类似循环的东西来遍历这些条目中的每一个并将其插入到数据库中,这意味着我们现在需要我们的数据库连接...

    连接到数据库


    Code Projects(另一个有用的站点)有 this 教程,介绍从 C# 建立 SQL 连接;以下是代码摘要(请阅读文章,本网站不是为了让人们代表您编写/查找代码!)

    确保您使用的是 SQL 命名空间...

    using System.Data.SqlClient;
    

        private void sqlCon(List<string> x)
        {
            //Replace with your server credentials/info
            SqlConnection myConnection = new SqlConnection("user id=username;" +"password=password;server=serverurl;" +"Trusted_Connection=yes;" +"database=database; " + "connection timeout=30");
            try
            {
                myConnection.Open();
                for (int i = 0; i <= x.Count -4; i += 4)//Implement by 3...
                {
                    //Replace table_name with your table name, and Column1 with your column names (replace for all).
                    SqlCommand myCommand = new SqlCommand("INSERT INTO table_name (Column1, Column2, Column3, Column4) " +
                                         String.Format("Values ('{0}','{1}','{2}','{3}')", x[i], x[i + 1], x[i + 2], x[i + 3]), myConnection);
                    myCommand.ExecuteNonQuery();
                }
    
            }
            catch (Exception e){Console.WriteLine(e.ToString());}
            try{myConnection.Close();}
            catch (Exception e){Console.WriteLine(e.ToString());}
        }
    

    注意,您很可能需要更改/编辑我的循环;它背后的逻辑是将 i 实现为 4,这样您就可以读取每一列,因此列 Count(条目数)必须少 4,这样您就不会得到超出范围的索引(在记事本中输入这一切 I '我不确定我的所有逻辑是否正确,但同样,如果有错误,那是你必须解决的问题,我们不只是为人们编写代码)。

    请注意!

    string.format() 之类的东西让你为 SQL 注入打开了大门,你确实应该查找 SQL 参数,但这将完成工作。以下是一些我认为必须阅读的帖子:

    Preventing SQL Injections in C#

    What is an SQL Injection (W3-schools)

    【讨论】:

    • 感谢您的大力帮助。只是一件事:for循环必须是“i
    【解决方案2】:

    您应该查看有关此主题的 MSDN 文档here 这将提供有关如何连接到 SQL 服务器数据库的一些详细信息。

    【讨论】:

      【解决方案3】:

      要连接到数据库,您需要一个包含 app.config 文件中所有信息的连接字符串。连接到数据库后,添加新行甚至从代码内部更新行应该没有问题。只需构建一个查询,您可以在其中为新行的每一列输入字符串数据!

      Microsoft 网站上有大量关于如何构建 SQL 查询以及如何连接到数据库的文档,请看一下 :)

      【讨论】:

        【解决方案4】:

        您可以尝试从命令行使用 BCP。这对您拥有哪些权限以及如何访问数据库做出了一系列假设,但基本上您可以在数据库服务器上调用它(它是一个隐藏功能),或者您可以在本地复制文件:

        https://msdn.microsoft.com/en-us/library/ms162802.aspx

        BCP.exe .. in -S -U -P -c -t

        -c 是“字符格式” -t 是字段终止符 - 为 TAB 留空

        -U和-P如果是可信连接,可以用-T代替。

        一些建议:通过导入临时表,进行所需的任何更改,然后让 SQL 函数处理向生产表的传输,这些事情总是会得到更好的处理。这样您就可以确保不会意外泄露数据。

        【讨论】:

          【解决方案5】:

          我建议在这种情况下使用列表和数据表。与数组相比,列表的使用是干净的,同样适用于使用数据表对数据库进行的操作。 您可以参考 stackoverflow 上的 this 帖子,将文本文件中的数据检索到数据表中。 这个post 也可以提供帮助

          希望这会有所帮助..

          【讨论】:

            猜你喜欢
            • 2016-05-24
            • 2018-08-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-01-23
            • 2016-08-12
            • 1970-01-01
            相关资源
            最近更新 更多