Какой самый простой способ выполнить запрос в Visual C++

Я использую Visual C++ 2005 и хотел бы узнать, как проще всего подключиться к MS SQL Server и выполнить запрос.

Я ищу что-то столь же простое, как класс ADO.NET SqlCommand с его ExecuteNonQuery (), ExecuteScalar () и ExecuteReader ().

Вздох предложил ответ, используя CDatabase и ODBC.

Может ли кто-нибудь продемонстрировать, как это будет сделано с использованием потребительских шаблонов ATL для OleDb?

А как насчет возврата скалярного значения из запроса?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
5 456
4

Ответы 4

Попробуйте корпоративную библиотеку Microsoft. Должна быть доступна версия здесь для C++. Класс SQlHelper реализует методы, которые вы ищете из старых времен ADO. Если вам удастся достать версию 2, вы даже можете использовать тот же синтаксис.

С MFC используйте CDatabase и ExecuteSQL, если используете соединение ODBC.

CDatabase db(ODBCConnectionString);
db.Open();
db.ExecuteSQL(blah);
db.Close();

Я использовал это недавно:

#include <ole2.h>
#import "msado15.dll" no_namespace rename("EOF", "EndOfFile")
#include <oledb.h> 
void CMyDlg::OnBnClickedButton1()
{
    if ( FAILED(::CoInitialize(NULL)) )
        return;
    _RecordsetPtr pRs = NULL;

    //use your connection string here
    _bstr_t strCnn(_T("Provider=SQLNCLI;Server=.\SQLExpress;AttachDBFilename=C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\db\db.mdf;Database=mydb;Trusted_Connection=Yes;MARS Connection=true"));
    _bstr_t a_Select(_T("select * from Table"));


    try {

            pRs.CreateInstance(__uuidof(Recordset));
            pRs->Open(a_Select.AllocSysString(), strCnn.AllocSysString(), adOpenStatic, adLockReadOnly, adCmdText);

            //obtain entire restult as comma separated text:
            CString text((LPCWSTR)pRs->GetString(adClipString, -1, _T(","), _T(""), _T("NULL")));

            //iterate thru recordset:
            long count = pRs->GetRecordCount();

            COleVariant var;
            CString strColumn1;
            CString column1(_T("column1_name")); 

            for(int i = 1; i <= count; i++)
            {
                var = pRs->GetFields()->GetItem(column1.AllocSysString())->GetValue();
                strColumn1 = (LPCTSTR)_bstr_t(var);
            }
    }
    catch(_com_error& e) {
            CString err((LPCTSTR)(e.Description()));
            MessageBox(err, _T("error"), MB_OK);
            _asm nop; //
    }
   // Clean up objects before exit.
   if (pRs)
       if (pRs->State == adStateOpen)
              pRs->Close();



     ::CoUninitialize();
}

Вы должны иметь возможность использовать для этого OTL. Это в значительной степени:

#define OTL_ODBC_MSSQL_2008 // Compile OTL 4/ODBC, MS SQL 2008
//#define OTL_ODBC // Compile OTL 4/ODBC. Uncomment this when used with MS SQL 7.0/ 2000
#include <otlv4.h> // include the OTL 4.0 header file
#include <stdio>

int main()
{
  otl_connect db; // connect object
  otl_connect::otl_initialize(); // initialize ODBC environment
  try
  {
    int myint;

    db.rlogon("scott/tiger@mssql2008"); // connect to the database
    otl_stream select(10, "select someint from test_tab", db);

    while (!select.eof())
    {
      select >> myint;
      std::cout<<"myint = " << myint << std::endl;
    }
  }
  catch(otl_exception& p)
  {
    std::cerr << p.code << std::endl;     // print out error code
    std::cerr << p.sqlstate << std::endl; // print out error SQLSTATE
    std::cerr << p.msg << std::endl;      // print out error message
    std::cerr << p.stm_text << std::endl; // print out SQL that caused the error
    std::cerr << p.var_info << std::endl; // print out the variable that caused the error
  }

  db.logoff(); // disconnect from the database

  return 0;
}

В OTL, IMO, хорошо то, что он очень быстрый, портативный (я использовал его на многих платформах) и подключается к очень большому количеству различных баз данных.

Другие вопросы по теме