将txt文件插入数据库

时间:2013-11-07 04:21:32

标签: c# sql sql-server streamreader

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表已包含该信息,它将启动一个异常或消息框,让用户知道该文件已存在。请帮忙

3 个答案:

答案 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。由于某种原因,您的代码似乎是在第一行之后离开,这可能会解决它。