大家好,我因为工作需要,正使用C# 2005 开发一个可视化的SQL脚本生成器,其功能主要是参考ACCESS的查询设计器,目前遇到了几个问题,特来求教:
(1) ACCESS查询设计器中表示TABLE的是一个Form和ListBox(仅从外观上看),我个人认为那可能不是真正的Form,需要自己做一个控件实现类似的外观和功能,大家以为思路如何?另如有控件开发的资料,请发至[email protected],谢谢.(2) 表示TABLE间关系的线段是如何画上去的,还可以实现点击时加粗,TABLE移动时划线也随之移动,目前为止我没有太好的办法,诸位能否提供思路或办法?做这一部分时,暂时就想到这两个大的困难,以后还有,请大家观注,谢谢!

解决方案 »

  1.   

    画线嘛当然用gdi+中的lineto,不过最好做成一个控件
      

  2.   

    大家好,能过这一段时间的努力,前文中我提到的两个问题基本上都解决了.
    解决方法
    (1) 显示表中所有字段内容的小窗体,最后还是用真正的窗体实现的,只是把窗体添加到想要成为其容器控件的controls集合中,我原来的想法是错误的,关键的代码如下:
                    frmTable frm = new frmTable();
                    frm.TopLevel = false;
                    panel.Controls.Add(frm);
    frm.Show();(2)关于划线段的问题,我单独写了一个划线控件,关键在于这控件的面积只能是线段的面积,否则的话线以外的部分会将后面的内容盖住.主要的技术是通过              GraphicsPath gp = new GraphicsPath();
                 gp.AddLine(x1, y1, x2, y2);
                 Region rg = new Region(gp);
                 return rg;
    计算线控件的Region,并用返回值修改Region属性,这样就保证控件的面积和线段一样了,也不会挡住后面的内容.
    不过由于我不太会开发控件,所以在显示的速度方面很慢,移动表格时需要同步移动线段,这时屏幕闪烁得比较厉害(不过功能总算是实现了;-).但是,现有又有新的问题了:
    ACCESS查询设计器界面靠下部分的表格是如何实现的,它跟我们平时使用的表格控件有些不一样的地方:平时使用的表格都是每一列中所有单元格都有相同的外观,而这里的表格却是在行方向有相同的外观.我目前正在测试.net 2.0中提供的datagridview控件,暂时还没有理想的结果.大家帮帮忙吧!谢谢!!!
      

  3.   

    大家好,上次我说的横行表格的问题,由于时间较紧,我没有去实现,先使用竖向表格凑合用啦!但找到了一些资料,我也进行了少量测试,感觉是可行的.
    http://www.it130.cn/Article/FAQ/.net-jishu/VB.NET/2007-2-25/2007022519565620.html现在又有新的问题,我想了整整一天,但还没有太多的头绪:
    在拖动字段建立关系时,有可能有多张表、多条关系,形成一种很复杂的关系图,再加上连接类型有内连接、左连接,右连接等,用这些信息生成FROM子后时,似乎很复杂,并且某些情况下是不可能生成有效SQL语句的(如两个表之间有两个关系线,一条是左连接,一条是右连接)。
    这样一个关系图,我感觉可以抽象为数据结构中的有向图,但对于生成合法的FROM子句,我还没有太多的办法,大家请帮忙?
      

  4.   

    比如这张图,大家以为该如何生成SQL语句:
    http://p.blog.csdn.net/images/p_blog_csdn_net/jtkk/334304/o_howbuildfrom.JPG
    在ACCESS下可以成功生成SQL语句,但因条件数据类型不兼容等原因,无法运行,在这里我们只考虑各表之间的关系,即FROM子句那一部分.
      

  5.   

    大家好,该工具经过一段时间的开发后已基本成形:-P,现将有关的两个问题在此说明一下,另外还有一点问题讨教,**有者有分**:
      1、根据关系图生成SQL语句的部分没有完全实现,因为图的复杂程度可能很高,并且要与SQL主义结合起来,因而某些关系图是不符合SQL语义的,总体来说,我认为要实现这个功能,一要进行SQL词法分析(这样才能知道语义),二要将语义和关系图结合起来,判断关系图有合法性及如何生成语句。
      我目前的做法是:没有对复杂的关系图进行处理(我说的复杂关系图是指有环路的关系图),而仅处理没有环路的情况。  2、关于画关系线,我是用自己写的线控件,以控件的方式可以方便处理在线条上的鼠标单击,按键等事件。但是在关系图稍大一点时,就发现明显的速度问题(线条闪烁),有时还报MemoryOut的异常(估计是线条控件每次重绘时都要计算和生成新的Region,而垃圾回收回不及处理),所以我考虑使用GDI+,这样我就遇到两个问题:(1)如何进行点击测试,即在点击线条时或线条附近时能够知道是点击到了线条?(2)移动表时线条也要跟着同步移动,在多条线条的互相交错的情况下,能否实现画面的平滑?(移动一个表时,仅与此表有关的线条才会移动,所以我感觉没必要重绘全部线条,而要移动的这个表的线条有可能跟其他表的线条甚至是本表的线条交叉重重叠)。
      

  6.   

    有没有办法测试一个POINT在一个REGION内?
      

  7.   

    找到了:
    用Region.IsVisible方法可判断一个点是否在一个REGION中!!!
      

  8.   

    上面仁兄的看法与我相似,根据关系图生成FROM子句是有点复杂,可能还要进行语法分析!
    真有这么难?
      

  9.   

    真忘了这里还有一贴未结,对不住各位。
    项目已经完成了,至于from子句部分的生成,我没有进行语法分析,只是按照规则把用户的输入连接成SQL子句,至于子句中引用的对象是否存在等,是在运行时由数据库引擎检查并报告的。
    再次感谢!