MFC高手看过来,^_^

flyingiug 2003-02-14 05:39:06
第一个是关于ExecuteSQL,第二个是关于查询的,第三个是关于如何将CListCtrl里面的内容生产Excel报表
先看第一个:
msdn上面给出了用法,
CString strCmd = "UPDATE Taxes SET Federal = 36%";

TRY
{
m_dbCust.ExecuteSQL( strCmd );
}

CATCH(CDBException, e)
{
// The error code is in e->m_nRetCode
}
可是,为什么我用的时候老是提示我From附近有错误呢?我的用法如下:

void CClassroomqueryDlg::GetClassroomInf()
{

CClassRoomSet m_pCRSet(&m_database); //CClassRoomSet是教室表的设置
CQueryclassroomSet m_pQCRSet(&m_database); //CQueryclassroomSet是查询教室表的设置
CTotalTableSet m_pTTSet(&m_database); //CTotalTableSet是总表的设置
if (!m_database.IsOpen())
{
m_database.Open(_T("stct"));
}
CString strCmd1 = "INSERT INTO QUERYCLASSROOM (room_id, cweek, ctime)
SELECT course_place, cweek, ctime
FROM TOTALTABLE

CString strCmd2 = "INSERT INTO QUERYCLASSROOM (room_id)
SELECT room_id FROM CLASSROOMS
WHERE (room_id NOT IN
(SELECT DISTINCT course_place FROM TOTALTABLE))";
TRY
{
m_database.ExecuteSQL( strCmd1 );
m_database.ExecuteSQL( strCmd2 );
}

CATCH(CDBException, e)
{
// The error code is in e->m_nRetCode
}

END_CATCH

求教高手!!
第二个问题如下:
void CTeacherCourseDlg::OnQuery1()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
p_query.Format("select * from TOTALTABLE where teacher_id = '%s'", m_teacherid);
RefreshData();

}
void CTeacherCourseDlg::RefreshData()
{
m_teachercourse.DeleteAllItems();
CTotalTableSet m_pTTSet(&m_database);
m_pTTSet.Open(AFX_DB_USE_DEFAULT_TYPE,p_query);
CDBVariant varValue;
if(m_pTTSet.GetRecordCount()!=0) m_pTTSet.MoveFirst();
char buf[40];
int i=0;
while(!m_pTTSet.IsEOF())
{
//if(m_pTTSet.m_class_name == ClassName)

int temp=0;
m_pTTSet.GetFieldValue(temp,varValue);
sprintf(buf,"%d",varValue.m_iVal);
m_teachercourse.InsertItem(i,buf);

m_pTTSet.GetFieldValue(1,varValue);
m_teachercourse.SetItemText(i,1,varValue.m_pstring->GetBuffer(1));

m_pTTSet.GetFieldValue(2, varValue);
m_teachercourse.SetItemText(i, 2, varValue.m_pstring->GetBuffer(1));

m_pTTSet.GetFieldValue(3,varValue);
m_teachercourse.SetItemText(i,3,varValue.m_pstring->GetBuffer(1));

m_pTTSet.GetFieldValue(4,varValue);
m_teachercourse.SetItemText(i,4,varValue.m_pstring->GetBuffer(1));

m_pTTSet.GetFieldValue(5,varValue);
m_teachercourse.SetItemText(i,5,varValue.m_pstring->GetBuffer(1));

m_pTTSet.GetFieldValue(6,varValue);
m_teachercourse.SetItemText(i,6,varValue.m_pstring->GetBuffer(1));


m_pTTSet.GetFieldValue(7,varValue);
m_teachercourse.SetItemText(i,7,varValue.m_pstring->GetBuffer(1));

m_pTTSet.GetFieldValue(8,varValue);
sprintf(buf,"%f",varValue.m_fltVal);
m_teachercourse.SetItemText(i,8,buf);

m_pTTSet.GetFieldValue(9, varValue);
m_teachercourse.SetItemText(i, 9, varValue.m_pstring->GetBuffer(1));

i++;
m_pTTSet.MoveNext();

}


}
这是一个查询的部分查询,问题是,当输入相匹配的记录后,能够得到正确的结果,但是输入不匹配的记录后,显然,什么信息

都没有,为了能够得到"此记录不存在"类似的提示,我改怎么办?

第三个是关于如何根据CListCtrl里面的内容生成相应的Excel报表?

^_^,三个问题,谁解决了,高分相赠!
...全文
54 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
flyingiug 2003-02-14
  • 打赏
  • 举报
回复
up 了,原来第一个本来就不是问题,^_^,自己的程序的后面部分错了,不是这里的原因!! 呵呵
第二个问题感谢Aizz(Nova)了!
JacksonFox 2003-02-14
  • 打赏
  • 举报
