高分求救:关于sqlite3的语句sqlite3_exec(db, "SELECT single_data.* FROM single_data;", print_result, NULL, &errMsg);

scsnsjsl_cs_dn 2009-01-04 03:18:39
1.sqlite3_exec(db, "SELECT single_data.* FROM single_data;", CallResult, NULL, &errMsg);
print_result函数是如何执行的?是每读取一行执行一次吗?
2.做了一个MFC读数据库界面,主要代码如下
//CallResult为回调函数,声明为类CVisualTabInterfaceDlg的友员函数,m_ListCtrl为类的静态成员变量,且被关联到CListCtrl控件
int CallResult(void *data, int n_columns,char **column_values, char **column_names)
{
if(CVisualTabInterfaceDlg::IsShouItemName)
{
CString strInit(*(column_names));
int nItem=CVisualTabInterfaceDlg::m_ListCtrl.InsertItem(0,strInit);
for (int i=1; i <n_columns; i++)
{
CString str(*(column_names+i));
CVisualTabInterfaceDlg::m_ListCtrl.SetItemText(nItem,i,str);
}
CVisualTabInterfaceDlg::IsShouItemName=false;
}
else
{
for (int i=0; i <n_columns; i++)
{
CString strInit(*(column_values));
int nItem=CVisualTabInterfaceDlg::m_ListCtrl.InsertItem(0,strInit);
for (int i=1; i <n_columns; i++)
{
CString str(*(column_values+i));
CVisualTabInterfaceDlg::m_ListCtrl.SetItemText(nItem,i,str);
}
}
}

return 0;
}
void CVisualTabInterfaceDlg::OnBnClickedBtnSelect()
{
......
char sqliteSentence[200];
char *errMsg;
sprintf_s(sqliteSentence,"select single_data.* from %s","single_data");
rc=sqlite3_exec(db,sqliteSentence,NULL,NULL,NULL);
if(rc)
{
CString str;
str.Format(_T("%s"),sqlite3_errmsg(db));
AfxMessageBox(str);
}

sqlite3_exec(db,sqliteSentence,CallResult, NULL, &errMsg);
......
}

选择要显示的数据表结构如下:
ID NAME MONEY POWER
1001 TOM 200 2000
1002 BILL 300 2600

但显示在列表控件里的只有ID=1002的内容,切重复显示为:
第一列 第二列 第三列 第四列
1002 BILL 300 2600
1002 BILL 300 2600
1002 BILL 300 2600
1002 BILL 300 2600
ID NAME MONEY POWER
请问为什么ID=1002的显示的4行,而1001没有显示.

如果在CallResult()的最外层加上for(int i=0;i <3;i++)时,则ID=1001 和ID =1002均显示多行?

请问这是怎么回事?多谢了
...全文
707 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
angelgy880505 2011-10-29
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 scsnsjsl_cs_dn 的回复:]
引用 3 楼 oyljerry 的回复:
引用 2 楼 scsnsjsl_cs_dn 的回复:
引用 1 楼 oyljerry 的回复:
1.每读一行,执行一次callback

可是为什么显示里边有问题呢?


你怎么有两个for循环,一个就可以了,每次取出当前行的一列的数据
谢谢,问题解决了.
[/Quote]

楼主不厚道啊,这么多人帮你出谋划策,最后问题解决了,是否应该告诉大家问题是如何解决的呀!
scsnsjsl_cs_dn 2009-01-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 oyljerry 的回复:]
引用 2 楼 scsnsjsl_cs_dn 的回复:
引用 1 楼 oyljerry 的回复:
1.每读一行,执行一次callback

可是为什么显示里边有问题呢?


你怎么有两个for循环,一个就可以了,每次取出当前行的一列的数据
[/Quote]谢谢,问题解决了.
scsnsjsl_cs_dn 2009-01-04
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 fandh 的回复:]
是不是每次要清空m_ListCtrl?
[/Quote]你指的是什么时候清空?
fandh 2009-01-04
  • 打赏
  • 举报
回复
是不是每次要清空m_ListCtrl?
scsnsjsl_cs_dn 2009-01-04
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 fandh 的回复:]
建议你在CallResult 里面设置断点,然后跟踪调试一下,看看到底是那儿在不停的添加!
我也看的很模糊,只是推测!不过,基本上可以说就是这个函数里面处理的问题!
[/Quote]应该是函数处理中的问题,我用下边代码替换CallResult里边的内容,就能在消息框里正确显示数据内容,可是始终找不到究竟问题出现在什么地方
[code=C/C++][/static CString str;
for(int i=0; i<n_columns; i++)
{
CString strTemp(* (column_values+i));
str+=strTemp;
}

AfxMessageBox(str);]
fandh 2009-01-04
  • 打赏
  • 举报
回复
建议你在CallResult 里面设置断点,然后跟踪调试一下,看看到底是那儿在不停的添加!
我也看的很模糊,只是推测!不过,基本上可以说就是这个函数里面处理的问题!
scsnsjsl_cs_dn 2009-01-04
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 fandh 的回复:]
CallResult 里面,每次都是重头添加,所以,以前添加的也被再次添加!
将添加的那一块改一下!
[/Quote]能说清楚点吗?谢谢了
fandh 2009-01-04
  • 打赏
  • 举报
回复
CallResult 里面,每次都是重头添加,所以,以前添加的也被再次添加!
将添加的那一块改一下!
scsnsjsl_cs_dn 2009-01-04
  • 打赏
  • 举报
回复
补充下:我的查询是一个通过按钮的响应函数执行.
第一次点按钮是能显示ID为1002的,之后再点按钮,就能ID1001和1002的,但没个都是重复4次.

现在有2点疑问:
1.为什么同一行会显示4次.

2.是否是因为回调函数跟主线程不是一个线程,当准备执行插入ID=1001时的记录时,时间片到了执行主线程的时刻;当时间片再转移到回调函数所在线程里时,ID=1001的记录已经被ID=1002的记录给覆盖了,所以只显示ID=1002的记录而不显示ID=1001的记录?
请朋友们指点.
scsnsjsl_cs_dn 2009-01-04
  • 打赏
  • 举报
回复
2个for循环是因为首先要显示表的字段,另外一个佛循环显示表中数据.
oyljerry 2009-01-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 scsnsjsl_cs_dn 的回复:]
引用 1 楼 oyljerry 的回复:
1.每读一行,执行一次callback

可是为什么显示里边有问题呢?

[/Quote]
你怎么有两个for循环,一个就可以了,每次取出当前行的一列的数据
scsnsjsl_cs_dn 2009-01-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 oyljerry 的回复:]
1.每读一行,执行一次callback
[/Quote]
可是为什么显示里边有问题呢?
oyljerry 2009-01-04
  • 打赏
  • 举报
回复
1.每读一行,执行一次callback

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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