VC操作SQL Server 主从表

东软实习那些事。。。。 回学校两三天了,其实早就应该写写总结什么的了。但是实习时一直忙于项目开发,再加上公司对上网过滤,能登上的仅是一些技术性网站,如:ITeye、51CTO、csdn和pudn等。三周的实习生活结束了,感受还是很多的。 实习前发生了点事(个人原因,呵呵),想了很多,心情一直很忧郁,所以实习期间前几天一直没进入状态,做什么都没心情,幸好实习期间的前几天事情不太多。同时谢谢“梅花”... 阅读详情

VC操作SQL Server 主从表

作者:袁怀善
工作之余,用VC作了一个小程序,是VC+SQL server模式的,程式内容比较简单,主要设及以下内容:
1. 窗口如何分割
2. 多视图之间如何通信
3. 列表视图的操作及事件处理
4. 树形控件的操作及事件处理,利用递归根据数据库动态生成目录。
5. 实现主从表的显示 以下对程序细节稍作一下说明;

一. 窗口如何分割

切分窗口既适用于SDI应用程序,也适宜于MDI应用程序。它通常驻是以类 CSplitterWnd来表示,对Windows来说,CSplitterWnd是一个真正的窗口,它完全占用框架窗口的客户区域而视图占用切分窗口的窗格区域。 动态切分与静态切分 动态切分允许用户须任何时候对窗口进行切分,用户既可以通过选取菜单也可以通过拖动滚动条中的切分框来进行切分。动态切分窗口使用的是一个视图类。 静态切分,当窗口第一次被创建时,窗格就已经被切他好了,它们不能再被改变。用户可以移动窗格边框,但此时不能再对窗口进行合并或再划分。静态切分窗口允许使用多个视图类,并且可以创建时对这些视图类进行配置。在静态切分窗口中,每个窗格都有自己的滚动条。 动态切分比较简单,不实用,下面看静态切分。
 BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
   {
 CRect rect;
 GetClientRect(&rect);
 m_wndSplitter1.CreateStatic(this,1,2);
 m_wndSplitter1.CreateView(0,0,RUNTIME_CLASS(CClassTreeView),CSize(150,150),pContext);
 m_wndSplitter2.CreateStatic(&m_wndSplitter1,2,1,WS_CHILD|WS_VISIBLE,m_wndSplitter1.IdFromRowCol(0,1));
 
 m_wndSplitter2.CreateView(1,0,RUNTIME_CLASS(CDagDetialView),CSize(0,0),pContext);
 m_wndSplitter2.CreateView(0,0,RUNTIME_CLASS(CDagView),CSize(0,0),pContext);
 m_wndSplitter2.SetRowInfo(0,rect.Height()/2,0);
 return true;
    //重载时不能调用基类的OnCreateClient()
 
}
 
以上是本程序DEMO使用的方法。关于切分详细信息,请查阅MSDN.

二.多视图之间的通信。


本程序demo使用了三个视图类,Winzard生成了一个,其余的是我加的。关于多视图之间的通信主要是茯得你要访问的视图类的pointer,如何茯得?有两种方法1,通过视图类(如果有多个视图共享一个文档类的话)2.通过主框架茯得。由于我的程式就一个文档类,其他视图类是独立的,所以就采用第二种方法了。
以下代码是茯得CDagDetialView类指针的示例,其余类同。
CMainFrame* pFrame=static_cast<CMainFrame*>(AfxGetMainWnd());//茯得主框架
CDagDetialView* pDagDetialView=static_cast<CDagDetialView*>(pFrame->m_wndSplitter2.GetPane(1,0));
以上有一点,我觉得最好采用以上形式,虽说通过C的强制转换语法也行,但最好还是使用C++的语法比较好。
茯得视图指针后你就可以do anything that you want to do
顺便说一下,通信细节有一些牵连到效率的地方,一定要妥善处理。上面的demo程式,没有考虑过多。因为我觉得这比较适合大家看明白意思,如果程式模块分散开来,程式看起来是简洁了不少,但不太方便看清程序流程。请见谅。

