PB 转 .NET C# 的一点心得
本人从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