回复
我回答第一个。
CString strCmd1 = "INSERT INTO QUERYCLASSROOM (room_id, cweek, ctime)
SELECT course_place, cweek, ctime
FROM TOTALTABLE
应该改成:
CString strCmd1 = "INSERT INTO QUERYCLASSROOM (room_id, cweek, ctime)
//这里多个FROM
FROM ( SELECT course_place, cweek, ctime
FROM TOTALTABLE )
Aizz 2003-02-14
  • 打赏
  • 举报
回复
2、if (m_pTTSet.IsBOF())
{
AfxMessageBox(_T("记录不存在!"));
}
else
{
while (!m_pTTSet.IsEOF())
{
...
}
}
qsbqing 2003-02-14
  • 打赏
  • 举报
回复
原来每个男孩都不简单----
flyingiug 2003-02-14
  • 打赏
  • 举报
回复
第2个和第3个都已经成功实现了,就差第一个了,痛苦ing..............



谢谢各位大虾,谁能帮我看看第1个问题拉...
flyingiug 2003-02-14
  • 打赏
  • 举报
回复
第一个问题呢? 现在都没有解决掉?
up了不是可惜? ^_^
DoubleJiang 2003-02-14
  • 打赏
  • 举报
回复
up
Aizz 2003-02-14
  • 打赏
  • 举报
回复
(不是我厉害,而是这个问题太基础了,不然我也不会吐血...)

第三个问题可以用“excel”搜索一下,很多相关的帖子。
flyingiug 2003-02-14
  • 打赏
  • 举报
回复
Aizz(Nova)真是厉害呀,输入没有的teacher_id,while循环不会执行,我懂了,谢谢!!!
flyingiug 2003-02-14
  • 打赏
  • 举报
回复
第一个问题莫非是ExecuteSQL()不能使用嵌入式sql? 我差了一些资料,上面使用的都是基本的Sql语句!
Aizz 2003-02-14
  • 打赏
  • 举报
回复
我吐血...

m_pTTSet为空就表示没找到符合条件的记录。
楼主可以试试输入一个没有的teacher_id,看看会不会执行while里面的东西。
flyingiug 2003-02-14
  • 打赏
  • 举报
回复
第三个问题怎么无人问津呀!! 我参考了徐景周的相关代码,如下

sSql = "CREATE TABLE demo (Name TEXT,Age NUMBER)";
database.ExecuteSQL(sSql);
// 插入数值
sSql = "INSERT INTO demo (Name,Age) VALUES (''徐景周'',26)";
database.ExecuteSQL(sSql);

sSql = "INSERT INTO demo (Name,Age) VALUES (''徐志慧'',22)";
database.ExecuteSQL(sSql);

sSql = "INSERT INTO demo (Name,Age) VALUES (''郭徽'',27)";
database.ExecuteSQL(sSql)

可是,我是根据第二问里面的listctr里面的内容生成报表,那么
"CREATE TABLE demo (Name TEXT,Age NUMBER)";
里面的数据类型是用Excel的还是其他的,比如在Sql中的VARchar怎么转变成execel里面的数据类型!
请教高手!---如何根据CListCtrl里面的内容生成相应的Excel报表!!
flyingiug 2003-02-14
  • 打赏
  • 举报
回复
重新描述一下第二个问题:
void CTeacherCourseDlg::OnQuery2()
{
p_query.Format("select * from TOTALTABLE where teacher_name = '%s'", m_teachername);//m_teachername就是文本框的内容
RefreshData(); //上面有定义
}

这样子写的话,如果文本框里面的值在表TOTALTABLE里面有,则能给出正确的答案,问题是,如果文本框里面的值在表TOTALTABLE里面没有,则什么信息都没有,我的问题就是,如何在保证我还是使用 p_query.Format("select * from TOTALTABLE where teacher_name = '%s'", m_teachername);的条件下实现找到后显示结果在Listctr里面,找不到就显示信息. 大虾如果有更好的解决方案的话,(时间复杂度),不用 p_query.Format("select * from TOTALTABLE where teacher_name = '%s'", m_teachername);也可以!
Aizz 2003-02-14
  • 打赏
  • 举报
回复
吐血,都说的这么清楚了,楼主不会是让我写代码吧?
flyingiug 2003-02-14
  • 打赏
  • 举报
回复
Aizz(Nova) 说对了,思路就是这样!就差实现了,^_^
flyingiug 2003-02-14
  • 打赏
  • 举报
回复
to jszj,I am sorry
在关键字 "select"附近有语法错误,第一行 ')'附近有语法错误!
red-fly 2003-02-14
  • 打赏
  • 举报
回复
m_pTTset.m_RecordCount和m_pTTset.GetRecordCount()得到记录数
Aizz 2003-02-14
  • 打赏
  • 举报
