九月鹰飞 发表于 2008-6-19 13:20

一列表框显示问题

void CNewBook::OnButtonCheckBooks()
{
// TODO: Add your control notification handler code here
UpdateData();

if(!m_db.IsOpen())
{
m_db.OpenEx("DSN=Library;UID=sa;PWD=1",0);
}

CBookSet * m_pset=new CBookSet(& m_db);
CString strSQL;
// strSQL.Format("select * from Book_Info where Book_ID='%d'",m_lBookID);
strSQL.Format("select * from Book_Info");
m_pset->Open(CRecordset::dynaset,strSQL);

if(m_pset->GetRecordCount()==0)
{
MessageBox("No this book in the database!","新书登记");
m_db.Close();
return;
}

//显示程序
m_ctrList.DeleteAllItems();
m_pset->MoveFirst();
char buf;
CDBVariant varValue;
int i=0;
CString strBookName;
while(!m_pset->IsEOF())
{
//int temp=0;
m_pset->GetFieldValue((short)0,varValue);
sprintf(buf,"%d",varValue.m_lVal);
m_ctrList.InsertItem(i,buf);

m_pset->GetFieldValue(1,strBookName);
m_ctrList.SetItemText(i,1,strBookName);
m_pset->GetFieldValue(2,strBookName);
m_ctrList.SetItemText(i,2,strBookName);
m_pset->GetFieldValue(3,strBookName);
m_ctrList.SetItemText(i,3,strBookName);
m_pset->GetFieldValue(4,strBookName);
m_ctrList.SetItemText(i,4,strBookName);
m_pset->GetFieldValue(5,varValue);
sprintf(buf,"%d-%d-%d %d:%d:%d",varValue.m_pdate->year,varValue.m_pdate->month,
       varValue.m_pdate->day,varValue.m_pdate->hour,varValue.m_pdate->minute,varValue.m_pdate->second);
m_ctrList.SetItemText(i,5,buf);
m_pset->GetFieldValue(6,varValue);
sprintf(buf,"%.2f",varValue.m_dblVal);
m_ctrList.SetItemText(i,6,buf);
m_pset->GetFieldValue(7,varValue);
sprintf(buf,"%d",varValue.m_iVal);
m_ctrList.SetItemText(i,7,buf);
m_pset->GetFieldValue(8,strBookName);
m_ctrList.SetItemText(i,8,strBookName);
m_pset->GetFieldValue(9,varValue);
sprintf(buf,"%d-%d-%d %d:%d:%d",varValue.m_pdate->year,varValue.m_pdate->month,
       varValue.m_pdate->day,varValue.m_pdate->hour,varValue.m_pdate->minute,varValue.m_pdate->second);
m_ctrList.SetItemText(i,9,buf);
m_pset->GetFieldValue(10,varValue);
sprintf(buf,"%d",varValue.m_lVal);
m_ctrList.SetItemText(i,10,buf);
m_pset->GetFieldValue(11,varValue);
sprintf(buf,"%d",varValue.m_lVal);
m_ctrList.SetItemText(i,11,buf);
i++;
m_pset->MoveNext();
}
m_pset->Close();
m_db.Close();
UpdateData(FALSE);

九月鹰飞 发表于 2008-6-19 13:24

现在问题是说索引无效,已知数据库中的建立的列的顺序为:
CREATE TABLE BOOK_Info(
Book_ID INT PRIMARY KEY,
Book_Name VARCHAR(40) NOT NULL,
Type VARCHAR(10) NULL,
Writer VARCHAR(20) NOT NULL,
Press VARCHAR(20) NOT NULL,
Press_Date Smalldatetime NOT NULL,
Price FLOAT NOT NULL,
Page int NULL,
Keyword VARCHAR(20) NULL,
Register_Date Smalldatetime NOT NULL,
Total_Amount INT NOT NULL,
Now_Amount INT NOT NULL
);

各位大哥救命呀!

皇家救星 发表于 2008-6-19 13:28

不要用*

勤快点,把所有段名都写上去,然后照着顺序读出来就行了

皇家救星 发表于 2008-6-19 13:30

至于为什么

我也不知道

哪们高手知道请告诉一下: )

hjack 发表于 2008-6-19 13:41

怀疑是你数据库连接的问题。

hjack 发表于 2008-6-19 13:44

是在那行调用时报错的呢?调试一下

hongbobo 发表于 2008-6-19 17:20

你读取数据库字段时,要严格按照这个规则:

1、先读取前一条记录的所有字段,再获取下一条记录的所有字段。
2、每一条记录的读取顺序也要和数据库上的字段一直
(如数据库上的顺序 姓名->年龄->学好,那么你用GetFiledValue时也要按这个顺序读取)

俺之前也遇到过这问题,按照上面的规则就不会错了。
至于为什么,好像适合你的数据库连接技术有关系,我用
ODBC技术就出现这问题,后来改用ADO问题又没了。

九月鹰飞 发表于 2008-6-19 21:05

搞不出问题在那,只知道读到第二个后就读不下去了.
如3楼所说那样虽然慢慢读,但起码不会错.

iptton 发表于 2008-6-19 21:20

试试用断点来DEBUG,找出具体哪句出错

九月鹰飞 发表于 2008-6-19 21:41

知道在调试到下面时
m_pset->GetFieldValue(1,strBookName);
m_ctrList.SetItemText(i,1,strBookName);
出错.
顺序应该没问题,调试到里面有些地方搞不明白了,我也找不到出来哪里有问题.只能是一个一个来.

iptton 发表于 2008-6-29 18:50

DEBUG下可以看各变量值的...
页: [1]
查看完整版本: 一列表框显示问题