【问题标题】:What's the simplest way to execute a query in Visual C++在 Visual C++ 中执行查询的最简单方法是什么
【发布时间】:2008-08-25 00:27:50
【问题描述】:

我正在使用 Visual C++ 2005,想知道连接到 MS SQL Server 并执行查询的最简单方法。

我正在寻找像 ADO.NET 的 SqlCommand 类一样简单的东西,它是 ExecuteNonQuery()、ExecuteScalar() 和 ExecuteReader()。

Sigh 使用 CDatabase 和 ODBC 提供了答案。

任何人都可以演示如何使用 OleDb 的 ATL 使用者模板来完成吗?

从查询中返回一个标量值呢?

【问题讨论】:

    标签: sql-server-2005 visual-c++ mfc


    【解决方案1】:

    如果通过 ODBC 连接使用 MFC,则使用 CDatabase 和 ExecuteSQL。

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

    【讨论】:

      【解决方案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/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)的优点在于它非常快速、可移植(我在许多平台上都使用过它),并且可以连接到许多不同的数据库。

      【讨论】:

        【解决方案3】:

        我最近用过这个:

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

        【讨论】:

          【解决方案4】:

          试试微软企业库。 C++ 应该有一个可用的版本here。 SQlHelper 类暗示了您正在寻找的旧 ADO 时代的方法。如果您可以使用第 2 版,您甚至可以使用相同的语法。

          【讨论】:

            猜你喜欢
            • 2015-08-09
            • 1970-01-01
            • 2011-06-02
            • 1970-01-01
            • 2011-07-13
            • 2010-09-10
            • 1970-01-01
            • 2011-03-21
            • 2010-09-23
            相关资源
            最近更新 更多