三.列表视图的操作及事件处理.


说句实话,列表的属性参数很多,标准的、扩展的风格参数一大堆,看看那些英文文档,在其中苦苦搜寻,找一条自己需要的特性,其中的滋味别提了。还好我很有耐心:)熟练了就好了,都记住了一大半,还怕什么。列表控件显示数据,要用LVS_REPORT风格,比较好看,就像DataGrid一样。设置窗口风格需要用SetWindowLong这个API函数。这个函数是通用的。参数也一大堆。处理列表的单击事件即是处理消息NM_CLICK,处理选择改变时的事件即是处理LVN_ITEMCHANGED,不同的消息可能参数不同,需区别对待。
   void CDagView::OnItemchanged(NMHDR* pNMHDR, LRESULT* pResult)
            {
            NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
            // TODO: Add your control notification handler code here
            CListCtrl& refListCtrl=GetListCtrl();
            if(pNMListView->uNewState&LVIS_SELECTED)
            …//选取列表项时,事件触发
            pResult=0;
            }
 
同样的方法处理单击,双击等事件,不再嗷述。

四.树形控件的操作及事件处理,利用递归根据数据库动态生成目录


树形控件,和列表控件一样,在VC数据开发中有着非常重要的地位。常用来显示分级,分类信息。其实,提到树,脑海里就出现一大堆树,什么二叉树,查找树,哈夫曼树等一大堆,也就想起了遍历树的常用算法—递归。虽然采用堆栈更有效率,但使用递归常使程序设计简化。
看以下程式片段:
 pRS->MoveFirst();
 _variant_t var;
 CString strTableName,strTableCode;
 HTREEITEM hChildItem;
 while(!pRS->adoEOF)
 {
  var=pRS->GetCollect("menucode");
  if(var.vt != VT_NULL)
   strTableCode = (LPCSTR)_bstr_t(var);
  if(!strTableCode.Find(strParent,0)&&strTableCode.GetLength()==strParent.GetLength()+2)//此即函数递归出口
  {
   hChildItem=refTree.InsertItem(strTableName,hTreeNode,TVI_LAST);   
   InitTree(refTree,hChildItem,strTableCode);
  }
  pRS->MoveNext();
 }

 

递归时充分利用树形结构的特点。然后结合递归思想,融合在一起,就行了。这里就是理论和实际的结合点。不同的开发语言提供的操作接口是不同的,如Delphi、.dotnet。我呈在在.net也实现了一个类似的树,算法思想一样,只是具体操作不同,因为dotnet提供的接口不同。
树形控件的事件处理:
void CClassTreeView::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult)
{
 NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
 // TODO: Add your control notification handler code here 
 CTreeCtrl& refTreeCtrl=GetTreeCtrl();
 HTREEITEM hSelected=pNMTreeView->itemNew.hItem;
 if(hSelected!=NULL)
 {
  m_strMenuName=refTreeCtrl.GetItemText(hSelected);
     if(AfxGetMainWnd()->IsWindowEnabled())
  UpdateDagView();
 
 }

 //-----------
 *pResult = 0;
}
 

五.实现主从表的显示


