2013-03-03 250 views
2

我通过c#读取文件,文件格式是这样的。
输入文件将文本文件保存到mysql数据库中c#

00001740,  0.125,  0,  able 
00001740,  0.125,  0,  unable 
00002098,  0,   0.75, country 
00002312,  0,   0,  love  

我想在MySQL数据库文件。我编写的代码将每行存储在数据库的每个行中。但下面的代码只写文本文件的第一行

private void button1_Click(object sender, EventArgs e) 
     { 
      string MyConString = "server=localhost;" + 
       "database=zahid;" + "password=zia;" + 
       "User Id=root;"; 
      MySqlConnection connection = new MySqlConnection(MyConString); 
      MySqlCommand command = connection.CreateCommand(); 
      MySqlDataReader Reader; 
      connection.Open(); 
      StreamReader reader = new StreamReader("D:\\out.txt"); 

      string line; 
      while ((line = reader.ReadLine()) != null) 
      { 
       string[] parts = line.Split(','); 
       command.CommandText = "insert into score(POS_ID,Pos,Neg,Word) values('" + parts[1] + "','" + parts[2] + "','" + parts[3] + "','" + parts[4] + "')"; 



       Reader = command.ExecuteReader();  
      } 
     } 

这个代码仅返回第一线,但我想,在数据库中的文本文件存储的所有行。在此先感谢

回答

3

尝试清洁烂摊子:

private void button1_Click(object sender, EventArgs e) 
{ 
    string[] lines = File.ReadAllLines("D:\\out.txt"); 
    foreach (var line in lines) 
    { 
     var data = line.Split(new[] { ',' }, 4); 
     int posId = int.Parse(data[0].Trim()); 
     double pos = double.Parse(data[1].Trim()); 
     double neg = double.Parse(data[2].Trim()); 
     string word = data[3].Trim(); 
     StoreRecord(posId, pos, neg, word); 
    } 
} 

private void StoreRecord(int posId, double pos, double neg, string word) 
{ 
    var conStr = "server=localhost; database=zahid; password=zia; User Id=root;"; 
    using (var connection = new MySqlConnection(conStr)) 
    using (var command = connection.CreateCommand()) 
    { 
     connection.Open(); 
     command.CommandText = 
     @"INSERT INTO score 
      (POS_ID, Pos, Neg, Word) 
      VALUES 
      (@posId, @pos, @neg, @word)"; 
     command.Parameters.AddWithValue("@posId", posId); 
     command.Parameters.AddWithValue("@pos", pos); 
     command.Parameters.AddWithValue("@neg", neg); 
     command.Parameters.AddWithValue("@word", word); 
     command.ExecuteNonQuery(); 
    } 
} 

事情需要注意:

  • 分离数据库插入逻辑放到一个专门的方法,以避免在同一个地方
  • 做分析和数据库插入
  • 使用using statemenets正确配置IDisposable资源,如连接和命令
  • 使用参数化查询,以避免SQL注入

而且你可能不希望使用rolling your own CSV parserString.Split使用一个真正的CSV解析器来代替。

如果CSV文件是很大的,你可以在同一时间阅读一行,以避免在内存中加载它立刻:

private void button1_Click(object sender, EventArgs e) 
{ 
    using (var stream = File.OpenRead("D:\\out.txt")) 
    using (var reader = new StreamReader(stream)) 
    { 
     string line; 
     while ((line = reader.ReadLine()) != null) 
     { 
      var data = line.Split(new[] { ',' }, 4); 
      int posId = int.Parse(data[0].Trim()); 
      double pos = double.Parse(data[1].Trim()); 
      double neg = double.Parse(data[2].Trim()); 
      string word = data[3].Trim(); 
      StoreRecord(posId, pos, neg, word); 
     } 
    } 
} 
相关问题