在Visual C ++中执行查询的最简单方法是什么
时间:2020-03-05 18:42:41 来源:igfitidea点击:
我正在使用Visual C ++ 2005,并且想知道连接到MS SQL Server并执行查询的最简单方法。
我正在寻找像ADO.NET的SqlCommand类一样简单的东西,它具有ExecuteNonQuery(),ExecuteScalar()和ExecuteReader()。
Sigh使用CDatabase和ODBC提供了一个答案。
谁能证明使用OleDb的ATL使用者模板将如何完成?
从查询返回标量值又如何呢?
解决方案
回答
尝试使用Microsoft Enterprise Library。这里应该有适用于C ++的版本。 SQlHelper类隐含了我们在ADO时代中正在寻找的方法。如果我们可以使用版本2,甚至可以使用相同的语法。
回答
如果通过ODBC连接,则与MFC一起使用CDatabase和ExecuteSQL。
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; }
IMO的OTL的好处是它非常快速,可移植(我已经在许多平台上使用过它),并且可以连接到许多不同的数据库。