由于我假设不知道数据库中有多少字段,字段名都是不知道的。所有都动态生成。所以首先要检索主键。把主键检索出来以后,然后得到列表当前选择行的对应于主键列的数据。
然后以这些主键列的值当作检索条件检索从表的数据(从表的主键一定多于主表)最后将结果显示出来。看起来过程也挺简单的,如果用dotnet中DataGrid做的话,太简单了是吧,
但VC操作起来,就有点麻烦了。就拿从列表取当前选择行的主键列的数据的话,和dotnet一比,就知道VC麻烦在哪儿了。(不过我还是比较喜欢VC,嘿嘿)
一个DataGrid,如果我知道了列名,又茯取了当前行的行号(CurrentRowIndex)
如果你后台是直接绑定的一个DataTable,就可以直接取得这个值:
myTable.Rows[CurrnetRowIndex][“pkey1”].ToString();
当然如果你后面不是直接绑定一个DataTable,而是一个结果经过虑后的结果,那么可能会稍烦琐一点。这里不对这种情况进行计讨论。下面看一下VC下是怎么处里的,(如果有更好的方法,请通知我,先谢了)
int CDagView::GetColumnIndex(CListCtrl &ref,LPCTSTR strCol)
{
 CHeaderCtrl * pHeader=ref.GetHeaderCtrl();
 int nCount=pHeader->GetItemCount();
 TCHAR  lpBuffer[256];
 bool   fFound = false;
 HDITEM hdi;
 hdi.mask = HDI_TEXT;
 hdi.pszText = lpBuffer;
 hdi.cchTextMax = 256;
 int index=-1;
 for (int i=0;!fFound && (i < nCount);i++)
 {
  pHeader->GetItem(i, &hdi);
  
  if (strcmp(hdi.pszText, strCol) == 0)
  {
   index=i;
   fFound = true;
  }
 }
 return index;
}
iSubItem=GetColumnIndex(refListCtrl);
CString strValue=refListCtrl.GetItemText(iCurrent,iSubItem);
 
先取得列号然后取得行号,最后取这个值。。。。。。
好了,就多这么多吧,具体细节再看代码吧。

 
六、结束语

其实这个程式比较简单,在windows 2k下调试通过!就写到这里吧,不足之处,见谅!有时候,再好的技术,如果缺乏有效的示例,也会变得晦涩难懂。像本文中的列表、树形控件参数很多,使用VC++虽然说可以发挥出他们最强劲的功能,但是有一部分参数,在MSDN中只是简要介绍,没有详细的示例说明(我猜:微软内部肯定有更加详细的示例及文档,或者说叫引擎,不对外公布)这就要靠广大程序员的努力探索了,知识共享,大家共同进步。
sambios 于2004-9-2撰

Camera metadata 阅读详情

相关推荐

AI自动化流程在金融风控中的3个典型案例

AI自动化风控流程全流程自动化:最小化人工干预,实现从数据输入到决策输出的闭环自适应学习:通过持续数据反馈实现模型自动迭代优化实时决策能力:满足毫秒级(支付风控)至分钟级(信贷审批)的响应需求多模态数据融合:整合结构化、非结构化和实时流数据智能决策解释:自动生成符合监管要求的决策解释人机协同机制:在高风险场景下实现AI与人类专家的协同决策实施后关键绩效指标(KPI)变化指标实施前实施后改进幅度平均审批时间3.2天4.7分钟-99.7%自动审批率15%85%+467%

架构师的AI之路,分享AI应用开发架构的学习与实践。 1515

数据库查询优化(主从表的设计)

写过许多的数据库查询语句,面对过许多的问题,也在磕磕碰碰中学到了很多东西。昨天在看系统数据库设计与SQL代码时,突然“发现”了许多平常不屑看到的问题,于是就萌生了把它提出来思考的念头

施耐德ATV310系列变频器_Modbus通信地址参照.xls

施耐德ATV310系列变频器_Modbus通信地址参照

SqlServer主从技术

sqlserver主从技术包含:复制、日志传送、镜像、AlwaysOn这四种方式。

bigcucumber的博客 4104

SQL Server 主从技术介绍

SQLServer 主从技术包含:复制、日志传送、镜像、AlwaysOn 这4种方式。主要取决于客户需求。 复制 一般说的事务复制。 是针对级别,上必须有主键。同步延迟低,不可自动故障转移。第二个节点可以读 日志 同步延迟高,不可用自动故障转移。 第二个节点可以读,针对数据库级别 镜像 有同步模式,延迟低,可用故障转移,但第二个节点不可读,针对数...

leo__1990的博客 3106

Win2000 Pro与Server的区别

Win2k Pro与Server的区别作者:袁怀善最近编程越到一个怪事,同一个程序运行在windows2000 server级的操作系统上一点问题没有,而运行在window 2000 professional上就会出现异常.而且一旦出现异常,就会使cpu的占有率高达100%,程序跟踪结果结论为:堆栈溢出(stack overflow).windows 2000系列的OS不是一个NT内核吗,可是书中

