public partial class Form1 : Form
{
public SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\v11.0;AttachDbFilename=C:\Users\Alexander\Desktop\Archivos.mdf;Integrated Security=True;Connect Timeout=30");
private void Readbtn_Click(object sender, EventArgs e)
{
con.Open();
Propiedades prop = new Propiedades();
List<string> myValues = new List<string>();
string line;
StreamReader file = new StreamReader(@"c:\temp\archivo.txt");
if ((line = file.ReadLine()) != null)
{
string[] fields = line.Split(',');
prop.matricula = fields[0].ToString();
prop.nombre = fields[1].ToString();
prop.sueldo = decimal.Parse(fields[2]);
for (int i = 0; i < fields.Length; i++)
{
listBox1.Items.Add(fields[i]);
}
}
SqlCommand cmd = new SqlCommand("INSERT INTO Archivos(Codigo, Nombre, Sueldo) VALUES (@Matricula, @Nombre, @Sueldo", con);
cmd.Parameters.AddWithValue("@Matricula", prop.matricula);
cmd.Parameters.AddWithValue("@Nombre", prop.nombre);
cmd.Parameters.AddWithValue("@Sueldo", prop.sueldo);
cmd.ExecuteNonQuery();
con.Close();
}
Hello Guys,我只需要一些修改此代码的帮助。我已经有了这个来保存文本文件的第一行,但我对如何让它读取其他行没有任何想法。此外,我想验证,如果SQL表已包含该信息,它将启动一个异常或消息框,让用户知道该文件已存在。请帮忙
答案 0 :(得分:0)
我建议逐行读取文件,将值添加到DataTable,然后使用SQL Bulk Insert将其存储到数据库中。
这就像是
int batchSize = 10000;
SqlBulkCopy bc = new SqlBulkCopy(con);
DataTable dtArchivos = new DataTable();
dtArchivos.Columns.AddRange(new []
{
new DataColumn("Codigo", typeof(string)),
new DataColumn("Nombre", typeof(string)),
new DataColumn("Sueldo", typeof(decimal)),
});
StreamReader file = new StreamReader(@"c:\temp\archivo.txt");
string line = file.ReadLine();
while (line != null)
{
string[] fields = line.Split(',');
DataRow dr = dtArchivos.NewRow();
dr["Codigo"] = fields[0].ToString();
dr["Nombre"] = fields[1].ToString();
dr["Sueldo"] = decimal.Parse(fields[2]);
dtArchivos.Rows.Add(dr);
if (dtArchivos.Rows.Count == batchSize)
{
bc.WriteToServer(dtArchivos);
dtArchivos.Clear();
}
line = file.ReadLine();
}
bc.WriteToServer(dtArchivos);
我添加了一些逻辑来进行批处理,因为大文件可能会因为DataTable的大小而导致应用程序内存不足。
答案 1 :(得分:0)
有一些事情你需要做的第一个跳出来的是你想要用while循环代替你的第一个if语句
while ((line = file.ReadLine()) != null)
{
string[] fields = line.Split(',');
prop.matricula = fields[0].ToString();
prop.nombre = fields[1].ToString();
prop.sueldo = decimal.Parse(fields[2]);
for (int i = 0; i < fields.Length; i++)
{
listBox1.Items.Add(fields[i]);
}
}
另外,根据您希望如何显示列表框中的项目,您可能希望使用而不是使用内部循环:
listBox1.Items.Add(prop.matricula+','+prop.nombre+',prop.sueldo.toString());
答案 2 :(得分:0)
首先,考虑将LINQ用于您的代码 - 如果您不过度担心稍微增加开销,LINQ将使您的生活变得更加轻松。它会自动为您缓存信息,并且可以更有效地处理很多事情,更不用说代码有时更容易理解。为此,您需要在Visual Studio中创建数据库的ado.net模型,这不应该花费太长时间。我认为,确切的方法是
File -> Add Item -> Add new Item
或类似的东西,然后搜索ado.net实体。然后,只需填写它要求的详细信息。然后,您可以使用此实体(如果您无法找到如何执行此操作,请回复以便我可以根据需要进行修复)以使用您指定的方式添加数据。
现在,它可能不是代码工作的原因是代码问题。我认为使用分隔符可能是问题所在,以下修改后的代码可能会有所帮助:
StreamReader file = new StreamReader(@"c:\temp\archivo.txt");
while(file.Read()){
//YOUR CODE FOR CONCATENATING DATA HERE
}
原因是读者会读取它的返回值为False或Null。由于某种原因,您的代码似乎是在第一行之后离开,这可能会解决它。