C# 使用流读取器读取文本文件时出错

C# 使用流读取器读取文本文件时出错,c#,filestream,C#,Filestream,1) 我试图读取一个文本文件,但它显示的错误如下 foreach语句无法对“System.IO.StreamReader”类型的变量进行操作,因为“System.IO.StreamReader”类型的变量不能进行操作 包含“GetEnumerator”的公共定义 这是我的C#代码 using (StreamReader sr = new StreamReader(@"D:\test1.txt")) { while (sr.Peek() &

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();
                        }

                }

这会对这个有用的。使用
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();


          }
  }

错误很明显

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


StreamReader有很多优秀的例子,只要查一下就可以了。

您可以在这种类型中使用

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

基本上,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-check循环中使用
foreach
,只要读一行就行了

下面是MSDN的一个典型用法,它非常清楚如何读取行:

        using (StreamReader sr = new StreamReader(path)) 
        {
            while (sr.Peek() >= 0) 
            {
                Console.WriteLine(sr.ReadLine());
            }
        }
编辑 要避免著名的
SQL注入漏洞
,请使用以下方法处理参数:


.ReadLine;你用谷歌搜索过吗?我是说,就一次!是的,先生,从今天早上开始,我一直在寻找解决方案,不止一次,而且很多次我都在谷歌上搜索它。。。谢谢,先生…是的,我知道foreach循环可以在实现GetEnumerator方法的元素上迭代,但我要求它的解决方案,先生…先生,您的foreach循环也将继续执行…我的示例文件中的数据数只有10,但存储在数据库中的数据数是100800,直到您的行返回null为止,这个while循环将执行。如果您想在任何时候中断,您可以有条件地这样做。有人正在等待sql注入评论,我想您想说一些类似于。。。在sql中使用参数更安全。正如本文所述,您很容易受到sql注入攻击。我说的对吗,先生…??我只是想搞笑。。但我突然变得严肃起来=是的,如果用户可以输入其中任何一个值,则您处于危险中!先生,我是这个领域的新手,但突然我也注意到你的评论,所以我用谷歌搜索它并引起你的注意,但是先生,我不知道这个sql注入的解决方案,所以请你通过修改我的代码来解释一下,先生…谢谢你…:D
// 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);