SQL Server не возвращает все столбцы таблицы - PullRequest
0 голосов
/ 18 мая 2018

У меня есть старое приложение (созданное с помощью Visual C ++ 6.0), использующее MFC и RecordSets для доступа к SQL Server 2016 с использованием драйвера ODBC для SQL.Код использует множество функций MFC для динамического получения информации о таблице для доступа.При открытии ColumnSet выполняются следующие шаги:

...
SQLColumns(...);
AllocAndCacheFieldInfo();
AllocRowset();
MoveNext();
m_bBOF = m_bEOF;
...

После MoveNext () значение m_bEOF равно true.Но это должно быть ложным, чтобы следующий код работал правильно при получении столбцов таблицы.

Этот (старый) код хорошо работает с базой данных MS Access и с базой данных Postgres.Поэтому я думаю, что мой код должен быть в порядке.Теперь я бы подумал о настройке базы данных или драйвера ODBC.Но: Использование MS Access для связи с таблицей базы данных SQL с использованием того же источника данных работает нормально.Все таблицы перечислены успешно.Это означает, что база данных работает нормально, а источник данных тоже работает нормально.

А теперь я немного растерялся.Что мне нужно сделать, чтобы мой код работал нормально?Я проверил сайты MSDN на наличие функций MFC, но не нашел никаких подсказок для обновления кода.

У вас, ребята, есть какая-нибудь помощь для меня?Я был бы очень признателен.Если вам нужна дополнительная информация, я опубликую ее.

С уважением

1 Ответ

0 голосов
/ 28 мая 2018

Я использовал профилировщик SQL, чтобы выяснить какие-либо различия, и получил эти результаты.

мой код:

exec [MyDatabase].[sys].sp_columns_100 N'MyTable',N'sys',N'MyDatabase',NULL,@fUsePattern=1

MS Access:

exec [sys].sp_columns_100 N'MyTable',N'dbo',NULL,NULL,@fUsePattern=1

ИтакЯ изменил параметры для SQLColumns (), чтобы предоставить только имя таблицы и больше не базу данных и владельца.

старый код:

SQLColumns(m_hstmt,
           (UCHAR FAR *)(const char*)m_strQualifierParam,
           SQL_NTS,
           (UCHAR FAR *)(const char*)m_strOwnerParam,
           SQL_NTS,
           (UCHAR FAR *)(const char*)m_strTableNameParam,
           SQL_NTS,
           NULL,
           SQL_NTS)

новый код:

SQLColumns(m_hstmt,
           (UCHAR FAR *)NULL,
           SQL_NTS,
           (UCHAR FAR *)NULL,
           SQL_NTS,
           (UCHAR FAR *)(const char*)m_strTableNameParam,
           SQL_NTS,
           NULL,
           SQL_NTS)

Теперь при использовании моего нового кода результат профилировщика выглядит так:

exec [sys].sp_columns_100 N'MyTable',NULL,NULL,NULL,@fUsePattern=1

И это работает.Он также работает для MS Access и PostgreSQL.

...