2016-12-15 9 views
0

Я пытаюсь запустить этот запрос, чтобы вставить новую строку в таблицу пользователей из моего кода C помощью PQexec() (libpq)связи МЭ не существует ошибку, только с libpq

INSERT INTO Users 
VALUES (( 
SELECT MIN(s.id) 
FROM generate_series(1,( 
SELECT GREATEST(MAX(Id) + 1,1) FROM Users 
)) AS s(id) 
WHERE NOT EXISTS (SELECT 1 FROM Users WHERE Id = s.id)) 
, 'Tester', 27) 
RETURNING Id; 

Он выполняет то, что мне нужно когда я запустить его в Psql терминале, но из C возвращает

Error executing query: ERROR: relation "users" does not exist 

Я проверил состояние соединения и ей это удалось, используя один и тот же пользователь я подключиться из терминала. Почему он не может найти таблицу пользователей?

EDIT: добавление C-код Подключение:

sprintf(connect_param,"host=address dbname=%s user=%s password=%s", 
                USERNAME, USERNAME, PASSWORD); 
conn = PQconnectdb(connect_param); 

Запрос:

sprintf(cmd, "INSERT INTO Users " 
      "VALUES ((" 
      "SELECT MIN(s.id) " 
      "FROM generate_series(1,(" 
      "SELECT GREATEST(MAX(Id) + 1,1) FROM Users " 
      ")) AS s(id) " 
      "WHERE NOT EXISTS (SELECT 1 FROM Users WHERE Id = s.id)) " 
      " , \'%s\', %d) " 
      "RETURNING Id;", Name, Age); 
res = PQexec(conn,cmd); 
+0

можете ли вы разместить свой фактический код C, а не просто запрос –

+0

Правильность настроек подключения? Вы использовали 'USERNAME' дважды в коде, который вы отправили, один раз для' dbname =% s' и один раз для 'user =% s'. –

+0

@IanAbbott да, они такие же. –

ответ

1

Я иду к вычету:

Error executing query: ERROR: relation "users" does not exist 

Этот вид ошибки броска, когда базы данных не находит таблицу (вид, или wathelse может пройти через SELECT, он дает имя из «отношения»). Таким образом, ваш код выглядит хорошо, но подмножество причин может быть следующим:

  • пользователей таблицы не существует. Некоторые орфографическая ошибка
  • выполнения запроса в неправильной базе данных (где эта таблица не определена)
  • вы выполняете запрос в неверном сервере (как описано выше)
  • выполнения запроса в неправильной схеме (как выше)
  • Строка получает усечение из sprintf.

и тому подобное. Соединение работает очень хорошо, так как вы получаете ответ из базы данных

+0

Это была неправильная база данных. Позор ... –

0

ваша проблема библиотеки ссылка на компиляции.

gcc -I/usr/include/postgresql/ -L/usr/lib/postgresql/8.3/lib/ -lpq 
+0

не думаю, что так ... я компилирую с библиотекой, и у меня нет компиляции или ссылок на ошибки. –