Miguel Altamirano Morales Ответов: 2

Как заполнить combobox из datatable


Добрый день всем; я хотел бы задать новый вопрос, если вы не возражаете:

Я пытаюсь эмигрировать старую систему Access 2010 в сетевое приложение, которое я разрабатываю с помощью VB net 2017.

В приложении Access поле combobox заполняется из свойства Source Row этого поля со следующей инструкцией sql:

SELECT
      dbo_articulos.Id_art,
      dbo_articulos.desc As Descripción,
      dbo_articulos.fecha_compra As Fecha,
      IIf(Not IsNull([dbo_articulos].[fac_Origen]),[dbo_proveedor].[nombre] & "  [Compra Nacional]",IIf([dbo_articulos_factura].[estatus] = 99,"CANCELADA","ACTIVA")) AS Status,
      dbo_articulo_proveedor.nombre
FROM
      dbo_articulos INNER JOIN dbo_proveedores ON dbo_articulos.proveedor_id = dbo_proveedores.proveedor_id
WHERE
      (((dbo_articulos_grupo) = 1))
ORDER BY
      dbo_articulos.Id ASC,
      dbo_articulos.factura ASC;

Я использую тот же код в строковой переменной (Qrye), чтобы заполнить dataTable этим кодом:

Da = New SqlDataAdapter(Qrye, Cn)
        Da.Fill(Dt)
        Combo_Articulos.DataSource = Dt

Но в инструкции "IIf" в коде (содержащей "Not IsNull") он посылает мне сообщение об ошибке, сообщающее мне "неправильный синтаксис рядом со словом "Not"", например, если он не распознает функцию "Not IsNull".

Я пытался изменить его на Is NotDBNull, IsNot Null, но ошибка остается там или говорит мне, что NotDbNull не является распознанной функцией. Я думаю, что мне нужно было бы только закодировать функцию "Not Null", закодированную там. Он прекрасно работает в Access, но Ной в VB net.

Я был бы очень признателен за любую помощь, которую кто-нибудь мог бы мне оказать, или, может быть, есть лучший способ заполнить эту комбинацию, чем эта; например, сущность ADO или что-то в этом роде.

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

Что я уже пробовал:

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

Maciej Los

Функция isnull[^] очень хорошо известна функция MS Access, и Вы можете использовать ее в OleDb. Поделитесь своим точным оператором запроса (со всеми конкатенациями строк) и строкой подключения.

Miguel Altamirano Morales

Рад снова связаться с вами, Мацей; я уже обновил свой вопрос. Весь код моего SQL-запроса находится там, и соединение с базой данных было правильно установлено, когда моя программа VB достигает этой точки.

Вся проблема (я думаю) в том, что VB Net 2017 не распознает функцию "Not IsNull" в начале оператора "IIf". Я думал, что это было заявление "IIf", которое не было признано, но я сделал тест, и он хорошо работает.

То, что я пытаюсь достичь, - это заполнить комбинацию в Коде доступа VB Net 2017 con VB. Я просто скопировал его таким, как он есть, с функцией "Not isNull".

Maciej Los

Рад снова тебя слышать, Мигель.
Как я уже упоминал, функция IsNull хорошо известна и может быть использована в OleDb. Довольно часто я им пользуюсь. Никогда не сообщал о проблемах. На первый взгляд ваш запрос содержит двойные кавычки, которые могут быть причиной ваших проблем. Вот почему я хочу видеть все заявление, например::
Dim query = "Your query here"

Miguel Altamirano Morales

Эй!! может быть, ошибка заключается в утверждении "IIf"!!!.

Я проверю

Maciej Los

Это может быть причиной вышеупомянутой ошибки.

Miguel Altamirano Morales

Сейчас меня нет в офисе, завтра я сниму двойные кавычки и посмотрю, сработает ли это. Я также сделаю некоторые тесты, чтобы увидеть, поддерживается ли оператор 'IIf' в таком запросе.

Спасибо тебе, Мацей !!!

2 Ответов

Рейтинг:
9

Maciej Los

Я вижу несколько ошибок в вашем запросе:

SELECT
      dbo_articulos.Id_art,
      dbo_articulos.desc As Descripción,
      dbo_articulos.fecha_compra As Fecha,
      IIf(Not IsNull([dbo_articulos].[fac_Origen]),[dbo_proveedor].[nombre] & "  [Compra Nacional]",IIf([dbo_articulos_factura].[estatus] = 99,"CANCELADA","ACTIVA")) AS Status,
      dbo_articulo_proveedor.nombre
FROM
      dbo_articulos INNER JOIN dbo_proveedores ON dbo_articulos.proveedor_id = dbo_proveedores.proveedor_id
WHERE
      (((dbo_articulos_grupo) = 1))
ORDER BY
      dbo_articulos.Id ASC,
      dbo_articulos.factura ASC;



1. [dbo_proveedor] не существует в текущем контексте, потому что имя таблицы является: dbo_proveedores
2. В какой таблице dbo_articulos_grupo поле принадлежит?
3. & " [Compra Nacional]" - если [Compra Nacional] это поле, вы использовали неправильную конкатенацию!

Вы должны быть уверены, что ваш запрос правильный.

Я бы настоятельно рекомендовал использовать псевдонимы таблиц, например:
SELECT tb1.Field1, tb2.Field1
FROM TableName1 AS tb1 INNER JOIN TableName2 AS tb2 ON tb1.PrimaryKey = tb2.ForeignKey


