C++访问SQLServer数据库

Jasonli8205 2007-02-01 04:33:07
我想写一个纯C++的程序,就是不用vc提供的MFC等类库,只用标准的C++库!现在想访问MSSQLServer数据库。该怎么做呢?如果有例子提供,小弟不胜感谢!
...全文
3051 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
fautan 2008-01-15
  • 打赏
  • 举报
回复
可以用托管c++直接使用.netframework很方便
Jimmy817 2007-11-01
  • 打赏
  • 举报
回复
请问 iu_81 大侠:
代码中 m_pConnection->Open(strConnect, " ", " ",adModeUnknown) 第二.三个参数是不是数据库 userid 和password?
我得到如下的错误,是怎么回事:
qld001 2007-08-14
  • 打赏
  • 举报
回复
记得import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
no_namespace rename("EOF", "EndOfFile")
部分要在所有的include之后阿
Zhentiwei 2007-08-14
  • 打赏
  • 举报
回复
学习学习
xuejinn 2007-08-14
  • 打赏
  • 举报
回复
mark
roger_77 2007-02-02
  • 打赏
  • 举报
回复
OTL提供了一些使用OTL访问数据库的简单例子,可以下载来参考:
http://otl.sourceforge.net/otl4_examples.zip

http://otl.sourceforge.net/otl3_down.htm
roger_77 2007-02-02
  • 打赏
  • 举报
回复
可以考虑使用OTL类库,它是一个可跨平台的C++模板库:
http://otl.sourceforge.net

OTL 4.0 is a C++ library based on templates. It integrates all of the previous releases into one library.

OTL 4.0 is ANSI C++ compliant (ANSI C++ typecasts, clean templatized code, etc.), tightly integrated with the Standard Template Library (STL) via so-called STL-compliant stream iterators, and natively supports the STL std::string's in otl_stream's.

The current version of the OTL supports :
Oracle 7 (natively via OCI7),
Oracle 8 (natively via OCI8),
Oracle 8i (natively via OCI8i),
Oracle 9i (natively via OCI9i),
Oracle 10g (natively via OCI10g),
DB2 (natively via DB2 CLI),
ODBC 3.x as well as ODBC 2.5 compliant data sources in MS Windows and Unix (e.g. Oracle,
MS SQL Server,
Sybase,
Informix,
MySQL,
DB2,
Interbase / Firebird,
PostgreSQL,
SQLite,
SAP/DB,
TimesTen,
MS ACCESS,
etc.).
The list of supported database backends is constantly growing.


ben_bear 2007-02-01
  • 打赏
  • 举报
回复
char * query_cmd = "DELETE FROM stu_info WHERE sname = '本拉登'";
应该是 char * query_cmd = "DELETE FORM stu_info WHERE sname = '本拉登'";
吧?
是FORM吧?
hertcloud 2007-02-01
  • 打赏
  • 举报
回复
JF....
HewpKanXue 2007-02-01
  • 打赏
  • 举报
回复
纯C++不知道数据库为何物
miniplayer 2007-02-01
  • 打赏
  • 举报
回复
学习
iu_81 2007-02-01
  • 打赏
  • 举报
