c++与sqlserver数据库怎样连接

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++与sqlserver数据库怎样连接相关的知识,希望对你有一定的参考价值。

最好给一个小程序啊,谢谢啊

HRESULThr=sqlSp.CreateInstance(_uuidof(Connection));

if(FAILED(hr))

AfxMessageBox("_ConnectionPtr对象指针实例化失败!!!");

return;

else

try

_bstr_tstrConnect="Driver=sqlserver;server=192.168.1.29;uid=sa;pwd=ebank@123;database=baoshang;";

sqlSp->Open(strConnect,"","",adModeUnknown);

catch(_com_error&e)

AfxMessageBox(e.Description());

return;

_RecordsetPtrm_pRecordset;

if(FAILED(m_pRecordset.CreateInstance(_uuidof(Recordset))))

AfxMessageBox("记录集对象指针实例化失败!");

return;

try

m_pRecordset->Open("select*fromdbo.TB_DICT_CONTTYPE",(IDispatch*)sqlSp,adOpenDynamic,adLockOptimistic,adCmdText);

catch(_com_error&e)

AfxMessageBox(e.Description());

return;

try

m_pRecordset->MoveFirst();

while(!m_pRecordset->adoEOF)

CStringinsertTime=(char*)(_bstr_t)(m_pRecordset->Fields->GetItem(_variant_t("F_TYPE_ID"))->Value);

AfxMessageBox(insertTime);

m_pRecordset->MoveNext();

catch(_com_error&e)

AfxMessageBox(e.Description());

return;

扩展资料

连接数据库三支路

1、导入数据库命名空间:

usingSystem.Data.SqlClient;

2、创建数据库连接对象,并指定数据库连接字符串:

//创建数据库连接对象:SqlConnectionconn=newSqlConnection(str);

//数据库连接字符串:Stringstr="DataSource=.;InitialCatalog=test;IntegratedSecurity=True";

3、打开与数据库的连接:

Open.conn();

4、创建操作命令对象Command,并指定操作数据源以及操作命令:

//创建操作命令对象:SqlCommandcmd=newSqlCommand();

//操作数据源:cmd.Connection=conn;

//操作命令:cmd.CommandText="selectcount(*)fromuser_tablewhereuserName='"+uName+"'anduserPwd='"+uPwd+"'";

参考技术A C++使用MFC库,主要有两种方法可以连接sql数据库
1.利用ADO连接:
#import "msado15.dll" no_namespace rename("EOF", "EndOfFile")
//必须import这个dll,这个文件通常放在C:\Program Files\Common Files\System\ado路径下.
_ConnectionPtr m_ptrConnection; //数据库连接对象
构造函数中添加如下语句
m_ptrConnection = NULL;
::CoInitialize(NULL);
//连接数据库的主要代码
BOOL DataVisitor::ConnectDataBase(_bstr_t connectionStr)

/*
Added by stone. If IDOConnection has not been set up,then create one.
*/
if(m_ptrConnection == NULL)

HRESULT hr = m_ptrConnection.CreateInstance(__uuidof(Connection));
if (FAILED(hr))

return FALSE;

else

_bstr_t strConnect = connectionStr;
//"Provider=SQLOLEDB;Server=(local);Database=navigation; uid=sa; pwd=3277625;";

m_ptrConnection->CursorLocation = adUseClient;
m_ptrConnection->IsolationLevel = adXactReadCommitted;
try

m_ptrConnection->Open(strConnect,"","",adModeUnknown);
return TRUE;

catch (_com_error e)

// AfxMessageBox((char *)e.Description());
return FALSE;




return TRUE;


2. 利用ODBC连接
#include <afxdao.h>
CDaoDatabase *MyDataBase;

BOOL MyDB_OperSqL::Open_MyDatabase(CString connstr)

try

if (MyDataBase == NULL)

MyDataBase = new CDaoDatabase();

MyDataBase->Open(NULL,0,0,connstr);


catch( CDaoException* e )

CString message = _T("MyDB_OperSqL 数据库异常: ");
message += e->m_pErrorInfo->m_strDescription;
char info[400];
sprintf(info,message);
DispErrorMessage(info,__LINE__);
e->Delete( );
return FALSE;

catch (CMemoryException *e)

DispErrorMessage("MyDB_OperSqL 内存异常!",__LINE__);
e->Delete( );
return FALSE;

catch(...)

DispErrorMessage("MyDB_OperSqL 其它异常!",__LINE__);
return FALSE;

return TRUE;

