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


 }

大家好,我只需要一点帮助来修改这段代码。我已经有了这个来保存文本文件的第一行,但我对如何让它读取其他行没有任何想法。另外我想验证如果 SQL 表已经包含该信息,它将启动一个异常或消息框,让用户知道该文件已经存在。请帮忙

4

3 回答 3

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 的大小而耗尽内存。

于 2013-11-07T04:26:09.350 回答
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。由于某种原因,您的代码似乎在第一行之后离开了,这可能会解决它。

于 2013-11-07T04:35:02.840 回答
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]);
        }

    }

还取决于您希望如何在列表框中显示项目,而不是使用内部 for 循环:

listBox1.Items.Add(prop.matricula+','+prop.nombre+',prop.sueldo.toString());
于 2013-11-07T04:32:31.793 回答