2016-06-05 4 views
1

Так я переключение с SQL Server 2008 R2 (на Windows Server 2012) в PostgreSQL 9.5 (опять же на Windows) и все мои существующие заявления SQL записываются в следующем формате:Зачем мне нужно указывать столбцы и таблицы с помощью Npgsql для C# и PostgreSQL?

INSERT INTO Address (Address1, Address4, Address5, Postcode, IsoCountryCode) 
VALUES(@P0, @P1, @P2, @P3, @P4) 

Я использую Ngpsql v3.1.3 как моя библиотека .NET, чтобы поговорить с PostgreSQL с C#. Выполнение того же оператора приводит к ошибке, что адрес таблицы не найден. Для того, чтобы заставить его работать я должен обернуть все имена столбцов и имена таблиц в двойных кавычках, например:

INSERT INTO \"Address\" (\"Address1\", \"Address4\", \"Address5\", \"Postcode\", \"IsoCountryCode\") 
VALUES(@P0, @P1, @P2, @P3, @P4) 

У меня есть более 600 запросов SQL в моем приложении, и я не хочу, чтобы пройти их всех инъекционные кавычки повсюду.

Образец документации Npgsql не использует кавычки, так что я чего-то не хватает? Смотрите здесь Npgsql Documentation Example

В частности, их пример имеет это:

INSERT INTO data (some_field) VALUES ('Hello world') 

Так я предположил, что я не должен был бы двойные кавычки вещи. Может ли кто-нибудь просветить меня?

+2

имен объектов по умолчанию чувствителен к регистру, однако, если вы создаете регистрозависимы имена объектов (т.е. они также цитируются в DDL), тогда вам также нужно процитировать их в запросах (если имя не соответствует формату хранения имен, нечувствительных к регистру). –

+0

Хорошо, поэтому я предполагаю, что в PostgreSQL должна быть настройка, чтобы изменить это. Я буквально установил PostgreSQL v9.5 и не изменил никаких параметров конфигурации. – Gareth

ответ

3

Как упоминалось в комментариях, это просто то, как работает PostgreSQL - PostgreSQL неявно преобразует некотируемые идентификаторы в нижний регистр. Нет настроек AFAIK, чтобы изменить это поведение. The docs on lexical structure утверждают, что:

Цитирование идентификатора также делает его чувствителен к регистру, тогда как неупомянуты имен всегда сложены в нижнем регистр. Например, идентификаторы FOO, foo и «foo» считаются одинаковыми по PostgreSQL, но «Foo» и «FOO» отличаются от этих трех и друг друга. (Складывание некотируемых имен в нижнем регистре в PostgreSQL несовместимо с стандартом SQL , в котором говорится, что неупомянутые имена должны быть свернуты в верхний регистр . Таким образом, foo должен быть эквивалентен «FOO» не «foo» в соответствии с стандарт. Если вы хотите писать переносимые приложения, которые советуют не всегда процитировать конкретное имя или никогда не процитировать.)

+0

Хорошо, я понимаю это сейчас. Спасибо, что поняли. Мои определения таблиц и имена столбцов были в паскале. например Таблица = Адрес, Столбцы = Адрес1, Адрес2 и т. Д. Преобразование их в нижний регистр позволило моим запросам запускать без кавычек. – Gareth

+0

Дополнительное спасибо Mark Rotteveel также, как вы говорите, он упомянул об этом первоначально, но он не нажимал на меня, пока Шей не разработал. – Gareth