雨雪逝去(Sambios)的专栏 2551

怎么区分关系型数据库里面的主和从

包含要引用的列,也称为父(Parent Table)或主键(Primary Key Table)。从包含外键列,也称为子(Child Table)或外键(Foreign Key Table)。PS:在定义从时,需要在外键列上添加外键约束。然后对这个主有点模糊概念,可能我比较笨光看文字不是很能体会到。我就后面看了几篇文章了解清楚,就写也一篇记录一下。IF。

ZYXKN的博客 1058

SQL Server主从数据库配置过程

条件1.源端的,需要添加主键;2.备库准备:安装与源端一致的操作系统和数据库版本;一、准备工作:注意点:1、服务器名称(主机名)最好在确定好后再安装SQL Server 2012数据库这样能确保主机名,实例名保持一致。2、如果是在安装好sqlserver2012后修改了主机名,通常会导致主机名和实例名不一致问题。3、可通过下面的命令进行检测和修复查看服务名称(默认安装时的实例名也是和主机名一致)和主机名是否一致修改完成之后,重启sqlserver服务。1。

Auspicious航的博客 9450

夏天吃东西注意啦!!本人吃坏肚子难受了一天啊!

夏天吃东西注意啦!!本人吃坏肚子难受了一天啊!前天我和我女朋友因为头一天晚上吃东西不注意导致拉肚子并伴随呕吐!!并把我女朋友的胃炎病也搞犯了。到医院花了500多,现在还不见好啊!! 那天晚上我们吃的东西是:糯米冰粽子、凉皮、西瓜...

192

天啊,已经好久没有写博客了

  “努力不一定会成功,但不努力会很轻松哦~”。被这句话害得要死……这篇废话是重归博客的标志。   我说,有时间,写写博客真心不错。博客,可以是技术博客,也可以是生活博客。   技术上,可能你现在刚好学习了某个知识,你觉得写下来其实对你帮助不大,反而要花很多时间在整理知识,达知识(画图,画之类)很不值。但是时间告诉我,这很值,必须值。 用心整理过的东西,你印象极其深刻,以后一旦遇到类...

weixin_30657541的博客 58

我和一个警察MM不可不说的故事(3,又是一个能吃的美女)

[b]我和一个警察MM不可不说的故事(原创小说)(1,初识美女) [/b] 我第一次见到她是在一次羽毛球比赛上,那是一年的冬天,那时我学校羽毛球社团的主席,带领我们校队去打比赛。她的朋友代警察学校参赛。当时我正在场边做这技术统计,她出现在体育馆的门口,她穿着粉红色的大衣,脸上带着一贯的微笑,她并不算很漂亮,但她的气质很吸引我,又仿佛冥冥之中在哪里见过她,但身位校队的领队,我又不...

whycloud 7509

一个程序员开始自己的爱情

   抱着喜悦的心情去一个熟悉的地方,心里暗暗的想着她,也很开心,上次公车快线,手边也不段的看自己手机是否有她的来电或者是短信。大概上车不到15分钟,终于发来了一条短信,短信内容是“没电了,在广场等!",看到这条短信的时候,心情特别开心,因为我自从那天晚上就开始打电话发信息,一直都是无法接通,或者是关机。等待着她的来电或者是一条短信。终于在此刻发到我手机上来了。到我转车的时候又坐了一个小时的车才到

HuaLikeDotNet的专栏 730

[人生故事] -- 错进了一个女孩的房间

三年前,已近而立之年的我依然是一个一人吃饱全家不饿但怎么也快乐不起来的"王老五",这让那些恋爱和婚姻都已经"尘埃落定"的朋友忧心如焚,总觉得我的婚姻大事没有得到妥善解决有损于他们的荣誉似的,于是都天天忙着当"红娘"给我牵线搭桥。 一天傍晚,朋友小梅急匆匆地找到我,使劲地把我往门外推:"我已替你物色到了一个挺不错的女孩,你快去江滨路教工宿舍3幢西单元401室约会。现在,她正一个人坐在家里看书,就等着...

