npg sql executetescalar () всегда ничего не возвращает - PullRequest
1 голос
/ 17 февраля 2020

Я использую npg sql в качестве пакета nuget в Visual Studio 2017 с Visual Basic c. Различные команды работают очень хорошо, но ExecuteScalar всегда возвращает «ничто», хотя должно дать результат.

Команда выглядит следующим образом:

   Dim ser As Integer
   Dim find = New NpgsqlCommand("SELECT serial from dbo.foreigncode WHERE code = '@code';", conn)
   Dim fcode = New NpgsqlParameter("code", NpgsqlTypes.NpgsqlDbType.Varchar)

   find.Parameters.Add(fcode)
   find.Prepare()

   fcode.Value = "XYZ"

   ser = find.ExecuteScalar()     ==>  nothing

Когда командная строка копируется как Значение во время отладки и вставка в инструмент запросов PGADMIN дает правильный результат. Строка определенно есть.

Различные команды, выполняемые с помощью ExecuteNonQuery (), работают хорошо, включая команды, выполняющие операторы UPDATE в рассматриваемой строке.

Когда я просматриваю свойства параметра fcode непосредственно перед ExecuteScalar, он показывает, что «fcode.DataTypeName» вызвал исключение «System.NotImplementedException».

Если я изменил свой подготовленный оператор на « SELECT @code "и установите значение параметра в произвольное значение, только это значение возвращается. Нет доступа к таблице, потому что имя таблицы не является частью SELECT в этом случае. Если я удалю WHERE CLAUSE в SELECT и просто выберу один столбец, я также ожидаю, что что-то должно быть возвращено. Но опять же, это ничего.

Да, есть столбец с именем serial. Он имеет тип bigint и не может содержать NULL. Запрос показывает, что нет ни одной строки, содержащей NULL, ни в одном столбце.

Последние выводы: я запросил другую таблицу, в которой столбец поиска и столбец результатов оказались с одинаковым типом данных. Это работает, так что синтаксис, передача параметра, подготовить et c. кажется, работает в принципе. System.NotImplementedException в свойстве DataTypeName параметра также встречается, но все равно работает. Я перестроил индекс рассматриваемой таблицы. Без изменений. Тем не менее: когда я копирую / вставляю CommandText и выполняю его в PGAdmin, он показывает правильный результат. Изменение команды и использование там простого текста без параметров и без подготовки все еще ничего не дает. Простой текст CommandText был скопирован / вставлен из PGAdmin, где он был успешно выполнен ранее. Очень странно.

Возвращение столбца поиска и столбца результатов также ничего не дает в результате.

Ответы [ 2 ]

1 голос
/ 18 февраля 2020

Я наконец нашел это. Часто маленькие вещи могут иметь большое влияние. Когда значение было присвоено параметру, индекс подстроки был неверным. Теперь это работает отлично. Спасибо всем, кто уделил этому время.

1 голос
/ 17 февраля 2020

Пожалуйста, попробуйте эти две альтернативы и опубликуйте результаты:

' Alternative 1: fetch the entire row, see what's returned
Dim dr  = find.ExecuteReader()
While (dr.Read())
  Console.Write("{0}\t{1} \n", dr[0], dr[1])
End While

' Alternative 2: Check if "ExecuteScalar()" returns something other than an int
Dim result = find.ExecuteScalar()

... и (я только что заметил ответ Ханибоя Уилсона!) ...

Исправьте свой синтаксис:

' Try this first: remove the single quotes around "@code"!
Dim find = New NpgsqlCommand("SELECT serial from dbo.foreigncode WHERE code = @code;", conn)

Обновление 1

Пожалуйста, попробуйте это:

 Dim find = New NpgsqlCommand("SELECT * from dbo.foreigncode;", conn)

В: Это что-нибудь возвращает?

Dim dr  = find.ExecuteReader()
While (dr.Read())
  Console.Write("{0}\t{1} \n", dr[0], dr[1])
End While

Q: Это?

Dim result = find.ExecuteScalar()

Q: У вас есть столбец с именем "serial"? Что это за тип данных? Является ли оно ненулевым для строки (й) с 'XYZ'?

Пожалуйста, обновите исходное сообщение с этой информацией.


Обновление 2

Вы похоже делаете ": все правильно":

  • Вы подтвердили, что можете подключиться,
  • Вы подтвердили, что обновления без запроса к той же самой таблице (с npg sql),
  • Вы подтвердили, что сами запросы SQL действительны (скопировав / вставив тот же SQL в PGAdmin и получив допустимые результаты).

Как сказал Шей Рожанский, «System.NotImplementedException в свойстве DataTypeName» - это известная проблема, возникающая в отладчике. Это не имеет ничего общего с вашей проблемой: https://github.com/npgsql/npgsql/issues/2520

ПРЕДЛОЖЕНИЯ (я хватаюсь за стр aws) ::

  1. Дважды проверьте «разрешения» в вашей базе данных и таблице.

  2. Рассмотрите возможность установки другой версии npg sql.

  3. Be уверен ваш код обнаруживает любые / все возвраты и исключения ошибок (кажется, что вы, вероятно, уже делаете это, но это никогда не повредит)

.. и ...

Включить подробное ведение журнала на стороне клиента и на сервере:

... Наконец-то ...

В: Можете ли вы сделать ЛЮБОЙ запрос из ЛЮБОГО таблица, используя ЛЮБОЙ метод запроса (ExecuteReader (), ExecuteScalar (), ... НИЧЕГО) из вашего npgsql /.Net клиента ВСЕХ ?

...