求助大牛!C++编程,如何查询数据库中多条记录的多个字段值,并且返回到一个数据块中...急急急!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求助大牛!C++编程,如何查询数据库中多条记录的多个字段值,并且返回到一个数据块中...急急急!相关的知识,希望对你有一定的参考价值。

利用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);


额。。写个个简单的样列,用的是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;
参考技术A 你是说要将多个字段同时放到同一个数据块?
如果这样的话那你应该会定义一个结构体数组来存储这些数据,每条记录中的多个字段存到结构体数组的一个元素。
你可以看一下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

数据类型我是随便写的,你根据数据库字段的类型定义就好了。
然后数组个数是你要读的记录的条数。这就定义好了这个结构体数组。
字段的个数你肯定事先就要知道,不然你怎么知道要读哪些字段了?

追问

谢谢,那我要是想把这些数据存放在一个32位有符号整形数据块或者放到double型数据块中的话该怎么做呢?

追答

你从数据块读出来的是N个数据类型的数据,你怎么能把它放到一个int或者double里面了?
放也是可以放,那就要看你的要求了,比如说你要把几个字段相加或者说转换成字符串再转换成数字。但这样做你从数据块读出来的字段还有什么意义了?因为你把n个字段放到int或者double数据类型肯定会造成数据丢失,除非你读出来的全是int或者double类型,然后转换成字符串把他们链接在一起,比如你t1=100;t2=200,那你可以存放成100200。这样等你用的时候再解析这个double存放的数据。
其实你可以把他们存放到一个string里面是很正常的,因为你从数据库读出来的每个字段(特殊字段比如blob这些除外)都可以转换成string类型,然后再把这些string串起来放到一个string里面。那你一条记录里面的这些字段就都存放到一个string了。
然后每条记录都读出来是一个string再把这些string串起来放到一个string。那最后这些数据就都放到一个string里面了。
你用int和double去存放是不现实而且完全没有意义的。

本回答被提问者和网友采纳
参考技术B 如果你只是想解决这个问题的话, 直接在数据库中就可以解决完后输出的,不需要输出后用C++代码来操作吧?

SQL功能强大的很
参考技术C 定义结构体,fetch了之后使用内存拷贝追问

大哥,可以说的具体一点不?现在有思路就是不知道该怎么实施..

追答

你select的结果有哪些内容,你就定义相应的结构体。fetch一次得到一个数据块,包含你要的那些结果,你把结果拷贝到一个结构体中,然后就可以拿属性了

JAVA中,向MYSQL插入多条数据,如何判断如果某记录已经存在就不插入

如题,是多条记录同时插入,在后台判断!如果是查询数据库再循环匹配的话效率太低。有没有更好一点的方法!

程序做。
1、先检索已经有的数据。(第一次查询数据库,找到所有已存在记录)
2、和要插入的数据做比较,找出新数据。
3、插入新数据。
不要每次检索是否存在,会死人的。
参考技术A 那么给你一个建议,使用ajax技术,在用户录入数据时就进行判断,然后再直接存入,这样就不用在存入时判断!!希望对你有用!!! 参考技术B if(!hasRecord()) //如果数据库中没有此数据
//执行插入
else
//不处理或者其他提示信息
参考技术C 直接插,根据返回码判断成功与否 参考技术D 触发器

以上是关于求助大牛!C++编程,如何查询数据库中多条记录的多个字段值,并且返回到一个数据块中...急急急!的主要内容,如果未能解决你的问题,请参考以下文章

求助:SQLSERVER多条查询语句合并

求助大神,数据库查询结果的去重除了distinct关键字,还有啥别的方法没?

如何编写在 Mysql 触发器中获取多条记录的选择查询?

oracle 如何返回多条记录

mybatis如何查询多条sql语句返回前台页面回显数据

oracle 查询每天写入的数据