【问题标题】:Error While Reading a text file with stream reader使用流阅读器读取文本文件时出错
【发布时间】:2014-01-24 22:46:25
【问题描述】:

1) 我正在尝试读取一个文本文件,但它显示错误喜欢

foreach 语句不能对“System.IO.StreamReader”类型的变量进行操作,因为“System.IO.StreamReader”不能 包含“GetEnumerator”的公共定义

这是我的 C# 代码...

 using (StreamReader sr = new StreamReader(@"D:\test1.txt"))
            {
                while (sr.Peek() >= 0)
                {
                    //contents of foreach loop go here

                        foreach (var line in sr)
                        {
                            var items = line.Split(new[] { '\t', '\n' }).ToArray();
                            if (items.Length != 3)
                                continue;
                            var Name = items[0].ToString();
                            var Email = items[1].ToString();
                            var Pwd = items[2].ToString();
                            cmd.CommandText = "insert into Employees values('" + Name + "','" + Email + "','" + Pwd + "')";
                            cmd.CommandType = CommandType.Text;
                            cmd.ExecuteNonQuery();
                        }

                }

【问题讨论】:

  • 你用谷歌搜索过吗?我的意思是,只有一次!
  • 是的先生,我从今天早上开始就在为解决方案工作,不仅一次,而且我已经用谷歌搜索了很多次...谢谢先生...

标签: c# filestream


【解决方案1】:

基本上,Alex.K 的评论是怎么说的:

using (StreamReader sr = new StreamReader(@"D:\test1.txt"))
{
    while (sr.Peek() >= 0)
    {
        var line = sr.ReadLine();
        var items = line.Split(new[] { '\t', '\n' }).ToArray();
        if (items.Length != 3)
            continue;
        var Name = items[0].ToString();
        var Email = items[1].ToString();
        var Pwd = items[2].ToString();
        cmd.CommandText = "insert into Employees values('" + Name + "','" + Email + "','" + Pwd + "')";
        cmd.CommandType = CommandType.Text;
        cmd.ExecuteNonQuery();
    }
}

您不需要在 peek 检查循环中使用foreach,只需读取一行即可。

这里有一个来自MSDN的典型用法,很清楚怎么读行:

        using (StreamReader sr = new StreamReader(path)) 
        {
            while (sr.Peek() >= 0) 
            {
                Console.WriteLine(sr.ReadLine());
            }
        }

编辑

为了避免著名的SQL injection vulnerability,使用Parameters处理参数:

// this is baaaaad
cmd.CommandText = "insert into Employees values('" + Name + "','" + Email + "','" + Pwd + "')";

// will become
cmd.CommandText = "insert into Employees values(@Name, @Email, @Pwd)";
cmd.Parameters["@Name"].Value = Name;
cmd.Parameters["@Email"].Value = Email;
cmd.Parameters["@Pwd"].Value = Pwd;

// somewhere before, where you create command
cmd.Parameters.Add("@Name", type);
cmd.Parameters.Add("@Email", type);
cmd.Parameters.Add("@Pwd", type);

【讨论】:

  • 有人在等待 sql 注入评论 我想你想说... 在你的 sql 中使用参数更安全。在编写本文时,您很容易受到 sql 注入攻击。先生,我说得对吗????
  • 我本来想搞笑.. 但突然间我变得严肃起来。 =D 是的,如果用户可以输入其中任何一个值,那么你就有危险了!
  • 先生,我是这个领域的初学者,但突然间我也注意到你的评论,所以我用谷歌搜索它并引起你的注意,但先生我不知道这个 sql 注入的解决方案,所以请你解释一下通过修改我的代码先生...谢谢...:D
【解决方案2】:

错误很明显。

您只能通过foreach 对实现GetEnumerator 方法的元素进行迭代,而StreamReader 不是。

StreamReader 有很多优秀的和好的例子,随便看看。

【讨论】:

  • 是的,foreach 循环可以在实现 GetEnumrator 方法的元素上进行迭代,但我正在寻求它的解决方案先生......
【解决方案3】:

这将为此工作。使用while 循环代替ForEach 循环

using (StreamReader sr = new StreamReader(@"D:\test1.txt"))
 {
      while (sr.Peek() >= 0)
      {
       //contents of foreach loop go here

       while ((line = sr.ReadLine()) != null)
       {
       var items = line.Split(new[] { '\t', '\n' }).ToArray();
       if (items.Length != 3)
                    continue;
       var Name = items[0].ToString();
       var Email = items[1].ToString();
       var Pwd = items[2].ToString();
       cmd.CommandText = "insert into Employees values('" + Name + "','" + Email + "','" + Pwd + "')";
       cmd.CommandType = CommandType.Text;
       cmd.ExecuteNonQuery();


          }
  }

【讨论】:

  • 直到你的行返回null,这个while循环才会执行。如果你想在任何时候打破,你可以有条件地去做。
【解决方案4】:

你可以在这种类型中使用

foreach (var line in File.ReadLines(@"D:\test1.txt"))
{
}

【讨论】:

  • 先生,您的 foeach 循环也将继续执行...我的示例文件中的数据数只有 10,但存储在数据库中的是 100800
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多