2008-08-25 44 views
3

私はVisual C++ 2005を使用しており、MS SQL Serverに接続してクエリを実行する最も簡単な方法を知りたいと考えています。Visual C++でクエリを実行する最も簡単な方法は何ですか

私は、ExecuteNonQuery()、ExecuteScalar()、およびExecuteReader()を使用して、ADO.NETのSqlCommandクラスと同じように簡単なものを探しています。

SighはCDatabaseとODBCを使用して答えを提供しました。

誰でも、OleDbのATLコンシューマテンプレートを使用してどのように行うことができますか?

クエリからスカラー値を返すのはどうですか?

答えて

0

Microsoftエンタープライズライブラリをお試しください。 C++のバージョンはhereにする必要があります。 SQlHelperクラスは、古いADO日から探しているメソッドを暗示します。バージョン2を手に入れることができれば、同じ構文を使うことさえできます。

2

MFCでは、ODBC接続経由でCDatabaseとExecuteSQLを使用します。

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

私は最近、これを使用:

#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(); 
} 
2

をあなたはこのために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/[email protected]"); // 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、それはポータブル、非常に高速であるということです、そして非常に多くの異なるデータベースに接続します。これはかなりです。

関連する問題