Для получения более подробной информации, пожалуйста, смотрите: Использование Псевдонимов Таблиц[^]


Miguel Altamirano Morales

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

Miguel Altamirano Morales

Привет друзья: вот код, который я скопировал из приложения Access в свою программу в VB Net, чтобы заполнить datatable:

Dim Qrye as string ="SELECT
dbo_articulos.Id_art Как Сайт Articulo,
dbo_articulos.описание как описание,
dbo_articulos.fecha_compra как Феха,
IIf(не IsDBNull([dbo_articulos].[fac_Origen]),[dbo_proviedores].[имя] &ампер; " [общем Насьональ]",функции IIF([dbo_articulos.Фактура].[estatus] = 99, "CANCELADA","ACTIVA")) Как состояние,
dbo_articulo_proveedor.Идентификатор
ОТ
dbo_articulos внутреннее соединение dbo_proviedores на dbo_articulos.proveedor_id = dbo_proviedores.proveedor_id
ГДЕ
(((dbo_articulos.grupo) = 1))
ЗАКАЗАТЬ ПО
dbo_articulos.Идентификатор АСК,
dbo_articulos.фактура АСК"

Я только что изменил исходное "Not IsNull" на "Not IsDBNull", и кажется, что VB net принял его, но он продолжает говорить мне, что "есть ошибка sintax рядом со словом" Not"", как если бы он не мог принять утверждение "IIf".

Моя точка зрения такова: мне нужно увидеть, если поле не имеет определенного значения (в данном случае Null), и если true, отправить значение в поле в datatable, а если false, отправить другое, в то же поле.

Я думаю о том, чтобы сделать хранимую процедуру SQL с вложенными "если" вместо этого, чтобы посмотреть, смогу ли я достичь того, чего хочу; я собираюсь искать примеры, или если у кого-то, читающего это, есть один, я был бы очень признателен, если бы вы прислали мне его.

Спасибо Вам, Мацей, спасибо всем вам, друзья

Maciej Los

Прежде всего, MS Access database engine не знает функции IsDbNull. Вы даже не можете создать хранимую процедуру SQL в базе данных MS Access. Ваш оператор sql все еще неверен. Я бы посоветовал вам проверить синтаксис запроса непосредственно в базе данных MS Access. Вы должны знать, что база данных MS Access очень любит скобки, когда их мало.
Кстати: какова ваша строка подключения?

Miguel Altamirano Morales

Спасибо за этот новый ответ, Мацей.

Да, функция "IsDBNull" не входит в запрос MS Access. Изначально у него было "не IsNull", когда я его скопировал; я изменил его, когда поместил в VB Net.

Похоже, моя проблема уже решена в новой программе VB, и вероятная частота ошибок была утверждением "IIf". Он хорошо работает в VBA Access, но не в VB net, поэтому я изменил его на 'CASE ... Конец", и это сработало отлично.

У меня больше нет смысла в этом старом приложении Access с его кодировкой VBA. Что мне нужно сделать, так это преобразовать его в VB Net, поэтому в первую очередь я попытался скопировать исходный код и вставить его в свою новую программу vb, но я видел, что это может быть проблематично.

Спасибо еще раз.

Maciej Los

VB отличается от VB.NET-да. Каждая старая программа должна быть переписана с нуля.

Miguel Altamirano Morales

- Да, ты прав. Я больше не буду этого делать; по крайней мере, после глубокого и первоначального анализа.

Моя ошибка заключалась в том, что я пытался делать все точно так же, как старое приложение, как хочет пользователь.

Рейтинг:
19

RickZeeland

Я же не ... VB.NET / специалист по доступу, но, возможно, это ответит на ваш вопрос: VB .net и Microsoft Access - нулевая проблема-VBForums[^]
Я думаю, что вам нужно использовать IsDBNull.

Если вы заинтересованы в PostgreSQL вот несколько интересных статей на CodeProject:
Поиск[^]
Хотя эта статья немного устарела, я бы рекомендовал начать с Использование PostgreSQL в вашем приложении C# (.NET) (введение)[^]


Miguel Altamirano Morales

Большое спасибо, Рикзиленд. Я с удовольствием прочитаю ваш намек и дам вам знать.

Miguel Altamirano Morales

Да, но прошу об отказе; попробуйте определить, не является ли поле нулевым;

Ive пытался "не IsDBNull", "не значение dbnull", "не значение dbnull", и никто не работает. Я очень удивлен.

RickZeeland

Тогда, возможно, пришло время начать использовать другую базу данных, но имейте в виду: SQL Server намного сложнее Access, лично я использую PostgreSQL с драйвером NpgSql.
Я обновлю решение выше с некоторыми советами для вас.

Miguel Altamirano Morales

Я использую базы данных sql server express. Access является родной средой этого старого приложения и работает с SQL Server. Я также пытаюсь преобразовать его в VB Net 2017 с помощью sql server. Я все равно не использую базы данных Access.

Я даже просто скопировал машинный код (из Access VBA) в свой проект VB Net, и именно там указанная строка кода не распознается.

Большое спасибо.

RickZeeland

Ах, это все проясняет, тогда вам придется использовать функцию ISNULL ().
Смотрите: https://docs.microsoft.com/en-us/sql/t-sql/functions/isnull-transact-sql