回复
利用ADO访问MS SQL2000
要求: 【1】输出stu_info表内的每一条记录
【2】添加一条新记录
【3】删除名字为"本拉登"的记录
*/
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
no_namespace rename("EOF", "EndOfFile")
#include <iostream>
#include <iomanip> //for setw()
using namespace std;
class STU
{
 public:
  char snum[10]; //学号
  char sname[10]; //姓名
  char ssex[2]; //姓别
  long sage; //年龄
  char smajor[20]; //专业
 public:
  STU(){}
  ~STU(){}
};
int main()
{
 STU student;
 ::CoInitialize(NULL); // 初始化OLE/COM库环境 ,为访问ADO接口做准备
 _RecordsetPtr m_pRecordset("ADODB.Recordset");
 _ConnectionPtr m_pConnection("ADODB.Connection");
 _bstr_t bstrSQL("select * from stu_info"); //查询语句
 char * query_cmd = "DELETE FROM stu_info WHERE sname = '本拉登'";
 try
 {
  // 创建Connection对象
  m_pConnection.CreateInstance("ADODB.Connection");
  // 设置连接字符串,必须是BSTR型或者_bstr_t类型
  _bstr_t strConnect= "Provider=SQLOLEDB;Server=(local);Database=student; uid=sa; pwd=123;";
  //若数据库在网络上则Server为形如(192.168.1.5,3340)
  //用户sa和密码123只是针对我的库
  m_pConnection->Open(strConnect,"","",adModeUnknown);
  if(m_pConnection==NULL)
   cerr<<"Lind data ERROR!\n";
  // 创建记录集对象
  m_pRecordset.CreateInstance(__uuidof(Recordset));
  // 取得表中的记录
  m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),
  adOpenDynamic,adLockOptimistic,adCmdText);
  _variant_t vsnum,vsname,vsage,vssex,vsmajor; //对应库中的snum,sname,sage,ssex,smajor
  cout << "学号 姓名 年龄 姓别 专业";
  cout << "\n----------------------------------------------------------------\n";
  while (!m_pRecordset->EndOfFile)
  {
   vsnum = m_pRecordset->GetCollect(_variant_t((long)0));//这儿给字段编号和字段名都可以
   vsname = m_pRecordset->GetCollect("sname");
   vsage = m_pRecordset->GetCollect("sage");
   vssex = m_pRecordset->GetCollect("ssex");
   vsmajor = m_pRecordset->GetCollect("smajor");
   if (vsnum.vt != VT_NULL && vsname.vt != VT_NULL && vsage.vt != VT_NULL
&& vssex.vt != VT_NULL && vsmajor.vt != VT_NULL)
   {
    cout.setf(ios::left);
    cout << setw(14) << (char*)(_bstr_t)vsnum;
    cout << setw(14) << (char*)(_bstr_t)vsname;
    cout << setw(8) << vsage.lVal;
    cout << setw(8) << (char*)(_bstr_t)vssex;
    cout <<setw(20) << (char*)(_bstr_t)vsmajor;
    cout.unsetf(ios::left);
    cout << endl;
   }
   m_pRecordset->MoveNext(); ///移到下一条记录
  }
  cout << "\n----------------------------------------------------------------\n";
  cout << "\n请输入你要添加的学生信息\n";
  cout << "学号:";
  cin >> student.snum;
  cout << "\n姓名:";
  cin >> student.sname;
  cout << "\n年龄:";
  cin >> student.sage;
  cout << "\n姓别:";
  cin >> student.ssex;
  cout << "\n专业:";
  cin >> student.smajor;
  m_pRecordset->MoveFirst(); //移动到第一条记录
  m_pRecordset->AddNew(); ///添加新记录
  m_pRecordset->PutCollect("snum",_variant_t(student.snum));
  m_pRecordset->PutCollect("sname",_variant_t(student.sname));
  m_pRecordset->PutCollect("sage",_variant_t(student.sage));
  m_pRecordset->PutCollect("ssex",_variant_t(student.ssex));
  m_pRecordset->PutCollect("smajor",_variant_t(student.smajor));
  m_pRecordset->Update();
  m_pConnection->Execute(query_cmd,NULL,1); //用Execute执行sql语句来删除
  m_pRecordset->Close(); // 关闭记录集
 }
 // 捕捉异常
 catch(_com_error e)
 { 
  // 显示错误信息
  cerr << "\nERROR:" << (char*)e.Description();//抛出异常
 }
 if(m_pConnection->State)
  m_pConnection->Close();
 ::CoUninitialize();
 return 0;
}
iu_81 2007-02-01
  • 打赏
  • 举报
