2015-08-22 3 views
2

Я использую NpgSQL с PostgreSQL и ADO.NET. Простите простоту вопроса, поскольку я только начал использовать PostgreSQL и NpgSQL на этой неделе.PostgreSQL Параметрированная вставка с ADO.NET

Что-то вроде этого работает отлично:

[Test] 
public void InsertNoParameters() 
{ 
    NpgsqlConnection conn = new NpgsqlConnection("Host=localhost; Database=postgres; User ID=postgres; Password=password"); 
    conn.Open(); 

    IDbCommand command = conn.CreateCommand(); 
    string sql = "INSERT INTO Customers (FirstName,LastName) VALUES ('Test','Tube')"; 
    command.CommandText = sql; 
    command.ExecuteNonQuery(); 
    conn.Close(); 
} 

Когда я кладу в параметрах я получаю сообщение об ошибке: Npgsql.NpgsqlException: ОШИБКА: 42703: колонка "_firstname" не существует

[Test] 
public void InsertWithParameters() 
{ 
NpgsqlConnection conn = new NpgsqlConnection("Host=localhost; Database=postgres; User ID=postgres; Password=password"); 
conn.Open(); 

IDbCommand command = conn.CreateCommand(); 
string sql = "INSERT INTO Customers (FirstName,LastName) VALUES (_FirstName,_LastName)"; 
command.CommandText = sql; 

var parameter = command.CreateParameter(); 
parameter.ParameterName = "_FirstName"; 
parameter.Value = "Test"; 
command.Parameters.Add(parameter); 

parameter = command.CreateParameter(); 
parameter.ParameterName = "_LastName"; 
parameter.Value = "Tube"; 
command.Parameters.Add(parameter); 

command.ExecuteNonQuery(); 
conn.Close(); 
} 
+0

Прописные <> в нижнем регистре. Либо используйте только строчные буквы, либо укажите свои идентификаторы (используя двойные кавычки). – wildplasser

+0

Я просто пробовал все имена параметров нижнего регистра, и я все равно получаю ту же ошибку. –

+0

в psql (или pgadmin) проверьте, каковы фактические имена ваших столбцов. – wildplasser

ответ

4

Ответы в отзывах верны:

  1. Npgsql не поддерживает _ в качестве параметра ameter замещение место хранения. Вы должны использовать @ или: (так @FirstName или: FirstName, а не _FirstName).
  2. PostgreSQL автоматически уменьшит ваши имена таблиц и столбцов, если они не имеют двойные кавычки. Либо используйте имена нижнего регистра для всех (более простых) или котируемых идентификаторов в ваших SQL-запросах.

Так что ваш код должен выглядеть примерно так:

IDbCommand command = conn.CreateCommand(); 
string sql = "INSERT INTO Customers (first_name, last_name) VALUES (@FirstName,@LastName)"; 
command.CommandText = sql; 

var parameter = command.CreateParameter(); 
parameter.ParameterName = "FirstName"; 
parameter.Value = "Test"; 
command.Parameters.Add(parameter); 
+1

Я не согласен с рекомендациями №2. Цитируемые идентификаторы не должны использоваться вообще. Если вы определяете поле с кавычками, вы также должны использовать их каждый раз, когда вы ссылаетесь на это поле. Так что лучше того стоит (но этого не будет). Casing vs underscore является спорным. Использование обмолоченных имен отлично работает без цитируемых идентификаторов, и иногда это будет предпочтительнее ... зависит от проекта. –

+1

Использование обмолоченных имен не работает просто отлично, без цитируемых идентификаторов, в том смысле, что PostgreSQL сбрасывает имя в нижний регистр. Это означает, что 'Ident1' и' ident1' будут в конфликте. Нет ничего особенного в цитировании ваших идентификаторов - это стандартная практика PostgreSQL и необходимость в смешанном случае. Например, O/RM, который сопоставляет имена свойств C# столбцам базы данных (например, Entity Framework), обычно цитирует все идентификаторы. –

+0

Вы можете выпускать запросы определения и запросы данных с обложенными именами, и это будет работать нормально. Postgres будут обрабатывать их с помощью своей версии «нечувствительности к регистру», то есть они будут ниже. ORM, неспособные сопоставить имена с нижним окошком с объектами, имеющими имя объекта, вероятно, также будут иметь проблемы с вашим другим предложением использования символов подчеркивания. ORM, которые создают столбцы с указанными идентификаторами, создают задолженность, которую пользователи должны будут платить в будущем. –

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