C# 使用流读取器读取文本文件时出错
1) 我试图读取一个文本文件,但它显示的错误如下 foreach语句无法对“System.IO.StreamReader”类型的变量进行操作,因为“System.IO.StreamReader”类型的变量不能进行操作 包含“GetEnumerator”的公共定义 这是我的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() &
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);