簡體   English   中英

使用 C# 將文本文件數據導入 PostgreSQL 數據庫

[英]Import Text File data to PostgreSQL database using C#

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 數據庫的代碼嗎?

為什么不是這樣的

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

我不知道您的列的名稱,因此您需要替換它們。

如果速度是一個考慮因素(恕我直言它總是應該考慮)並且您正在使用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 是一個逗號分隔的字段名稱列表。 其他變量應該(我希望)是不言自明的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM