2014-12-01 4 views
0

Привет Я подключаюсь к базе данных postgres и передаю данные на свой локальный компьютер.NpgsqlDataReader Select statement- Не работает для данных camelCase Таблицы

вот мой код:

 public DataTable GetDataTable(string sql) 
    { 
     var conn = GetOpenConnection(); 
     var dt = new DataTable(); 

     var cmd = conn.CreateCommand(); 
     cmd.CommandText = sql; 

     NpgsqlDataReader dr = null; 

     try 
     { 
      dr = cmd.ExecuteReader(); 
      dt.Load(dr); 
     } 
     catch (Exception ex) 
     { 
      Log.Info(ex); 
      throw; 
     } 
     finally 
     { 
      dr.Close(); 
      conn.Close(); 
     } 

     return dt; 
    } 

Ниже сценариев работает нормально

SQL = "SELECT * FROM test_db"

SQL = "SELECT * FROM TESTDB"

Но если ; SQL = "SELECT * FROM TestDB", то я получил исключение

Error 42P01 "TESTDB" не существует

Я заметил, что несколько таблиц. Если я использую имена таблиц данных на камне, каждый раз, когда он выдает исключение. Вот код, который я получил свое исключение

dr = cmd.ExecuteReader();

Так что я хотел бы знать, не могу ли я позвонить в таблицы camelCase? Какое лучшее решение для этого?

оцените ваши отзывы и ответы! Спасибо

+0

Но ваши таблицы написаны в нижнем регистре или у вас есть их в смешанном случае? Я мог ошибаться, но, похоже, это более чувствительная к регистру PostGre, которая не позволяет создавать смешанные имена и требует, чтобы имя таблицы было точно в одном и том же случае. – Steve

+1

@Steve: стандарт SQL указывает, что некотируемые идентификаторы складываются в верхний регистр, PostgreSQL сворачивает их в нижний регистр. Эта разница редко имеет значение, поскольку оба они нормализуют случай некотируемых идентификаторов. Если вам нужны идентификаторы, чувствительные к регистру, тогда SQL говорит, что вам нужно их удвоить. Некоторые базы данных используют обратные ссылки для цитирования идентификаторов, некоторые используют скобки, но PostgreSQL и стандартный SQL используют двойные кавычки. –

+0

Это дублирует множество вопросов (ищите «[postgresql] регистратор, чувствительный к регистру», и вы найдете некоторые из них). –

ответ

0

Если вы заинтересованы в реализации ORM, мне посчастливилось использовать MicroLite ORM с поставщиком данных Npgsql. Net для подключения к базам данных Postgres. Не совсем то, что вы искали, но это один из вариантов, который может решить вашу проблему. https://github.com/TrevorPilley/MicroLite/wiki

Ниже вы можете указать имя таблицы, используя [Таблица («Почта»)] очень проста в использовании CamelCase или что угодно.

using System; 

using MicroLite.Mapping; 
using MicroLite; 

namespace MailOut.Model 
{ 
    [Table("Mail")] 
    public class Email 
    { 
     [Identifier(IdentifierStrategy.DbGenerated)] 
     [Column("priKey")] 
     public Int64 PriKey { get; set; } 

     [Column("toemail")] 
     public string ToEmail { get; set; } 

     [Column("fromemail")] 
     public string FromEmail { get; set; } 

     [Column("body")] 
     public string Body { get; set; } 
    } 
} 
+0

Спасибо Smashing1978. У меня более 40 таблиц. так что это не будет работать для меня. Еще раз спасибо –

+0

@GayanJ - если это имеет какое-либо значение, вы можете настроить сопоставление с помощью условностей, а не атрибутов, чтобы вы могли определить соглашение, в котором нижние регистры имеют эквивалентное имя столбца из имени свойства [Конфигурирование соглашений] (https: // github.com/TrevorPilley/MicroLite/wiki/Convention-Based-Mapping#customizing-conventions) –