【问题标题】:How to parse text file, that splits data using semi-column, to a data table如何将使用半列拆分数据的文本文件解析为数据表
【发布时间】:2018-12-04 12:44:13
【问题描述】:

以下代码使用文本文件作为本地 SQL 数据库的输入,就像文本文件是一个表一样。但这里的问题是它是错误的,因为使用SQLEXecute 根本不解析数据。这意味着即使我们使用实际文本也不会创建表格。

 public void ParseRoutingFile()
    {
        using (StreamReader sr = new StreamReader(Engine.LIST_FILE_PATH + @"\ROUTING.TXT", Encoding.Default))
        {
            while (sr.Peek() >= 0)
            {
                string row = sr.ReadLine();
                if (row != null)
                {
                    string[] parts = row.Split(';');
                    if (parts.Length > 0)
                    {
                        // find records for the specific terminal
                        if (parts[0] == Engine.TerminalId)
                        {
                            string query = string.Format("INSERT INTO Routing (RId, Weeknum, Year, Days) " +
                                    "VALUES ('{0}','{1}','{2}','{3}')",
                                    parts[4].Trim(),
                                    parts[1].Trim(),
                                    parts[2].Trim(),
                                    parts[3]

                                );

                            Engine.SqlExecute(query);
                        }
                        else continue;
                    }
                }
            }
        }
    }

此时我只想阅读文件,不怕摔倒。

现在,对于用户来说,表格应该是这样的

<style type="text/css">
.tg  {border-collapse:collapse;border-spacing:0;}
.tg td{font-family:Arial, sans-serif;font-size:14px;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:black;}
.tg th{font-family:Arial, sans-serif;font-size:14px;font-weight:normal;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:black;}
.tg .tg-0pky{border-color:inherit;text-align:left;vertical-align:top}
</style>
<table class="tg">
  <tr>
    <th class="tg-0pky"></th>
    <th class="tg-0pky">RID</th>
    <th class="tg-0pky">Weeknum</th>
    <th class="tg-0pky">Year</th>
    <th class="tg-0pky">Days</th>
  </tr>
  <tr>
    <td class="tg-0pky">□</td>
    <td class="tg-0pky">11</td>
    <td class="tg-0pky">45</td>
    <td class="tg-0pky">2019</td>
    <td class="tg-0pky">4</td>
  </tr>
</table>

【问题讨论】:

  • 如果我向您发送的文件在任何列中都包含'); DROP TABLE Routing; --,那么您将有一个非常糟糕的一天。
  • @vzwick 这就是我在这里发帖的原因,因为我不知道更好的写法
  • stackoverflow.com/questions/21709305/… - 注意command.Parameters.AddWithValue(... ;)
  • @vzwick 所以这行不通? stackoverflow.com/questions/34691471/parse-object-from-sql 因为我想解析我的数据
  • 有效。它只是超级不安全,并且将成为绝对的维护噩梦。我当然建议您研究 ORM,例如 Entity Framework(非常强大,但需要一段时间才能掌握)或 Dapper(可能更适合您的用例)。

标签: c# sql database


【解决方案1】:

您的查询仍然不正确。指定了 4 列和 5 个值。

这是 4 列和 4 个值的样子:

string query = string.Format("INSERT INTO Routing (RId, Weeknum, Year, Days) " +
                                "VALUES ('{0}','{1}','{2}','{3}')",
                                parts[4].Trim(),
                                parts[1].Trim(),
                                parts[2].Trim(),
                                parts[3]

正如其他人提到的,您应该研究参数化查询,或者至少转义撇号以防止 SQL 注入。

parts[4].Trim().Replace("'", "''"),

或者,所有 4 个字段听起来都应该是数字,因此另一种方法是删除引号并检查值是否为有效数字。

【讨论】:

  • 最谦虚的道歉,不是故意的。我意识到我的错误太晚了,我无法删除答案。我已接受 Robin Bennett 的编辑。
  • @Rossco 至于我的错误,我修改了代码以创建一个更通用的模型,但因为它使用了更多对象,我决定删除它们。至于代码本身,我想将由分隔符分隔的文本值解析到我的数据库中。如果您对此有任何理解困难,请随时发表评论,以便我更清楚地说明我的目标。
  • 您是否按照上面 Robin Bennett 的建议对 sql 查询语句以及指定的列数和提供的值数之间的不匹配进行了任何修改?那还是不行吗?接下来我会问 Engine.TerminalId 的值是什么 if (parts[0] == Engine.TerminalId)
【解决方案2】:

您的查询错误

INSERT INTO Routing (RId, Weeknum, Year, Days) " + "VALUES ('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}','{10}', '{11}')

通知

(RId, Weeknum, Year, Days)

('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}','{10}', '{11}')

您是说先给出 4 列,然后给出 12 列

【讨论】:

  • 我有一个错字,因为我复制粘贴了以前的版本,我再次编辑它。而且,这真的很快。
  • @JasonTodd 您的代码中仍然缺少一些部分。
猜你喜欢
  • 2012-12-08
  • 1970-01-01
  • 2017-12-16
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多