CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  PowerBuilder >  基础类

PB 转 .NET C# 的一点心得

楼主guofengchs(guofeng)2006-10-13 11:30:58 在 PowerBuilder / 基础类 提问

本人从PB3.0   +   WIN32   开始使用PB     一直到现在用的   PB10.5   ,   今天开始慢慢转   .NET     选的是   C#  
  谈谈一些感受  
  1.   切不可心急或轻易放弃,PB   确实上手很快,但是转型确实比较难,一定要坚持。  
  2.   语言我选的是   C#     ,之所以选它是因为他比VB.NET   更加灵活。   还有一些习惯上其实和PB   很象。比如代码注释都是   //     或者   /**/       ,   变量声明也一样     比如   string   s_1;    
  但是初用C#     可能遇到一些困惑     首先是大小写铭感。   然后就是代码段用   {}     ,   还有变量的作用范围,这些是和PB   比较大的区别,也是第一道拦路虎。   这些语言规范需要时间来习惯。多用就好了。  
  3.   去WWW.MICROSOFT.COM/TECHNET     的   webcast     下载大量的视屏教程,都非常的好。  
  4.   PB   最强的是数据库操作。   我来说一下2者的对比。  
  PB   读写数据库用欠入SQL   非常方便。  
  比如   把数据库中   cust_name   字段的内容读取到变量cust_name   里面的小例子来看2种语言的对比:    
  [pb]  
  //建立数据库连接对象  
  transaction   myconn  
  myconn   =   create   transaction  
  //给数据库对象赋予连接字符串  
  myconn.DBMS   =   "OLE   DB"  
  myconn.LogId   =   'sa'  
  myconn.DBParm   =   "PROVIDER='SQLOLEDB',DATASOURCE='192.168.0.1',PROVIDERSTRING='database=test_db'"  
  //连接数据库  
  connect   using   myconn;  
  //申明变量  
  string   custname  
  string   cust_id   =   '001'  
  //读取内容  
  select   cust_name   into   :custname   from   t_cust   where   cust_id   =   :cust_id;  
  //关闭数据库连接  
  disconnect   using   myconn;  
  //显示数据  
  messagebox('',custname)  
   
  [c#]  
  //建立数据库连接对象  
    SqlConnection   myconn;  
    myconn   =   new   SqlConnection();  
  //给数据库对象赋予连接字符串  
  myconn.ConnectionString   =   "database=test_db;server=192.168.0.1;uid=sa;";  
  //连接数据库  
  myconn.Open();  
  //申明变量  
  string   cust_name;  
  string   cust_id   =   "001";   //注意     C#里面STRING   的值要用双引号,   单引号表示char类型  
  //读取内容   (c#执行sql语句要用到sqlcommand   对象,我们同样用类似PB   的参数化查询)  
  SqlCommand   cmd   =   new   SqlCommand("select   @custname   =   cust_name   from   t_cust   where   cust_id   =   @cust_id",myconn);   //这里的参数就等于PB   里面的   :custname   :cust_id,     但是还要转换一次到变量  
        //添加参数  
  cmd.Parameters.Add("@custname",   SqlDbType.VarChar,255).Direction   =   ParameterDirection.Output;//我们要读取这个参数,所以设置方向为读取  
  cmd.Parameters.Add("@cust_id",SqlDbType.VarChar).Value   =   cust_id;   //个cust_id   参数赋值          
      //开始查询数据库  
  cmd.ExecuteNonQuery();  
      //读@custname参数的值到变量  
  custname   =   cmd.Parameters["@custname"].Value.ToString();  
  //关闭数据库连接  
  myconn.close();  
  //显示数据  
  messagebox.show(custname)  
   
   
  未完待续....     (如果其它朋友有什么心得也欢迎分享) 问题点数:0、回复次数:57Top

1 楼guofengchs(guofeng)回复于 2006-10-13 11:37:02 得分 0

写的比较仓促有一些错误  
  下载视频教程到    
  http://www.microsoft.com/china/msdn/events/webcasts/shared/Webcast/MSDNWebCast.aspx  
   
  另外例子中的PB段里面漏了指定数据库连接对象,因改为:  
  //读取内容      
  select     cust_name     into     :custname     from     t_cust     where     cust_id     =     :cust_id   using   myconn;      
  Top

2 楼JustNoOtherWay(e阿亮)回复于 2006-10-13 11:42:37 得分 0

不错,UPUPTop

3 楼dashi(喜欢莲的憨木鱼)回复于 2006-10-13 12:02:34 得分 0

接分~Top

4 楼guofengchs(guofeng)回复于 2006-10-13 12:34:15 得分 0

接上回  
  我们来对比一下游标  
  [pb]  
  //连接打开数据库  
  transaction   myconn  
  myconn   =   create   transaction  
  myconn.DBMS   =   "OLE   DB"  
  myconn.LogId   =   'sa'  
  myconn.DBParm   =   "PROVIDER='SQLOLEDB',DATASOURCE='192.168.0.1',PROVIDERSTRING='database=test_db'"  
  connect   using   myconn;  
  //定义变量  
  string   emp_number,emp_name  
  //定义游标  
  DECLARE   Emp_cur   CURSOR   FOR  
  SELECT   employee.emp_number,   employee.emp_name  
  FROM   employee   using   myconn;  
  //打开游标  
  open   Emp_cur;  
   
  //开始逐条查询并处理  
  fatch   Emp_cur   into   :emp_number,:emp_name;  
  do   while   myconn.sqlcode   =   0  
    messagebox('',emp_number   +   "   "   +   emp_name)  
    fatch   Emp_cur   into   :emp_number,:emp_name;  
  loop  
   
  //关闭游标和数据库连接  
  close   Emp_cur   using   myconn;  
  disconnect   using   myconn;  
   
   
  [c#]  
  //连接打开数据库  
  SqlConnection   myconn;  
  myconn   =   new   SqlConnection();  
  myconn.ConnectionString   =   "database=test_db;server=192.168.0.1;uid=sa;";  
  myconn.Open();  
  //定义变量  
  string   emp_number,emp_name;  
  //定义游标(c#里面有sqldatareader   对象,可以完成游标的功能,同样查询数据库我们要用sqlcommand   对象)  
  SqlCommand   cmd   =   new   SqlCommand("SELECT   employee.emp_number,   employee.emp_name  
  FROM   employee",myconn);  
  SqlDataReader   dr   ;  
  //打开游标  
  dr   =   cmd.EndExecuteReader();;  
   
  //开始逐条查询并处理  
  while   (dr.Read())  
  {  
            emp_number   =   dr["emp_number"].ToString();  
            emp_name   =   dr["emp_name"].ToString();  
            MessageBox.show(emp_number   +   "   "   +   emp_name);  
  }  
  //关闭游标和数据库连接  
  dr.close();  
  myconn.close();  
   
   
  Top

5 楼guofengchs(guofeng)回复于 2006-10-13 12:55:39 得分 0

思路整理中...     先说说一些小问题  
  变量作用范围  
   
  PB    
  局部变量(定义在一个过程或者函数里面)  
  共享变量(一个对象或者一个窗体的所有事件,过程,函数都可以访问)  
  全局变量(整个应用程序都可以访问)  
   
  c#  
  它的变量定义范围是以   class   为级别的,class就是类,   c#   的程序基本都是一个一个class组成的,   一个window   (   form)   也是一个类,   一个类包含许多方法(类似pb的函数)  
  局部变量   当变量定义在某个方法里面,   那么只有这个方法可以访问这个变量    
  共享变量   当变量定义在类里面,   那么这个类里面的所有对象和方法都可以访问  
  全局变量   这个也是当初困惑我的,c#其实是没有全局变量的,类级别的变量其实就是最大级别的变量,这个就是在面向对象的概念里面不存在全局的变量,   但是程序里面全局的变量不可缺少,那么如何变通呢,    
  我们可以通过定义一个静态的类,(所谓静态类就是使用的时候不需要创建对象,程序一运行,这个类的实例就存在了,所以静态类里面的变量,不管什么时候或者在程序的任何地方去访问   都是存在的,不会清空)所以我们就在这个静态类里面定义变量(就可以看作是全局的变量)   供程序使用Top

6 楼wisdomone()回复于 2006-10-13 13:06:02 得分 0

upTop

7 楼guofengchs(guofeng)回复于 2006-10-13 13:31:12 得分 0

再来说一下pb   的   datastore  
  datastore   可以看作是去掉ui的datawindow   ,所以这节其实也可以看作是比对datawindow的部分功能.  
  我们手工创建一个datastore   然后读取数据   然后处理  
  连接数据库的步骤我就省略了,大家可以参考之前的  
   
  [pb]  
  //创建datastore  
  string   sqlstr   =   "SELECT   employee.emp_number,   employee.emp_name   FROM   employee",errmsg  
  sqlstr   =   myconn.syntaxfromsql(   sqlstr,"style(type=grid)",errmsg)  
  datastore   ds  
  ds   =   create   datastore  
  ds.create(sqlstr)  
  ds.settransobject(   myconn)  
  //查询数据  
  long   l_rows  
  l_rows   =   ds.retrieve(   )  
  if   l_rows   >   0   then   messagebox('','查询到'   +   string(l_rows)   +   '条记录')  
   
  //遍历数据并处理  
  long     l_1  
  for   l_1   =   1   to   l_rows  
          Messagebox('',ds.getitemstring(l_1,'emp_number')   +   "   "   +   ds.getitemstring(l_1,'emp_name'   ))    
  next  
   
  [c#]  
  c#中的   dataset   和   datatable   非常强大,   dataset   就是   datatable   的集合,   例子中,我们使用datatable对象(可以想象成一张datawindow)     ,然后我们要用数据适配器(sqldataadapter)来把数据从数据库中取出放到datatable里面  
   
  //创建datatable   和   sqldataadapter  
  string   sqlstr   =   "SELECT   employee.emp_number,   employee.emp_name   FROM   employee";  
  SqlDataAdapter   sqlda   =   new   SqlDataAdapter(sqlstr,myconn);  
  DataTable   dt   =   new   DataTable();  
   
  //查询数据  
   
  long   l_rows;  
  sqlda.Fill(dt);  
  l_rows   =   dt.Rows.Count();  
  if   (l_rows   >   0)  
    MessageBox("查询到"   +   l_rows.ToString()   +   "条记录")  
   
  //遍历数据并处理  
   
  for   (   long   l_1   =0   ;   l_1   <   l_rows;   l_1   ++)  
  {  
          MessageBox.Show(dt.Rows[l_1]["emp_number"].ToString()     +   "   "   +   dt.Rows[l_1]["emp_name"].ToString())    
   
  }  
   
  Top

8 楼guofengchs(guofeng)回复于 2006-10-13 14:16:15 得分 0

接前列,   PB   中   datawindow/   datastore   是最强大的对象,也是PB   存在至今的原因,但是MS   在   .NET   里面对数据处理下了狠功夫,   其dataset/datatable     +   sqldataadapter   就完全可以达到datawindow   的数据库处理功能   ,而且更加灵活.  
  前面的例子,我们比较了读取数据的操作,我们再比较一下更新数据的操作  
  下面的例子是接在前面的,所以一些处理我就省略了  
   
  [pb]  
  //更新操作,更新第3行的记录  
  int   i_rows   =   3  
  ds.setitem(i_rows,"emp_number","001")  
  ds.setitem(i_rows,"emp_name","张三")  
  ds.update()  
   
  [c#]  
  //更新操作,更新第3行的记录  
  //前面说了C#里面   sqldataadapter   负责把数据从数据库取到dataset,同样写入数据库也要用它.之前我们只定义了如何取数据,现在要定义如何存数据,由于pb里面的datawindow   和datastore   会自动根据查询语句来生成更新语句,   那么我们同样也让sqldataadapter自动生成写入语句,   这个操作需要一条语句.  
   
  SqlCommandBuilder   scb   =   new   SqlCommandBuilder(sqlda);//这条语句执行后,就具有了写入数据库的能力  
  int   i_rows   =   3;  
  dt.Rows[3][emp_number]   =   "001";  
  dt.Rows[3][emp_name]="张三";  
  sqlda.Update(dt);  
   
   
  ----插入操作----  
  [PB]  
  int   i_row  
  i_row   =   ds.insertrow(0)  
  ds.setitem(i_rows,"emp_number","001")  
  ds.setitem(i_rows,"emp_name","张三")  
  ds.update()  
   
   
  [c#]     我们又要引入一个   datarow的对象,   它实际上就是datatable   的行  
   
  DataRow   dr   =   dt.NewRow();//   定义新的一行  
  dr["emp_number"]   =   "001";  
  dr["emp_name"]   =   "张三";  
  dt.Rows.Add(dr);   //   把新的行插入到   DATATABLE   里面  
  sqlda.Update(dt);  
   
   
  ----删除一行-----  
   
  [pb]  
  int   i_delrow   =   3  
  ds.deleterow(i_delrow)  
  ds.update()  
   
  [c#]  
  int   i_delrow   =   3;  
  dt.Rows[i_delrow].Delete()  
  sqlda.Update(dt);Top

9 楼lzheng2001(1加1)回复于 2006-10-13 14:43:04 得分 0

你这样写有点儿麻烦吧,建议更新到自己的blog上,然后贴一下你的blog的地址就行了Top

10 楼v888(aosgzi)回复于 2006-10-13 14:55:57 得分 0

呵呵,支持`  
  Top

11 楼whchen(土龙)回复于 2006-10-13 15:13:52 得分 0

LZ讲的内容在.NET里有现成的工具可以利用,也很方便。  
  我觉得PB的优势是数据窗口控件本身的功能非常强大。Top

12 楼zzxing()回复于 2006-10-13 15:20:13 得分 0

支持Top

13 楼vvresoft(侯哥)回复于 2006-10-13 15:29:51 得分 0

我和搂主一样有同感,我也是从pb转c#的,看了楼主的论述受益很大。  
  我增加一点自己的见解。  
  以前学习pb   时,其实对面向对象的思想不时很强,pb   中类的概念不强,什么虚类,虚方法什么的更不用提了。pb   中的datawindow的确很强大也很灵活,我到现在用c#处理数据时还一直怀念pb   中的datawindow。pb   的所有窗口和菜单等一些对象都放到了pbl中,这就使得pb   开发的模式上和c#就有了一定的区别。  
  其实接触了c#之后,你才会真正的领悟面向对象的实质,继承、接口==  
   
  感谢楼主     我的邮箱   houzhiwei@resoft.css.com.cn  
  多交流Top

14 楼brisk_zhang(风往南吹)回复于 2006-10-13 19:07:10 得分 0

markTop

15 楼hzzz_lgh3399()回复于 2006-10-14 08:47:06 得分 0

very   goodTop

16 楼lovemq(向前看)回复于 2006-10-14 16:27:57 得分 0

markTop

17 楼tyzs2001()回复于 2006-10-14 19:14:27 得分 0

顶一下,我也是做pb的,现在正在转.net   ,和楼主一样  
  Top

18 楼ayouaja(向龙虾学习)回复于 2006-10-16 15:30:32 得分 0

顶顶顶。转c#中Top

19 楼liugang78(woods)回复于 2006-10-16 15:41:53 得分 0

支持,请继续Top

20 楼kojiang(锉刀)回复于 2006-10-16 16:53:18 得分 0

mark~~~Top

21 楼gjz_1209(龙行天下--好想辞职!)回复于 2006-10-16 17:27:51 得分 0

学习Top

22 楼yinfeiL()回复于 2006-10-16 21:32:39 得分 0

我觉得语法的区别只是次要的,最主要的是要让pb开发人员开发思想转到C#下,尤其企业级开发中.Net   渗入了很多开发模型、思想,领悟这个才是正道  
      至于语法,我想学过C、C++的稍微看一下就能掌握了  
  Top

23 楼expeditioner()回复于 2006-10-17 08:41:01 得分 0

.net做界面如何?比PB完善吗?比如datawindow中的子下拉数据窗口等等.Top

24 楼ISO2004()回复于 2006-10-17 19:21:01 得分 0

MarkTop

25 楼fireflysky(bb)回复于 2006-10-17 23:00:23 得分 0

做记号Top

26 楼peixun(秋雨霏霏)回复于 2007-03-19 16:15:15 得分 0

markTop

27 楼hgxhzzl(哲龙)回复于 2007-03-19 21:51:21 得分 0

其实pb,函数也可以是多态的,Top

28 楼alofawzhy()回复于 2007-03-21 19:30:51 得分 0

我也算是从pb转向C#的,一开始接触编程,最早掌握的工具便是pb6.0,后来使用8.0,9.0,由于工作上很少使用pb,慢慢的也就转向C#了,搂住说的没错pb里类的概念很弱,不区分大小写,也算是一方便之处,刚开始用。net还真不习惯,全局变量问题也让我头痛了一阵,对C#最大的感受算是DataSet和DataTable了,对于批量数据的处理确实方便了许多,但是在报表方便的功能感觉还是pb不错,不知为何,,net的中文帮助,我就是用不来,容量那么大,查询一个想要的方法例子,他却给你洋洋洒洒撤了半天所属类的方法介绍,最后给的例子也不能很好的理解,没更别说像pb帮助中的例子那样,拷贝过来改个参数,程序就可以转,这点上倒是很怀念pb的帮助系统,虽然是Y文的。一点感受,水平很菜,就不发表程序相关见解了,怕被砖头砸着。呵呵^_^  
  Top

29 楼hzzz_lgh3399()回复于 2007-03-22 08:35:46 得分 0

顶一下,我也是做pb的,现在正在转.net   ,和楼主一样Top

30 楼tonyu(中山小伙子)回复于 2007-03-22 16:18:31 得分 0

我也是做PB的,06年开始已经想转asp.net,但因为公司很忙,所以到现在都没学成,只是学了开始的66页,郁闷ingTop

31 楼coolhe21cn()回复于 2007-03-22 17:31:21 得分 0

好,顶顶!!!!Top

32 楼888888888888(888888888888)回复于 2007-03-22 19:00:27 得分 0

哎~~!     看来还是JAVA好.Top

33 楼lahuhu()回复于 2007-03-22 21:25:16 得分 0

哎,我也是从PB开始,才转向C#两个月,对于C#的实在是没概念.特别是帮助,我看了吐血.Top

34 楼bedsb()回复于 2007-03-28 10:20:38 得分 0

MARKTop

35 楼simplewho(简简单单就是我)回复于 2007-03-28 12:27:46 得分 0

MARK!...Top

36 楼aaron_1860()回复于 2007-03-28 22:18:42 得分 0

两个一起用着,想着这个,忘了那个。Top

37 楼ychmj()回复于 2007-03-29 12:42:57 得分 0

很想转C#,可是就是忘不了PB的方便,根本就不知道从何入手C#。累的。一次一次的失败。Top

38 楼madalin(老马)回复于 2007-03-29 13:42:02 得分 0

支持楼主!我也是做PB开发的,目前在学C#Top

39 楼visionlch()回复于 2007-03-29 15:03:44 得分 0

支持楼主,向楼主学习Top

40 楼kojiang(锉刀)回复于 2007-03-29 16:30:01 得分 0

mark!!Top

41 楼tanjun132()回复于 2007-03-29 23:23:40 得分 0

写的好!!注视中Top

42 楼mikewolfli(冰峰雪古)回复于 2007-03-30 10:42:06 得分 0

我是用vc的,最近准备用pb数据库,vc转工业控制了Top

43 楼visionlch()回复于 2007-03-30 12:18:56 得分 0

有心得的欢迎踊跃发言Top

44 楼grt(哥莱特)回复于 2007-03-30 18:06:26 得分 0

我也是从事pb,5---6年了,大小项目独立做了不少。现在刚学.net和C#,有个项目做了一半了。  
  要说感受,那就是更爱PB,PB调个数据,走个变量太容易了,特别是dw。可C#太不容易了,麻烦一大堆,操作一下数据库左定义右定义,不断的new,变量调用十分严格,真不习惯。  
  但是业务层的东西会更明了,新的设计思想、方法例如:工作流等,学到不少。  
   
  要是pb出能搞这样一个平台,那前途不会比.net差的。  
   
  但愿吧,不知pb11效果如何?Top

45 楼grt(哥莱特)回复于 2007-03-30 18:11:22 得分 0

希望同行多多和我交流   chyishan@tom.comTop

46 楼ychmj()回复于 2007-03-31 11:31:46 得分 0

大家为什么要学C#,难道只为开发B/S结构。不是说PB10.5很好吗?也能开发B/S结构呀。Top

47 楼f_mei520()回复于 2007-03-31 15:19:53 得分 0

使用PB中,感謝樓主的見解Top

48 楼qimin168(难得糊涂)回复于 2007-04-03 15:41:03 得分 0

感谢楼主开了这么一好贴啊!!  
  我是刚从PB转C#,正在迷惑中,找不到门路!Top

49 楼yifu1126(gone with the wind)回复于 2007-04-03 16:57:24 得分 0

刚开始从PB转C#,感觉还蛮容易的,但越到后来就越感觉到压力  
  我也是觉得这是需要耐心的!Top

50 楼niexiancheng(不想说太累)回复于 2007-04-04 14:43:51 得分 0

准备从PB转到VB.NET.刚开始Top

51 楼dangerous123()回复于 2007-04-08 16:15:01 得分 0

正准备从pb转c#中,请荐下c#入门的好书.Top

52 楼wz2zf()回复于 2007-04-09 14:59:23 得分 0

唉,小弟是学.net的,现在刚到的公司用的pb,没办法,还得学,还请各位前辈多多指点啊Top

53 楼cuixuf(A4〓小小小小刀〓(...---...))回复于 2007-04-10 11:47:21 得分 0

markTop

54 楼jiangjildy(牛晤草)回复于 2007-04-10 13:52:38 得分 0

PB转C#很容易呀!问题是看你的PB水平了,PB也支持面向对象,开发中不会用甚至不用,就不要说是PB的面向对象不行了.     donet的dataset很大程度上的学的datawindow的思想.Top

55 楼moyanwuhen()回复于 2007-04-10 17:05:44 得分 0

upTop

56 楼joycepure18()回复于 2007-04-12 11:58:47 得分 0

看了这么多人的回复,有个问题不明白:为什么都从pb转到c#呢?除了c#就没有其他的好转吗?  
  我很早以前用过pb,那时刚从学校出来不久,没入门就转到php上了。现在开始学c#,总感觉这个语言很不好用,要记的东西很多,总归也是困难重重。  
  也许习惯了就好,呵呵  
  Top

57 楼kt563(kt_阿玮)回复于 2007-04-12 15:17:55 得分 0

MARK   下Top

相关问题

关键词

得分解答快速导航

  • 帖主:guofengchs

相关链接

  • PowerBuilder类图书
  • PowerBuilder类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo