Импорт данных текстового файла в базу данных PostgreSQL с использованием C # - PullRequest
0 голосов
/ 11 декабря 2019
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");
}

Здесь я сделал, как преобразовать данные в текстовый файл.

Может кто-нибудь дать мне код, как экспортировать данные текстового файла в базу данных SQL, используя C #?

Ответы [ 2 ]

0 голосов
/ 11 декабря 2019

Если скорость имеет значение (и IMHO это всегда должно быть), и вы используете 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 - это список имен полей, разделенных запятыми. Другие переменные должны (я надеюсь) быть самоочевидными.

0 голосов
/ 11 декабря 2019

Почему бы не что-то подобное

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

Я не знаю названий ваших столбцов, поэтому вам придется их заменить.

...