回复
利用ADO访问MS SQL2000
要求: 【1】输出stu_info表内的每一条记录
【2】添加一条新记录
【3】删除名字为"本拉登"的记录
*/
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
no_namespace rename("EOF", "EndOfFile")
#include <iostream>
#include <iomanip> //for setw()
using namespace std;
class STU
{
 public:
  char snum[10]; //学号
  char sname[10]; //姓名
  char ssex[2]; //姓别
  long sage; //年龄
  char smajor[20]; //专业
 public:
  STU(){}
  ~STU(){}
};
int main()
{
 STU student;
 ::CoInitialize(NULL); // 初始化OLE/COM库环境 ,为访问ADO接口做准备
 _RecordsetPtr m_pRecordset("ADODB.Recordset");
 _ConnectionPtr m_pConnection("ADODB.Connection");
 _bstr_t bstrSQL("select * from stu_info"); //查询语句
 char * query_cmd = "DELETE FROM stu_info WHERE sname = '本拉登'";
 try
 {
  // 创建Connection对象
  m_pConnection.CreateInstance("ADODB.Connection");
  // 设置连接字符串,必须是BSTR型或者_bstr_t类型
  _bstr_t strConnect= "Provider=SQLOLEDB;Server=(local);Database=student; uid=sa; pwd=123;";
  //若数据库在网络上则Server为形如(192.168.1.5,3340)
  //用户sa和密码123只是针对我的库
  m_pConnection->Open(strConnect,"","",adModeUnknown);
  if(m_pConnection==NULL)
   cerr<<"Lind data ERROR!\n";
  // 创建记录集对象
  m_pRecordset.CreateInstance(__uuidof(Recordset));
  // 取得表中的记录
  m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),
  adOpenDynamic,adLockOptimistic,adCmdText);
  _variant_t vsnum,vsname,vsage,vssex,vsmajor; //对应库中的snum,sname,sage,ssex,smajor
  cout << "学号 姓名 年龄 姓别 专业";
  cout << "\n----------------------------------------------------------------\n";
  while (!m_pRecordset->EndOfFile)
  {
   vsnum = m_pRecordset->GetCollect(_variant_t((long)0));//这儿给字段编号和字段名都可以
   vsname = m_pRecordset->GetCollect("sname");
   vsage = m_pRecordset->GetCollect("sage");
   vssex = m_pRecordset->GetCollect("ssex");
   vsmajor = m_pRecordset->GetCollect("smajor");
   if (vsnum.vt != VT_NULL && vsname.vt != VT_NULL && vsage.vt != VT_NULL
&& vssex.vt != VT_NULL && vsmajor.vt != VT_NULL)
   {
    cout.setf(ios::left);
    cout << setw(14) << (char*)(_bstr_t)vsnum;
    cout << setw(14) << (char*)(_bstr_t)vsname;
    cout << setw(8) << vsage.lVal;
    cout << setw(8) << (char*)(_bstr_t)vssex;
    cout <<setw(20) << (char*)(_bstr_t)vsmajor;
    cout.unsetf(ios::left);
    cout << endl;
   }
   m_pRecordset->MoveNext(); ///移到下一条记录
  }
  cout << "\n----------------------------------------------------------------\n";
  cout << "\n请输入你要添加的学生信息\n";
  cout << "学号:";
  cin >> student.snum;
  cout << "\n姓名:";
  cin >> student.sname;
  cout << "\n年龄:";
  cin >> student.sage;
  cout << "\n姓别:";
  cin >> student.ssex;
  cout << "\n专业:";
  cin >> student.smajor;
  m_pRecordset->MoveFirst(); //移动到第一条记录
  m_pRecordset->AddNew(); ///添加新记录
  m_pRecordset->PutCollect("snum",_variant_t(student.snum));
  m_pRecordset->PutCollect("sname",_variant_t(student.sname));
  m_pRecordset->PutCollect("sage",_variant_t(student.sage));
  m_pRecordset->PutCollect("ssex",_variant_t(student.ssex));
  m_pRecordset->PutCollect("smajor",_variant_t(student.smajor));
  m_pRecordset->Update();
  m_pConnection->Execute(query_cmd,NULL,1); //用Execute执行sql语句来删除
  m_pRecordset->Close(); // 关闭记录集
 }
 // 捕捉异常
 catch(_com_error e)
 { 
  // 显示错误信息
  cerr << "\nERROR:" << (char*)e.Description();//抛出异常
 }
 if(m_pConnection->State)
  m_pConnection->Close();
 ::CoUninitialize();
 return 0;
}
iu_81 2007-02-01
  • 打赏
  • 举报