这里的连接字符串connstr一般是如下内容
"ODBC;DRIVER=SQL Server;SERVER=(local);DATABASE=yourDataBase;UID=yourID;PWD=yourPassword"
参考技术B C++连接SQL数据库第一步 系统配置
1.设置SQLSERVER服务器为SQL登录方式,并且系统安全性中的sa用户要设置登录功能为“启用”,还有必须要有密码。
2.需要在ODBC中进行数据源配置,数据源选\”SQL SERVER”,登录方式使用“使用输入用户登录ID和密码的SQL SERVER验证”,并填写登录名(sa)和密码,注意一点,密码不能为空,这就意味着你的sa用户必须得有密码。否则无法通过系统本身的安全策略。测试通过就完成了配置。
C++连接SQL数据库第二步 C++与SQL连接初始化
1.在你所建立的C++项目中的stdafx.h头文件中引入ADO
具体代码如下
#import “c:\Program Files\Common Files\System\ado\msado15.dll”
no_namespace rename(”EOF”, “adoEOF”) rename(”BOF”, “adoBOF”)
2.定义_ConnectionPtr变量后调用Connection对象的Open方法建立与服务器的连接。
数据类型_ConnectionPtr实际上是由类模板_com_ptr_t得到的一个具体的实例类。_ConnectionPtr类封装了Connection对象的Idispatch接口指针及其一些必要的操作。可以通过这个指针操纵Connection对象。
例如连接SQLServer数据库,代码如下:
//连接到MS SQL Server
//初始化指针
_ConnectionPtr pMyConnect = NULL;
HRESULT hr = pMyConnect.CreateInstance(__uuidof(Connection));
if (FAILED(hr))
return;
//初始化链接参数
_bstr_t strConnect = “Provider=SQLOLEDB;
Server=hch;
Database=mytest;
uid=sa; pwd=sa;”; //Database指你系统中的数据库
//执行连接
try

// Open方法连接字串必须四BSTR或者_bstr_t类型
pMyConnect->Open(strConnect, “”, “”, NULL);

catch(_com_error &e)

MessageBox(e.Description(), “警告”, MB_OK|MB_ICONINFORMATION);
//发生链接错误

C++连接SQL数据库第三步 简单的数据连接
//定义_RecordsetPtr变量,调用它Recordset对象的Open,即可打开一个数据集
//初始化过程 以下是个实例
_RecordsetPtr pRecordset;
if (FAILED(pRecordset.CreateInstance(__uuidof(Recordset))))

return;

//执行操作
try

pRecordset->Open(_variant_t(”userinfo”),
_variant_t((IDispatch*)pMyConnect),
adOpenKeyset, adLockOptimistic, adCmdTable);

catch (_com_error &e)

MessageBox(”无法打开userinfo表\”, “系统提示”,
MB_OK|MB_ICONINFORMATION);


C++连接SQL数据库第四步 执行SQL语句
这里是关键,我认为只要你懂点SQL语句那么一切都会方便许多比用上面的方法简单,更有效率点。
首先
m_pConnection.CreateInstance(_uuidof(Connection));
//初始化Connection指针
m_pRecordset.CreateInstance(__uuidof(Recordset));
//初始化Recordset指针
CString strSql=”select * from tb_goods”;//具体执行的SQL语句
m_pRecordset=m_pConnection->Execute(_bstr_t(strSql),
NULL, adCmdText);//将查询数据导入m_pRecordset数据容器
至此 你的SQL语句已经执行完成了m_pRecordset内的数据就是你执行的结果。
取得记录:
while(!m_pRecordset->adoEOF)//遍历并读取name列的记录并输出

CString temp = (TCHAR *)(_bstr_t)m_pRecordset->GetFields()->GetItem
(”name”)->Value;
AfxMessageBox(temp);
pRecordset->MoveNext();