回复
没明白楼主的意思。
先不管其他的,单单就“根据文本框的值查找m_pTTSet,找到后....没找到给出信息”这个来说,可以:
1、遍历m_pTTSet,比较文本框和每条记录对应的值,找不到就提示信息。
2、根据文本框的值建一个SQL,用这个SQL打开一个CRecordset,判断CRecordset是否为空。
red-fly 2003-02-14
  • 打赏
  • 举报
回复
CString strCmd1 = "INSERT INTO QUERYCLASSROOM (room_id, cweek, ctime)
SELECT course_place, cweek, ctime
FROM TOTALTABLE
能正确吗?奇怪,肯定不会正确了,想一想呀,少了东西了耶,像下面这样了:
CString strCmd1 = "INSERT INTO QUERYCLASSROOM (room_id, cweek, ctime)
values(SELECT course_place, cweek, ctime
FROM TOTALTABLE)
保你没错!!!
flyingiug 2003-02-14
  • 打赏
  • 举报
回复
怎么高手都消失了?是不是今天情人节哟,大家都........^_^
加载更多回复(4)
在编写程序的过程中,我遇到了这样的需求:在基于Windows 9x 或 Windows NT4.0 的程序中,要求确定键盘、鼠标处于空闲状态的时间。查询了有关资料文档以后,发现Windows 9x和Windows NT4.0 没有提供API或系统调用来实现这样的功能。但是,在Windows 2000中提供了一个新的函数:GetLastInputInfo(),这个函数使用结构 LASTINPUTINFO 作为参数: LASTINPUTINFO lpi; lpi.cbSize = sizeof(lpi); GetLastInputInfo(&lpi); 调用函数GetLastInputInfo()以后, 结构成员lpi.dwTime 中的值便是自上次输入事件发生以后的毫秒数。这个值也就是键盘、鼠标处于空闲状态的时间。可惜的是这个函数只能在Windows 2000中使用,Windows 9x 或Windows NT4.0不提供此API函数。那么,如何在Windows 9x 或Windows NT4.0中实现GetLastInputInfo()的功能呢?笔者的方法是利用系统钩子对键盘、鼠标进行监控。 Windows中的钩子实际上是一个回调函数,当用户有输入动作的时候,Windows要调用这个函数。比较典型的系统钩子应用就是键盘钩子和鼠标钩子: HHOOK g_hHookKbd = NULL; HHOOK g_hHookMouse = NULL; 在Windows中,一个系统(相对于一个特定进程而言)钩子必须用一个动态链接库(DLL)来实现。不妨将这个动态链接库命名为IdleUI.dll。 这个动态链接库在Windows 9x和Windows NT4.0 中实现了GetLastInputInfo()的功能。IdleUI.dll中有三个函数: BOOL IdleUIInit() void IdleUITerm(); DWORD IdleUIGetLastInputTime(); IdleUIInit()是环境初始化函数,IdleUITerm()是环境清理函数,分别在MFC应用程序的InitInstance() 和 ExitInstance()中调用它们。当用IdleUIInit()做完初始化后,就可以调用第三个函数IdleUIGetLastInputTime()来获取最后一次输入事件后的时钟。从而实现与GetLastInputInfo()一样的功能。程序TestIdleUI.exe是用来测试IdleUI动态库的,程序中调用了IdleUIInit 和 IdleUITerm,同时在程序的客户区中间显示键盘、鼠标空闲的秒数。 void CMainFrame::OnPaint() { CPaintDC dc(this); CString s; DWORD nsec = (GetTickCount() - IdleUIGetLastInputTime())/1000; s.Format( "鼠标或键盘空闲 %d 秒。",nsec); CRect rc; GetClientRect(&rc); dc.DrawText(s, &rc, DT_CENTER|DT_VCENTER|DT_SINGLELINE); } 图一显示了TestIdleUI运行时的情形。 图一 TestIdleUI运行画面 为了连续的显示,TestIdleUI设置刷新定时器间隔为一秒。 void CMainFrame::OnTimer(UINT) { Invalidate(); UpdateWindow(); } 运行TestIdleUI,当键盘和鼠标什么也不做时,可以看到计时器跳动,当移动鼠标或按键时,计时器又恢复到零,这样就实现了对输入设备空闲状态的监控。实现细节请看下面对IdleUI.dll工作原理的描述: 首先调用IdleUIInit ()进行初始化,安装两个钩子:一个用于监控鼠标输入,一个用于监控键盘输入。 HHOOK g_hHookKbd; HHOOK g_hHookMouse; g_hHookKbd = SetWindowsHookEx(WH_KEYBOARD,MyKbdHook,hInst, 0); g_hHookMouse = SetWindowsHookEx(WH_MOUSE,MyMouseHook,hInst, 0); 当用户移动鼠标或按下键盘键时,Windows调用其中的一个钩子并且钩子函数开始记录时间: LRESULT CALLBACK MyMouseHook(in

4,017

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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