weixin_34095889的博客 138

一个松果引发的血案

     很久很久以前,地球还是一片冰川,一片雪白如银的世界里,有一个黑点,那是一颗松果,当那只不幸的松鼠发现了它,注定了一场血案即将暴发。《冰河世纪2.消融》中,当长毛象和那几位勇敢者登上上帝为众生逃生而建造的巨船之后,你紧张的心情是否已放松,是否为这些动物感到庆幸。在庆幸之余,你又怎能知道后面发生的故事… …     当看到那些动物像潮水般涌上巨船的时候,你是否已经在担心巨船能否容得下这么多的

风子的专栏 1217

一个程序猿的双十一

不知道从什么时候开始,直男们就莫名其妙多了一个节日——双十一!节日就该有节日的气氛和心情,快来听听他们撕心裂肺的声音—— 大部分直男在给女生挑礼物这事儿,费钱又烧脑,吃力不讨好,憋屈又辛酸——当男人信心满满地拿出那份精挑细选的礼物,女友看后不是白眼一翻就是两眼一黑……直男宝宝心里苦,你们知道吗? 一个程序猿的双十一 阿亮 男,27岁,程序员 ...

weixin_45820912的博客 361

错过第一个招聘电话

4月29日: 学校有个招聘会,拿了5份简历就去了,去了一看大都是熟悉的面孔-都是以前的老师. 投了两个和自己专业相关的公司,其中问了一个公司大约会在什么时间打电话通知面试,答案-5.1假期之后. 4月30日: 时刻保持手机与我30厘米以内,心想万一有个电话过来怎么办,从早上8点到晚上6.30没有电话,肚子 有点饿了于是去厨房做饭...吃饭.(在这个过程中我没带手机,一直以来没...

毛毛虫 433

一个靠摆地摊为生的女博客

<br />郁幽蓝海泪(个人门户http://hexun.com/yylhl,),女,和讯博客。1984年出生,连云港人,高职学历,专业是计算机,毕业后在上海先是做市场营销,月薪2000多元,后来辞掉了这份工作,毅然在上海浦东八佰伴附近街道摆小摊。她的博客上记录着她摆小摊的苦辣酸甜的感受和丰富多彩的见闻。 <br /><br />2006年9月1日, 郁幽蓝海泪写了第一篇博客《从今天开始发牢骚不要再找人发了》,记叙了她当时的状况:最近的日子过的好穷哦,只有五十块钱了。要过到十八号,哎。娘的。一个死女人在上海

yy6060 1372

回首过去的那些事儿(10)

老乡的公司确实确定了我可以进入他们公司了, 但是他由于出差要一段时间,不能在公司,对方的人事也不能明确的发放offer, 他给我打了几个电话,叫我等他回来之后,好好走个流程, 也许公司相对大了点儿,就比较正规了,什么东西都是流程在控制着,少一步不可, 当时由于没什么钱了,只好开口向朋友借点钱,临时的应付一下。 他出差之后,我骑着自行车,到科技园的天桥上面,站在桥边上望着这一块科研繁荣

FlyQ_Monkey 462

我欲成仙

还记得去年快要回家的时候的激动样、特别是快要下车的那一刻。不过现在又回到公司来上班了!在家的时候、基本上酒就没有断过、但是我又喝不了多少。回家的那天是跟叔叔、还有几位堂哥喝、大年三十是跟爷爷、奶奶喝。初一也是跟爷爷喝、不过是跟四爷爷喝。人生第一次跟老人家拼、不过结果很显然、姜还是老的辣。喝的我直接人约黄昏后。         回家那天晚上就开始下雪了、本来想第二天去外婆家的、因为是外婆生日、可惜

胡汉三 6132
下一篇: Win2000 Pro与Server的区别
sambios
博客等级 码龄22年 4粉丝 15原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值