插入记录
//记得初始化指针再执行以下操作
CString strsql;
strsql.Format(”insert into tb_goods(no,name, price)
values(’%d’,'%s’, %d)”,m_intNo,m_strName,m_intPrice);
m_pRecordset=m_pConnection->
Execute(_bstr_t(strsql),NULL,adCmdText);

修改记录
CString strsql;
strsql.Format(”update tb_goods set name=’%s’ ,
price=%d where no=%d “,m_strName,m_intPrice,m_intNo);
m_pRecordset=m_pConnection->Execute(_bstr_t(strsql),NULL,adCmdText);

删除记录
CString strsql;
strsql.Format(”delete from tb_goodswhere no= ‘%d’ “,m_intNo);
m_pRecordset=m_pConnection->Execute(_bstr_t(strsql),NULL,adCmdText)

java连接sqlserver,提示语法错误

报错信息:java.sql.SQLException: com.microsoft.sqlserver.jdbc.SQLServerException: 关键字 'WHERE' 附近有语法错误。 Query: select * from (select src.*, row_number() over (order by src.id asc) rownum from (select id, parentid, name, enable from configcity where 1 = 1 ) src) row_ where row_.rownum < ? Parameters: [15]
这条语句在数据库中直接执行没有任何问题(把?换成15),但是在程序里执行的时候就报这个错,原来一直使用mysql,这次因为项目原因,要求使用sqlserver,原来没怎么接触过sqlserver,不知道这是什么原因,请各位大侠帮帮忙,急~~~!
最后的查询语句:this.list = run.query(querySql, new BeanListHandler<T>(clazz, DbOperator.BEAN_ROW_PROCESSOR), params);,this.list是个对象列表,断点调试的时候在执行查询之前查看querySql的值:select * from (select src.*, row_number() over (order by src.id asc) rownum from (select id, parentid, name, enable from configcity where 1 = 1 ) src) row_ where row_.rownum < ?,params的值:[15],一切都没有问题,但是只要一执行就报错

SQL Server端运行的语句是如下吧:
select * from (select src.*, row_number() over (order by src.id asc) rownum from (select id, parentid, name, enable from configcity where 1 = 1 ) src) row_ where row_.rownum < 15

这个语句是没错的。
你的调试下程序,看传递到后台语句是不是对的。
where row_.rownum < 15,这个是有个参数传递的,传递的结果可能不对。
具体要看你程序怎么写。
一般是where子句根据条件判断生成后,再与主SQL语句合并。这个过程中,有逻辑漏洞的话,where子句会生是一个“ where ” 之类
这样程序运行的SQL,实际上就会是如下:
select * from (select src.*, row_number() over (order by src.id asc) rownum from (select id, parentid, name, enable from configcity where 1 = 1 ) src) row_ where

这样就会出错。
这个问题,估计不是SQL语句的错,是程序生成SQL或传递SQL时的错。不要查语句问题了,查程序的SQL语句生成或传递的部分吧。
你还是把程序最后生成的SQL,输出后检查下吧。形如? Parameters: [15]之类的,最后生成的SQL绝不会有这些的。追问

我在程序中是一步一步进行断点调试的,到最后一步查询的时候sql语句就是上面那条语句,参数是个数组Parameters: [15],之前所有的都没问题,就最后执行的时候报错,报错信息就是之前发的那个
另外,之前用mysql就没问题,当然用mysql查询语句就不是这样了,最后只有“limit ?”

追答

你所说的这些还不是最后一步呢。
你这只是把sql语句、参数传递完成。最后执行的sql语句是什么,你还没看到呢。
run.query()的返回就是已经执行完的结果么?那这样的话,中间还封装了有生成sql语句的过程。

你是用org.apache.commons.dbutils吧?我没用过,你看下封装的对象有没有提供输出sql语句的方法:
1、有的话,输出sql,然后检查下输出的语句,也即是最后在数据库端执行的那个sql,肯定是有问题的;
这时候,可以看下sql出问题的地方,是程序哪个地方生成的,那个地方的代码应该是有问题的;
2、没有办法获得输出的sql语句的话,只有笨办法:试:

先替换参数,不用参数的话,看下正常不。
2.1异常,则语句确实有问题,或者这个封装对象有问题;
语句问题的话,可能是有异常字符,比如全角空格、字符之类,逐段替换测试吧;
封装对象问题的话,更新个对象版本吧。
2.2正常,则参数有问题,或者封装的这个对象处理参数的功能有问题;
确认下参数没有问题,没有异常字符的话,更新个封装对象的版本吧。

参考技术A 有两种可能:
第一、你写的字段和你数据库实际的数量不对。
第二、user是sql server中的关键字要使用[user]这样追问

第一,字段没有问题,把这条语句放在数据库中可以正常执行;
第二,我这里没有user啊???

参考技术B 只给错误不给代码不知道追问

数据库查询使用的是org.apache.commons.dbutils.QueryRunner.query,程序中最后执行的语句是:this.list = run.query(querySql, new BeanListHandler(clazz, DbOperator.BEAN_ROW_PROCESSOR), params);

参考技术C 参数怎么设的?
cstmt.setInt(1, 15); 这样吗?追问

用的c3p0连接池和org.apache.commons.dbutils,最后执行的语句:this.list = run.query(querySql, new BeanListHandler(clazz, DbOperator.BEAN_ROW_PROCESSOR), params);

追答

因为看不到具体写的过程,这个还真的很难说。
where 1 = 1 这个去掉呢?

以上是关于c++与sqlserver数据库怎样连接的主要内容,如果未能解决你的问题,请参考以下文章

java与oracle要怎样连接?

怎样访问公网上的sqlserver

C++ 命名管道 与Winform跨进程通信

vscode的c++如何使用数据库?

C++控制台程序使用ODBC连接SQLServer

java连接sqlserver,提示语法错误