回复
利用ADO访问MS SQL2000
要求: 【1】输出stu_info表内的每一条记录
【2】添加一条新记录
【3】删除名字为"本拉登"的记录
*/
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
no_namespace rename("EOF", "EndOfFile")
#include <iostream>
#include <iomanip> //for setw()
using namespace std;
class STU
{
 public:
  char snum[10]; //学号
  char sname[10]; //姓名
  char ssex[2]; //姓别
  long sage; //年龄
  char smajor[20]; //专业
 public:
  STU(){}
  ~STU(){}
};
int main()
{
 STU student;
 ::CoInitialize(NULL); // 初始化OLE/COM库环境 ,为访问ADO接口做准备
 _RecordsetPtr m_pRecordset("ADODB.Recordset");
 _ConnectionPtr m_pConnection("ADODB.Connection");
 _bstr_t bstrSQL("select * from stu_info"); //查询语句
 char * query_cmd = "DELETE FROM stu_info WHERE sname = '本拉登'";
 try
 {
  // 创建Connection对象
  m_pConnection.CreateInstance("ADODB.Connection");
  // 设置连接字符串,必须是BSTR型或者_bstr_t类型
  _bstr_t strConnect= "Provider=SQLOLEDB;Server=(local);Database=student; uid=sa; pwd=123;";
  //若数据库在网络上则Server为形如(192.168.1.5,3340)
  //用户sa和密码123只是针对我的库
  m_pConnection->Open(strConnect,"","",adModeUnknown);
  if(m_pConnection==NULL)
   cerr<<"Lind data ERROR!\n";
  // 创建记录集对象
  m_pRecordset.CreateInstance(__uuidof(Recordset));
  // 取得表中的记录
  m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),
  adOpenDynamic,adLockOptimistic,adCmdText);
  _variant_t vsnum,vsname,vsage,vssex,vsmajor; //对应库中的snum,sname,sage,ssex,smajor
  cout << "学号 姓名 年龄 姓别 专业";
  cout << "\n----------------------------------------------------------------\n";
  while (!m_pRecordset->EndOfFile)
  {
   vsnum = m_pRecordset->GetCollect(_variant_t((long)0));//这儿给字段编号和字段名都可以
   vsname = m_pRecordset->GetCollect("sname");
   vsage = m_pRecordset->GetCollect("sage");
   vssex = m_pRecordset->GetCollect("ssex");
   vsmajor = m_pRecordset->GetCollect("smajor");
   if (vsnum.vt != VT_NULL && vsname.vt != VT_NULL && vsage.vt != VT_NULL
&& vssex.vt != VT_NULL && vsmajor.vt != VT_NULL)
   {
    cout.setf(ios::left);
    cout << setw(14) << (char*)(_bstr_t)vsnum;
    cout << setw(14) << (char*)(_bstr_t)vsname;
    cout << setw(8) << vsage.lVal;
    cout << setw(8) << (char*)(_bstr_t)vssex;
    cout <<setw(20) << (char*)(_bstr_t)vsmajor;
    cout.unsetf(ios::left);
    cout << endl;
   }
   m_pRecordset->MoveNext(); ///移到下一条记录
  }
  cout << "\n----------------------------------------------------------------\n";
  cout << "\n请输入你要添加的学生信息\n";
  cout << "学号:";
  cin >> student.snum;
  cout << "\n姓名:";
  cin >> student.sname;
  cout << "\n年龄:";
  cin >> student.sage;
  cout << "\n姓别:";
  cin >> student.ssex;
  cout << "\n专业:";
  cin >> student.smajor;
  m_pRecordset->MoveFirst(); //移动到第一条记录
  m_pRecordset->AddNew(); ///添加新记录
  m_pRecordset->PutCollect("snum",_variant_t(student.snum));
  m_pRecordset->PutCollect("sname",_variant_t(student.sname));
  m_pRecordset->PutCollect("sage",_variant_t(student.sage));
  m_pRecordset->PutCollect("ssex",_variant_t(student.ssex));
  m_pRecordset->PutCollect("smajor",_variant_t(student.smajor));
  m_pRecordset->Update();
  m_pConnection->Execute(query_cmd,NULL,1); //用Execute执行sql语句来删除
  m_pRecordset->Close(); // 关闭记录集
 }
 // 捕捉异常
 catch(_com_error e)
 { 
  // 显示错误信息
  cerr << "\nERROR:" << (char*)e.Description();//抛出异常
 }
 if(m_pConnection->State)
  m_pConnection->Close();
 ::CoUninitialize();
 return 0;
}

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