我通过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();
}
}
此代码仅返回第一行,但我希望文本文件的所有行都存储在数据库中。提前致谢
最佳答案
尝试清理困惑:
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
语句来正确处置IDisposable资源,例如连接和命令 - 使用参数化查询来避免 SQL 注入(inject)
而且您可能不想成为 rolling your own CSV parser
使用 String.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);
}
}
}
关于c# - 在c#中将文本文件存储到mysql数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15184334/