求助大牛!C++编程,如何查询数据库中多条记录的多个字段值,并且返回到一个数据块中...急急急!
利用sqlapi.h的头文件.这个是查询数据库的一条记录的一个字段的,怎样查询一条记录的多个字段或者多条记录的多条字段?急求啊啊啊!!等...SACommandcmd;/...
利用sqlapi.h的头文件.
这个是查询数据库的一条记录的一个字段的,怎样查询一条记录的多个字段或者多条记录的多条字段?急求啊啊啊 !!等...
SACommand cmd; // create command object
try
{
cmd.setConnection(&m_dbConnection);
cmd.setCommandText(szSQL);
cmd.Execute();
if(cmd.FetchNext())
{
if(!cmd.Field(1).isNull())
{
SAString strResult = cmd.Field(1).asString();
CVStringHelper::Safe_StrNCpy(szResult, strResult.GetBuffer(0), nLenthOfResult);
}
} 展开
这个是查询数据库的一条记录的一个字段的,怎样查询一条记录的多个字段或者多条记录的多条字段?急求啊啊啊 !!等...
SACommand cmd; // create command object
try
{
cmd.setConnection(&m_dbConnection);
cmd.setCommandText(szSQL);
cmd.Execute();
if(cmd.FetchNext())
{
if(!cmd.Field(1).isNull())
{
SAString strResult = cmd.Field(1).asString();
CVStringHelper::Safe_StrNCpy(szResult, strResult.GetBuffer(0), nLenthOfResult);
}
} 展开
4个回答
展开全部
额。。写个个简单的样列,用的是ODBC,比较直接。使用ADO的话虽然代码少,但是看起来不是很好理解。你可以自己去百度学学~
用到的函数都比较容易理解,我就没多加说明了,如果有不理解的复制函数名百度一下,会有详细的说明的。大概的流程就是这样了~
//包含头文件
#include "windows.h"
#include "sqlext.h"
#pragma comment(lib,"odbc32.lib")
int main(int argc, char* argv[]){
//1.连接数据源(前提是你已经配置好了数据源,我用的sqlserver数据库,怎么配数据源百度一下~很简单的)
//分配环境句柄, 保存一些驱动程序的信息
SQLHENV henv;//环境句柄
SQLRETURN sqlRet;
sqlRet = SQLAllocEnv(&henv);
if (sqlRet != SQL_SUCCESS && sqlRet != SQL_SUCCESS_WITH_INFO)
{
printf("分配环境句柄失败!\n");
return -1;
}
//分配连接句柄
SQLHDBC hdbc;//连接句柄
sqlRet = SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc);
if (sqlRet != SQL_SUCCESS && sqlRet != SQL_SUCCESS_WITH_INFO)
{
printf("分配连接句柄失败!\n");
return -1;
}
//连接数据源(test是数据库名字,sa 和sa 是用户们和密码,你替换即可)
sqlRet = SQLConnect(hdbc,(SQLCHAR*)"test",strlen("test"),(SQLCHAR*)"sa",2,(SQLCHAR*)"sa",2);
if (sqlRet != SQL_SUCCESS && sqlRet != SQL_SUCCESS_WITH_INFO)
{
printf("连接数据源失败!\n");
return -1;
}
//2.执行SQL语句
//准备语句句柄
SQLHSTMT hstmt;
sqlRet = SQLAllocHandle(SQL_HANDLE_STMT,hdbc,&hstmt);
if (sqlRet != SQL_SUCCESS && sqlRet != SQL_SUCCESS_WITH_INFO)
{
printf("连接语句句柄失败!\n");
return -1;
}
//设置游标类型(参看:http://blog.csdn.net/bichenggui/article/details/5601381)
sqlRet = SQLSetStmtOption(hstmt,SQL_ATTR_CURSOR_TYPE,SQL_CURSOR_KEYSET_DRIVEN);
if (sqlRet != SQL_SUCCESS && sqlRet != SQL_SUCCESS_WITH_INFO)
{
printf("设置光标类型失败!\n");
return -1;
}
//执行SQL语句
//直接执行(你替换成你自己的sqlserver语句即可)
sqlRet = SQLExecDirect(hstmt,(SQLCHAR*)"insert into student values('lsk',21)",SQL_NTS);
if (sqlRet != SQL_SUCCESS && sqlRet != SQL_SUCCESS_WITH_INFO)
{
printf("执行SQL语句失败!\n");
return -1;
}
//获取结果集
SQLCHAR value[20]={0};
SQLINTEGER len = 0;
//移动光标(不移动前光标指向结果集第一列的前面)
SQLFetch(hstmt);
//取值(取的是结果集的第一列的值),第二个参数表示取第几列
SQLGetData(hstmt,1,SQL_C_CHAR,value,20,&len);
printf("结果为:%s\n",value);
//假如结果集有多行则再次移动光标即可
SQLFetch(hstmt);
//然后再次取值
SQLGetData(hstmt,1,SQL_C_CHAR,value,20,&len);
//关闭句柄,释放资源
SQLFreeHandle(SQL_HANDLE_STMT, hstmt); //释放语句句柄
SQLDisconnect(hdbc); //断开连接
SQLFreeHandle(SQL_HANDLE_DBC, hdbc); //释放连接句柄
SQLFreeHandle(SQL_HANDLE_ENV, henv); //释放环境句柄
return 0;
}
用到的函数都比较容易理解,我就没多加说明了,如果有不理解的复制函数名百度一下,会有详细的说明的。大概的流程就是这样了~
//包含头文件
#include "windows.h"
#include "sqlext.h"
#pragma comment(lib,"odbc32.lib")
int main(int argc, char* argv[]){
//1.连接数据源(前提是你已经配置好了数据源,我用的sqlserver数据库,怎么配数据源百度一下~很简单的)
//分配环境句柄, 保存一些驱动程序的信息
SQLHENV henv;//环境句柄
SQLRETURN sqlRet;
sqlRet = SQLAllocEnv(&henv);
if (sqlRet != SQL_SUCCESS && sqlRet != SQL_SUCCESS_WITH_INFO)
{
printf("分配环境句柄失败!\n");
return -1;
}
//分配连接句柄
SQLHDBC hdbc;//连接句柄
sqlRet = SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc);
if (sqlRet != SQL_SUCCESS && sqlRet != SQL_SUCCESS_WITH_INFO)
{
printf("分配连接句柄失败!\n");
return -1;
}
//连接数据源(test是数据库名字,sa 和sa 是用户们和密码,你替换即可)
sqlRet = SQLConnect(hdbc,(SQLCHAR*)"test",strlen("test"),(SQLCHAR*)"sa",2,(SQLCHAR*)"sa",2);
if (sqlRet != SQL_SUCCESS && sqlRet != SQL_SUCCESS_WITH_INFO)
{
printf("连接数据源失败!\n");
return -1;
}
//2.执行SQL语句
//准备语句句柄
SQLHSTMT hstmt;
sqlRet = SQLAllocHandle(SQL_HANDLE_STMT,hdbc,&hstmt);
if (sqlRet != SQL_SUCCESS && sqlRet != SQL_SUCCESS_WITH_INFO)
{
printf("连接语句句柄失败!\n");
return -1;
}
//设置游标类型(参看:http://blog.csdn.net/bichenggui/article/details/5601381)
sqlRet = SQLSetStmtOption(hstmt,SQL_ATTR_CURSOR_TYPE,SQL_CURSOR_KEYSET_DRIVEN);
if (sqlRet != SQL_SUCCESS && sqlRet != SQL_SUCCESS_WITH_INFO)
{
printf("设置光标类型失败!\n");
return -1;
}
//执行SQL语句
//直接执行(你替换成你自己的sqlserver语句即可)
sqlRet = SQLExecDirect(hstmt,(SQLCHAR*)"insert into student values('lsk',21)",SQL_NTS);
if (sqlRet != SQL_SUCCESS && sqlRet != SQL_SUCCESS_WITH_INFO)
{
printf("执行SQL语句失败!\n");
return -1;
}
//获取结果集
SQLCHAR value[20]={0};
SQLINTEGER len = 0;
//移动光标(不移动前光标指向结果集第一列的前面)
SQLFetch(hstmt);
//取值(取的是结果集的第一列的值),第二个参数表示取第几列
SQLGetData(hstmt,1,SQL_C_CHAR,value,20,&len);
printf("结果为:%s\n",value);
//假如结果集有多行则再次移动光标即可
SQLFetch(hstmt);
//然后再次取值
SQLGetData(hstmt,1,SQL_C_CHAR,value,20,&len);
//关闭句柄,释放资源
SQLFreeHandle(SQL_HANDLE_STMT, hstmt); //释放语句句柄
SQLDisconnect(hdbc); //断开连接
SQLFreeHandle(SQL_HANDLE_DBC, hdbc); //释放连接句柄
SQLFreeHandle(SQL_HANDLE_ENV, henv); //释放环境句柄
return 0;
}
展开全部
你是说要将多个字段同时放到同一个数据块?
如果这样的话那你应该会定义一个结构体数组来存储这些数据,每条记录中的多个字段存到结构体数组的一个元素。
你可以看一下otl的用法,你这只是简单的从数据块select数据而已,就是读取一条记录存放到结构体,然后循环,因为你select出来的多个字段是一个数据流,你在解析这个数据流就能得到每个字段的值。最后就得到了一个存放你所需数据的结构体。
ps:简单点儿的话你也可以每次只select一个字段,多写几个就ok。比如:
for(要读取的条数)
{
select 字段1from table where ...
select字段2 from table where...
}
如果这样的话那你应该会定义一个结构体数组来存储这些数据,每条记录中的多个字段存到结构体数组的一个元素。
你可以看一下otl的用法,你这只是简单的从数据块select数据而已,就是读取一条记录存放到结构体,然后循环,因为你select出来的多个字段是一个数据流,你在解析这个数据流就能得到每个字段的值。最后就得到了一个存放你所需数据的结构体。
ps:简单点儿的话你也可以每次只select一个字段,多写几个就ok。比如:
for(要读取的条数)
{
select 字段1from table where ...
select字段2 from table where...
}
更多追问追答
追问
对,也会将多条记录的多个字段都放在一个数据块中,那我怎样定义这个结构体数组呢?就是说数据库字段数据类型不相同的话该怎么定义呢?数据库字段的个数又该怎样定义呢?问题比较多哈,谢谢你解答..
追答
比如你要读取5个字段,那你的结构体里面应该包含五个数据类型:
struct a{
int t1;
string t2
char* t3
double t4
double t5
}
数据类型我是随便写的,你根据数据库字段的类型定义就好了。
然后数组个数是你要读的记录的条数。这就定义好了这个结构体数组。
字段的个数你肯定事先就要知道,不然你怎么知道要读哪些字段了?
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
如果你只是想解决这个问题的话, 直接在数据库中就可以解决完后输出的,不需要输出后用C++代码来操作吧?
SQL功能强大的很
SQL功能强大的很
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
定义结构体,fetch了之后使用内存拷贝
追问
大哥,可以说的具体一点不?现在有思路就是不知道该怎么实施..
追答
你select的结果有哪些内容,你就定义相应的结构体。fetch一次得到一个数据块,包含你要的那些结果,你把结果拷贝到一个结构体中,然后就可以拿属性了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询