2015-11-09 1 views
2

Я пытаюсь импортировать данные в PostGreSQL таблицу из файла с помощью npgsql BeginTextImport Это мой код:Npgsql BeginTextImport попробуйте импортировать из файла (не из STDIN)

public Object Copy(String sSchemaAndTableName, String sFilePath, Boolean bIsImport) 
    { 
     Boolean bRet = true; 

     Object oResult = new Object(); 
     NpgsqlConnection conn = new NpgsqlConnection(sConnectionString); 
     NpgsqlCommand cmd = new NpgsqlCommand();    

     try 
     { 
      conn.Open(); 
      NpgsqlTransaction transaction = conn.BeginTransaction(); 

      if (File.Exists(sFilePath)) 
      { 
       try 
       { 
        if (bIsImport) 
        { 
         conn.BeginTextImport("COPY " + sSchemaAndTableName + " FROM '" + sFilePath + "';"); 
        } 
        else 
        { 
         conn.BeginTextExport("COPY " + sSchemaAndTableName + " TO '" + sFilePath + "';"); 
        } 
       } 
       catch (Exception e) 
       { 
        bRet = false; 
        transaction.Rollback(); 

        throw e; 
       } 
       finally 
       { 
        if (bRet) 
        { 
         transaction.Commit(); 
        } 
       } 
      } 
      else 
      { 
       throw new Exception("Plik nie istnieje: " + sFilePath); 
      } 

     } 
     catch (Exception ex) 
     {         
      MW.Core.Common.Objects.Exceptions.Items.Add(ex); 
      oResult = null; 
     } 
     finally 
     { 
      cmd.Dispose(); 

      conn.Close(); 
      conn.Dispose(); 
     } 

     return oResult; 
    } 

, когда я запускаю это я получаю сообщение об ошибке - посмотреть на экрана:

when i use myapp directory

when i use postresql server data directory - this works when i use pgadmin but from my app via npgsql not

можно сделать?

+0

Привет и добро пожаловать. Могу ли я предложить вам суммировать сообщения об ошибках в вашем сообщении, чтобы люди могли видеть их, не нажимая на ссылки на изображение (и находить их позже в поисках.) Изображения не обязательно должны идти, но текст с сообщением об ошибке поможет вам получить больше ответов. – wwkudu

+0

Привет, я помню @wwkudu – MisterMike

ответ

1

Функция «КОПИЯ из файла» PostgreSQL не делает то, что вы, вероятно, думаете, что она делает; он не импортирует данные из файла на клиент стороне (где работает Npgsql), а скорее из файла на сервере (где работает PostgreSQL). Другими словами, вы можете поместить файл на свой сервер PostgreSQL и сообщить PostgreSQL об импорте.

Если вы хотите импортировать файл на клиентской машине, вам нужно открыть его на C#, прочитать его и записать в TextWriter, возвращаемый BeginTextImport.

+0

Спасибо @Shay Rojansky, вы правы, я нашел здесь полезный пример [link] (https://github.com/Emill/Npgsql/blob/master/test/Npgsql.Tests/ CopyTests.cs) для тех, кто прочитает это. – MisterMike

2

Теперь мой код работает отлично, (спасибо @Shay Рожански еще раз)

public Boolean CopyFrom(String sDestinationSchemaAndTableName, String sFromFilePath) 
    { 
     Boolean bRet = true; 

     NpgsqlConnection conn = new NpgsqlConnection(sConnectionString); 
     NpgsqlCommand cmd = new NpgsqlCommand();    

     try 
     { 
      conn.Open(); 
      NpgsqlTransaction transaction = conn.BeginTransaction(); 

      if (File.Exists(sFromFilePath)) 
      { 
       try 
       { 
        using (var writer = conn.BeginTextImport("COPY " + sDestinationSchemaAndTableName + " FROM STDIN")) 
        { 
         foreach (String sLine in File.ReadAllLines(sFromFilePath)) 
         { 
          writer.WriteLine(sLine); 
         } 
        } 
       } 
       catch (Exception e) 
       { 
        bRet = false; 
        transaction.Rollback(); 

        throw e; 
       } 
       finally 
       { 
        if (bRet) 
        { 
         transaction.Commit(); 
        } 

        transaction.Dispose(); 
       } 
      } 
      else 
      { 
       MW.Core.Common.Objects.Exceptions.Items.Add(new Exception("Plik nie istnieje: " + sFromFilePath)); 
      } 
     } 
     catch (Exception ex) 
     {         
      MW.Core.Common.Objects.Exceptions.Items.Add(ex); 
      bRet = false; 
     } 
     finally 
     { 
      cmd.Dispose(); 

      conn.Close(); 
      conn.Dispose(); 
     } 

     return bRet; 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^