[使用C#将文本文件数据导入PostgreSQL数据库

问题描述 投票:-1回答:2
private void GetTextFile()
       {

            NpgsqlConnection npgsqlConnection = new NpgsqlConnection();
            npgsqlConnection.ConnectionString = "Server=127.0.0.1;Port=5432;User Id=postgres;Password=rutuparna;Database=Employee";
            npgsqlConnection.Open();

            NpgsqlCommand command = new NpgsqlCommand("Select * from employee_details", npgsqlConnection);
            NpgsqlDataReader dataReader = command.ExecuteReader();

            using (System.IO.StreamWriter writer = new System.IO.StreamWriter(@"D:\Rutu\txtfile.txt", false, Encoding.UTF8))
            {

                while (dataReader.Read())
                {
                    writer.WriteLine(dataReader[0] + "; " + dataReader[1] + ";" + dataReader[2] + ";" + dataReader[3]);

                }
            }

            MessageBox.Show("Data fetched Properly");
        }

这里我已经完成了如何将数据转换为文本文件。

有人可以告诉我如何使用C#将文本文件数据导出到SQL数据库的代码吗?

c# sql postgresql text-files
2个回答
0
投票

为什么没有这样的东西

using (SqlConnection con = new SqlConnection(@"your connection string"))
{
    con.Open();
    using(StreamReader file = new StreamReader(@"D:\Rutu\txtfile.txt"))
    {
         while((line = file.ReadLine()) != null)
         {
             string[] fields = line.Split(',');

             SqlCommand cmd = new SqlCommand("INSERT INTO employee_details(column1, column2, column3,column4) VALUES (@value1, @value2, @value3, @value4)", con);
             cmd.Parameters.AddWithValue("@value1", fields[0].ToString());
             cmd.Parameters.AddWithValue("@value2", fields[1].ToString());
             cmd.Parameters.AddWithValue("@value3", fields[2].ToString());
             cmd.Parameters.AddWithValue("@value4", fields[3].ToString());
             cmd.ExecuteNonQuery();
         }
    }
 }

我不知道您的列的名称,因此您需要替换它们。


0
投票

如果考虑速度(恕我直言,它应该一直如此),而您正在使用PostgreSQL(您似乎应该使用),那么您应该看看COPY功能。单刀片总是比批量操作慢。

COPY函数包装在c#中相对容易。以下是方法的简化版本,以说明这一点。我的方法遍历DataTable的行,但是很容易适应文件情况(ReadLine()等)。

using (var pgConn = new NpgsqlConnection(myPgConnStr))
{
    using (var writer = pgConn.BeginBinaryImport("COPY " + destinationTableName + " (" + commaSepFieldNames + ") FROM STDIN (FORMAT BINARY)"))
    {
        //Loop through data
        for (int i = 0; i < endNo; i++)
        {
            writer.StartRow();

            //inner loop through fields
            for (int j = 0; j < fieldNo; j++)
            {

                //test for null
                if (true)
                {
                    writer.WriteNull();
                }
                else
                {
                    //Write data using column types
                    writer.Write(value, type);
                }
            }
        }
        writer.Complete();
    }
}

WriteNull()是一种将NULL正确添加到流中的特殊方法,否则请使用Write<T>()。后者具有三个重载,仅是值,具有枚举类型的值或具有名称类型的值。我更喜欢使用枚举。 commaSepFieldNames是逗号分隔的字段名称列表。 (我希望)其他变量不言自明。

© www.soinside.com 2019 - 2024. All rights reserved.