[转载]jquery easy widgets plugin 插件(拖动布局)

mikel阅读(1115)

[转载]jquery easy widgets plugin 插件(拖动布局) – goody9807 – 博客园.

这个插件在功能上来说是比较强大的了,但用起来却比较简单,对想做拖动布局的来说简直是福音。它不但可做到拖动布局,还能保存拖动后的布局,也封装了和拖 动布局相关的一些操作,比如折叠,隐藏拖动块,编辑等。闲话少说,还是看看怎么用吧!
首先当然是引入相关的js文件:
JQuery.min.js  jq框架
JQuery-ui.min.js jq的ui
JQuery.easywidgets.js  插件文件
接着写初始的布局代码:

程序代码 程序代码
<div id=”top”>头部</div>
<div id=”main”>
<div class=”widget-place column1″>
<div class=”widget”>
<div class=”widget-header”> <strong>可以拖动</strong> </div>
<div class=”widget-content”>可以拖动布局的内容</div>
</div>

<div class=”widget”>
<div class=”widget-header”> <strong>可以拖动</strong> </div>
<div class=”widget-content”> 可以拖动布局 可以拖动布局 可以拖动布局 可以拖动布局 可以拖动布局</div>
</div>
</div>

<div class=”widget-place column2″>
<div class=”widget”>
<div class=”widget-header c2_1″> <strong>可以拖动有样式</strong> </div>
<div class=”widget-content”> 可以拖动布局 可以拖动布局 可以拖动布局 可以拖动布局 可以拖动布局 可以拖动布局</div>
</div>

<div class=”widget”>
<div class=”widget-header”> <strong>可以拖动</strong> </div>
<div class=”widget-content”> 可以拖动布局 可以拖动布局 可以拖动布局 可以拖动布局 可以拖动布局</div>
</div>
</div>

<div class=”widget-place column3″>
<div class=”widget”>
<div class=”widget-header”> <strong>可以拖动</strong> </div>
<div class=”widget-content”> 可以拖动布局 可以拖动布局 可以拖动布局 可以拖动布局 可以拖动布局</div>
</div>

<div class=”widget”>
<div class=”widget-header”> <strong>可以拖动</strong> </div>
<div class=”widget-content”> 可以拖动布局 可以拖动布局 可以拖动布局 可以拖动布局</div>
</div>
</div>
<div style=”clear:both;”></div>
</div>

<div id=”bottom”>底部</div>

我 上面的代码是三列的布局,每列有两个拖动块。看看,是不是很有规律??<div class=”widget-place”>…</div>就是一列,而<div class=”widget”>…</div>就是一个拖动块,<div id=”widget-header”></div>就是拖动手柄,就是鼠标按在这里可以拖动,结构就这么简单,至于列的class属 性值column1,column2,column3是为了让你区别每一列的,当然也是为了写css,这些你可以随便取,至于其他用来美化布局的样式你可 以自己根据需要添加,比如上面的我在拖动手柄上添加的c2_1。
要实现三列,少不了css

程序代码 程序代码
<style type=”text/css”>
body{
margin:0px;
font-size:12px;
}
#top,#main,#bottom{
margin:0px auto;
width:960px;
border:1px solid #CC6666;
}
#top{
height:100px;
margin-bottom:5px;
}
#main{
padding:5px 0px 5px 0px;
}
#bottom{
height:50px;
margin-top:5px;
}

#main .widget-place{
float:left;
width:310px;
/*拖动块的高度是一定要的
不然当你把一列的所有可拖动
的块东拖到其他列的时候会有
问题,这个你可以根据具体情
况设置*/
height:auto;
min-height:200px;
/*height:400px;*/
}
#main .column1{
margin-left:4px;
}
#main .column2{
margin-left:5px;
margin-right:5px;
}
#main .widget{
border:1px solid #CC99CC;
margin-bottom:5px;
}
#main .widget-header{
line-height:25px;
}
.c2_1{
divne-height:30px;
background:#999966;
}
/*这个是拖动的时候用来占位的样式*/
.widget-placeholder {
border:1px dashed #FF99CC;
}
</style>

最后,就是用这个插件了:

程序代码 程序代码
$(document).ready(function(){
$.fn.EasyWidgets();
});

看看效果

呵呵!是不是不能拖动??不用急,你只要给可拖动块的class属性增加一个值movable就得了,也就是把
<div class=”widget”>…</div>变为<div class=”widget movable”>…</div>。
好了,再看看效果。拖动演示

怎 么样,一个拖动效果就这样搞定了!现在看看怎么实现拖动的其他操作。其实也很简单,不需要任何js代码!你只要给可拖动块的class属性增加一个值 collapsable就可以实现折叠,增加一个值removable就可以实现隐藏折叠块,增加一个值editable就可以实现编辑。当然若可以编辑 你当然要给一个装编辑内容的容器。看看下面的修改后的代码:

程序代码 程序代码
<div class=”widget movable collapsable removable editable”>
<div class=”widget-header”> <strong>可以拖动</strong> </div>
<div class=”widget-editbox” style=”background:#CC6699″>
这里就是放编辑的内容,为了显眼,我加了背景
</div>
<div class=”widget-content”> 可以拖动布局 可以拖动布局 可以拖动布局 可以拖动布局 可以拖动布局</div>
</div

为了使拖动块的内容初始是折叠的,你还可以给可拖动块的class属性增加一个值collapse。

演示效果

这些文字是因为的,能不能变成汉字呢??当然能,作者已经考虑到这个问题了。只要给js增加几个参数就可以了:

程序代码 程序代码
$(document).ready(function(){
$.fn.EasyWidgets({
i18n : {
editText : ‘编辑’,
closeText : ‘关闭’,
extendText : ‘展开’,
collapseText : ‘折叠’,
cancelEditText : ‘取消’
}
});
});

演示效果

就说这些基本的了,还有太多的功能就靠自己去研究了,比如拖动时实现一些效果,把“编辑”,“关闭”用图片代替,点击“编辑”,“关闭”等回调一些函数等 等。

最后说说怎么保存拖动后的布局。
你 要把每一列增加一个id属性:第一列id=”widget-place-1″,第二列id=”widget-place-2″,一次类推,把每一个拖动块 也增加一个id属性:第一个拖动块id=”identifierwidget-1″,第二个拖动块id=”identifierwidget-2″,以此 类推,至于哪个是第一个拖动块,哪个是第二个拖动块,你可以随意自己取,没有什么顺序,最后就是设置一个参数就可以了:

程序代码 程序代码
$(document).ready(function(){
$.fn.EasyWidgets({
//这个就可以保存布局了
behaviour : {
useCookies : true
},
i18n : {
editText : ‘编辑’,
closeText : ‘关闭’,
extendText : ‘展开’,
collapseText : ‘折叠’,
cancelEditText : ‘取消’
}
});
});

保存布局演示
最后提供原始文件下载

[转载]最棒的10款MySQLGUI工具

mikel阅读(1166)

[转载]最棒的10款MySQL GUI工具 – 数据库 – JavaEye新闻.

绝大多数的关系数据库都明显不同于MS Access,它们都有两个截然不同的部分:后端作为数据仓库,前端作为用于数据组件通信的用户界面。这种设计非常巧妙,它并行处理两层编程模型,将数据层从用户界面中分离出来,同时运行数据库软件制造商专注于它们的产品强项:数据存储和管理。它同时为第三方创建大量的应用程序提供了便利,使各种数据库间的交互性更强。这类产品包括Embarcadero Rapid SQL和Oracle SQL Developer。这里有十款优秀的MySQL图形化界面。
1. Workbench

制造商:Sun Systems/Oracle
网站:http://dev.mysql.com/downloads/workbench/
价格:免费
许可证:GPL License
支持平台:Microsoft Windows,Mac OS X,Linux

MySQL Workbench是一款图形化的数据库设计工具,它在一个开发环境中集成了SQL的开发,管理,数据库设计,创建以及维护。它是 fabFORCE.net旗下DBDesigner 4的继承者,并替代了MySQL GUI Tools Bundle。当前版本是5.2,最早版本是5.0,这是为了强调MySQL Workbench是作为DBDesigner4的继承者被开发出来的事实。
2. Navicat

制造商:PremiumSoft ™ CyberTech Ltd.
网站:http://www.navicat.com/en/products/navicat_mysql/mysql_overview.html
价格:如下所示:
Windows Edition ( Non-Commercial ) US $209 (disk)
US $199 (download)
Windows Edition US $379 (disk)
US $369 (download)
Mac OS X Edition ( Non-Commercial ) US $209 (disk)
US $199 (download)
Mac OS X Edition US $329 (disk)
US $319 (download)
Linux Edition ( Non-Commercial ) US $189 (disk)
US $179 (download)
Linux Edition US $329 (disk)
US $319 (download)

配有30天试用版。
许可证:Commercial 或 Non-commercial licenses.
支持平台:Microsoft Windows,Mac OS X,Linux

用于MySQL的Navicat既是一个数据库管理器同时还是一个开发工具。它适用于从3.21以上的任何MySQL数据库服务器,并且支持包括触发器,存储过程,函数,事件,预览和用户管理在内的绝大多数最新的MySQL功能。

Navicat的功能非常复杂,足以满足专业开发人员的各种特殊需求,同时对于MySQL新手来说也非常简单易学。
3. Sequel Pro

制造商:The Sequel Pro Project(开源)
网站:http://www.sequelpro.com/
价格:免费(接受通过PayPal的捐赠)
许可证:GNU GPL 2.0
支持平台:Mac OS X Tiger Universal Build

Sequel Pro是一款免费的开源程序。它是CocoaMySQL Mac数据库管理程序的继承者。CocoaMySQL是Lorenz Textor的新构想,他是CocoaMySQL的早期的(2003年)主要开发人员。

Sequel Pro用于管理MySQL数据库(本地或在Internet上)。您可以使用它来添加删除数据库和表,修改字段和索引,预览和过滤表的内容,添加编辑删除行,执行自定义查询,转储表或整个数据库。

它兼容MySQL 3.x,4,5。
4. HeidiSQL

制造商:Ansgar Becker
网站:http://www.heidisql.com/
价格:免费(接受通过PayPal的捐赠)
许可证:GNU General Public License
支持平台:Windows 2000,XP,Vista,7(可通过Wine运行于任何Linux之上)

之前被称为MySQL-Front的HeidiSQL是一款免费的开源客户端,由德国程序员Ansgar Becker开发,同时还得到了一些Delphi贡献者的帮助。用户必须通过许可证书创建一个会话登陆本地或远程MySQL服务器,才可以使用 HeidiSQL管理数据库。通过这个会话,用户可以管理所链接的MySQL服务器的MySQL数据库,并在完成之后断开。它的功能集足够应付绝大多数常见和高级数据库,表,数据记录选项,但是目前还处于积极的开发中,以求能实现MySQL前端的所有功能。

另外还有一款由Java编写的jHeidi,它被设计用于Mac和Linux计算机。遗憾的是,该项目已于2010年3月终止了。
5. phpMyAdmin

制造商:The phpMyAdmin Project (on Sourceforge)
网站:http://www.phpmyadmin.net/home_page/
价格:免费(接受通过PayPal的捐赠)
许可证:GNU General Public License, version 2
支持平台:Microsoft Windows,Mac OS X,Linux,PHP 4 – 5,MySQL 3 – 5

PhpMyAdmin是一款免费的软件工具,采用PHP编写,用于在线处理MySQL管理。PhpMyAdmin支持多种MySQL操作,最常用的操作包括管理数据库,表,字段,关系,索引,用户,权限。同时还允许您直接执行SQL语句。

Tobias Ratschiller曾经是IT顾问,后来创建了Maguma软件公司。由于受到Peter Kuppelwieser开发的MySQL-Webadmin的影响,于1998年开始了基于PHP的MySQL的web前端开发。因时间不足,他与 2000年放弃了该项目(以及同样有他开发的phpAdsNew)。就在那时,phpMyAdmin已成为最受欢迎的PHP程序和MySQL管理工具之一,它拥有广泛的社区用户和贡献者。为了协调越来越多的补丁,Olivier Müller,Marc Delisle以及Loïc Chapeaux三位开发人员在注册 SourceForge.net注册了phpMyAdmin项目,并于2001年接手开发工作。
6. SQL Maestro MySQL Tools Family

制造商:SQL Maestro Group
网站:http://www.sqlmaestro.com/products/mysql/
价格:范围从$99的非商业程序到$1949的MySQL Admin Tools Bundle,其中包括完整的网站商业许可证外加3年升级。捆绑包中包括了SQL Maestro,Data Wizard,Code Factory,Service Center以及PHP Generator Pro。
许可证:全范围支持从单独的非商业到附带3年免费升级的站点商业许可证
支持平台:Windows 2000,XP,Vista,7

SQL Maestro Group提供了完整的数据库管理,开发和管理工具,适用于所有主流DBMS。通过GUI界面,您可以执行查询和SQL脚本,管理用户以及他们的特权,导入,导出到处和数据备份。同时,您还可以为所选定的表以及查询生成PHP脚本,并转移任何ADO兼容数据库到MySQL数据库。

捆绑包中包括:

SQL Maestro for MySQL
专业的MySQL GUI管理工具,支持所有最新的MySQL 5.0和5.1。功能包括预览,过程,触发器和表分区。

Data Wizard for MySQL
MySQL的转储,以及数据导出/导入工具等。

Code Factory for MySQL
用于编辑SQL脚本和创建SQL语句的可视化工具集。

Service Center for MySQL
用于MySQL服务器维护。

PHP Generator for MySQL
生成高性能MySQL PHP脚本。配有免费版本。
7. SQLWave

制造商:Nerocode
网站:http://www.nerocode.com/
价格:$99.00
许可证:shareware。查看http://www.nerocode.com/license.txt以获得更多相关信息。
支持平台:Windows 2000,XP,Vista,7

Nerocode SQLWave是一款MySQL GUI客户端工具,被设计用来自动化和简化数据库的开发进程。它同时还提供了更简便的方法来开拓和维护现有数据库,以及不同方式来设计复杂SQL语句,查询和数据操作。兼容MySQL 4.x – 6.x。

配有30天试用版。
8. dbForge Studio

制造商:devart
网站:http://www.devart.com/dbforge/mysql/studio/
价格:免费的Express版,$49.95(非商业标准版),$99.99(非商业专业版)。
许可证:商业和非商业许可证。提供订阅这一高效快速的方法来实现产品升级和技术支持。
支持平台:Windows 2000,XP,Vista,7

用于MySQL的DbForge Studio提供了图形化的MySQL开发和管理。

有三个版本:Express,Standard,Professional。

Express是免费应用程序,提供用于架构对象,用户账户,SQL脚本和查询的基本功能。

Standard为数据库管理员和开发者提供了附加工具,比如Debugger,Query Builder,代码模板,对象检索,各种输出和维护向导。

Professional是全功能版本并添加了以下设计:数据库项目,对数据库结构(架构比较)或数据库内容(数据比较)进行准确的比较和同步,调试已存储的过程和脚本,创建复杂查询。

dbForge的其他工具包括:

Schema Compare for MySQL

Data Compare for MySQL

Query Builder for MySQL

Fusion for MySQL
9. DBTools Manager

制造商:DBTools Software
网站:http://www.dbtools.com.br/EN/dbmanagerpro/
价格:标准版免费。单一授权的企业版为$69.90 USD。Discounts版适用于所中许可证。
许可:标准版授权于标准免费软件条件。企业版授权于销售单位。
支持平台:Windows 2000,XP,Vista,7

标准版
特别为个人使用设计,它配备最低限功能,适用于数据库新手执行基本的数据库管理。您可以在非商业的前提下免费使用它。如果用于商业使用,您可以购买授权,同时还将提供额外功能。

企业版
特别为企业使用设计,它更适用于那些寻找集成化数据库管理程序的DBA和开发人员。购买前,您可以先试用。企业版的试用版是全功能的,您有20天的时间进行所有的尝试,同时基于完整的体验来决定是否购买。

同时支持MySQL 3,4,5。
10. MyDB Studio

制造商:H2LSoft, Inc.
网站:http://www.mydb-studio.com/
价格:免费
授权:免费软件
支持平台:Windows 2000,XP,Vista,7

MyDB Studio包含了用于MySQL服务器管理的完整工具集。它可用于创建/编辑/放弃数据库对象,数据库同步,以及数据导出/导入。数据库管理员还可以用它来执行数据库转移,以及备份和还原。它支持使用SSH隧道来保护您的链接,即便您的主机不允许远程访问链接,用户和权限管理,以及PHP脚本创建,您依然可以进行连接。
————————-
查看原文:Top 10 MySQL GUI Tools

[转载]收集wap建站系统程序和工具或wap建站公司网站

mikel阅读(1297)

[转载]收集wap建站系统程序和工具或wap建站公司网站 = 飞龙博客 飞龙在天.

本日志飞龙用来收集手机wap建站系统、wap cms代码程序,wap 浏览工具、或提供wap建站服务的公司。更新地址:http://feilong.org/wap-cms-mobi 飞龙不定期修订。这是飞龙第3次修订20090520。欢迎常回来看看。

一 手机wap站点自助建站系统或站点

1. 手机版博客服务:Swiftmob。
利用Swiftmob制作你的博客网站的手机浏览版本,不过用的是他们的二级域名。参考效果:http://feilong.swiftmob.com(我 的用户名:feilongorg)

通过Swiftmob制作手机版wap网站很简单:注册Swiftmob–选择二级域名–对网页进行定制,添加网页元素,增加网页Logo,增 加RSS源,定制网页显示效果等。此外Swiftmob还提供网页浏览的统计功能,可以查看访客通过手机浏览你网页的情况。更多提供wap建站服务的网站 参见本链接:http://feilong.org/wap-cms-mobi

2. 手机wap站点RSS烧制服务站点:Wirenode。
Wirenode提供手机RSS烧制服务,只要你的博客有rss功能,他就可以把你的博客转为可供手机浏览的wap博客。官方站点:http://www.wirenode.com ,参考效果地址: http://feilong.wirenode.mobi (用户名 feilong)

其实提供类似博客wap版本服务的网站还有:http://feilong.Mofuse.mobi、 http://feilong.Feedm8.com 。但飞龙测试后觉得Wirenode服务更简洁直观,并提供个性化定制。只需在Wirenode站点的首页输入你的网址,Wirenode就会自动检测你 的网站或博客默认的RSS订阅地址。你也可以手动输入你的rss订阅地址。这样会生成一个Wirenode二级域名的手机浏览效果。

Wirenode定制性好,提供多种Theme主题,另外在输出显示中可以有一个”Add Component”功能,也就是在手机RSS输出页面的底部加入一些个性化内容Widgets,比如文字、图片、链接,甚至是直接拨打你手机号码的某种 链接。还有一些个性化Widgets,比如RSS内容显示、时钟显示、手机留言,发送消息到你的Email

3. rss烧录手机博客服务站点:mofuse

飞龙找到这么个工具性站点,外国wap技术牛人mofuse做的。先看看手机版博客效果:http://feilong.mofuse.mobi (用户邮箱jiaju99 雅虎cn邮箱)。是不是觉得很有意思?不知道手机真看不看的了?

这个网站提供博客转手机版服务,原理是调用你博客rss地址,前提是你的博客符合国际网站建设标准,也就 是:xhtml+div+css+dom+rss,其中大家最熟知是div+css。有专门文章具体介绍mofuse rss烧录手机博客服务:http://feilong.org/feilong-mofuse-mobi-feilong-org-wap-rss

二 手机wap建站系统
飞龙找到一个wap建站系统完全免费版,前台+后台+完全免费+无功能限制!测试版可以自由传播,但不可商用。ASP+ACCESS ;解压密码:wapforum.cn ;QQ:13431619 。官方站点是wapforum.cn 可惜打不开。演示站点是wapdemo.cn也打不开了。 http://www.cncode.com/downinfo/10363.htmlhttp://www.downcodes.com/SoftView/SoftView_2581.html

三、相关wap建站教程:
手把手教你用asp开发wap网站电子书 WapEBook
wap超级入门 WapBase
http://www.zychina.com.cn/code/2108.html
http://www.jzxue.com/down/website/2007/8/16271GC971.html
用ASP编写WAP程序教程的源代码 wapsite
http://www.docin.com/p-6147309.html

wap手机建站精华资料:
http://feilong.org/category/internet/wap
http://www.wapwo.net/showtopic-314.aspx
http://down.cnzz.cn/info/44838.aspx
http://tieba.baidu.com/f?kw=wap

四、更多wap免费或收费建站系统或公司。有意请与飞龙合作。
http://www.gzhaha.com/web/
http://www.sh-web.cn/
http://wapjz.yo2.cn/
http://www.wapzj.com/down/35/39/html/2008030714011628.html
http://www.wapeq.com/html/system.html

http://www.wap2go.co.uk/
http://wapcms.com
http://www.sharewareconnection.com/titles/wap-cms.htm
http://www.allworldsoft.com/software/18-010-rj-wap-manager.htm
http://www.hotscripts.com/category/php/scripts-programs/wap-wml

http://www.cn9sky.net/
http://www.stylusstudio.com/xmldev/200002/post10340.html
WAP多用户建站平台收费:http://www.3gex.cn/
http://www.zychina.com.cn/code/9473.html
http://www.bxhwl.cn/yuanm/5135.html

http://www.newasp.net/code/dl026803.html
http://www.dai-ma.com/code/asp/qita/103208714623.html
http://www.kukuwap.com/
http://www.wap.mobi
http://www.kelink.com/ 85403498/504730723 85403498

www.caiwap.com
www.yywap.com
http://www.wap588.com/
http://www.winu.cn/htmls/481/040/
http://diy.hucn.net/

http://demo.51aiqi.com/
http://www.wiipu.com/wiiSite_intro.asp
http://test.3gair.com
http://www.wkoo.cn/index.asp
http://wapwko.com/admin/login.asp

waper.cn
http://www.wei2008.com/code/softdown.asp?softid=9803
蛙派wap建站系统:QQ:847976,QQ群:217785(已满) 11725498(已满) 11726447
www.wapmo.cn
www.caiwap.com
http://wap.3gmf.net/index.asp
http://www.xtox.cn/XTOX_tx.html

http://www.wapsok.com/aboutSite.jsp
http://www.qzkk.com/index.html
http://dgwindow.com/index_dg.asp
http://wap.nokiaznw.cn/index.asp
http://eppuser.blog.xunlei.com/category_1473.html

http://www.pudn.com/downloads139/sourcecode/comm/detail596674.html
http://mfxz8.com/admin/login.asp
http://www.soucode.com/code/Catalog13/42/code_12948.html
http://www.yqmedia.com/site_wapsite.do
http://www.w-ap.cn/index.asp
http://www.zaoxue.com/down/code-155787.htm
http://www.cnwzz.net/code/12/200901/11-1696.html
http://www.wapmo.cn/

五、wap建站赚钱资讯:
据几位盈利较高的站长的亲身体验和测试发现:乐游传媒的点击和游戏软件分成广告、蛙盟的点击广告、魅媒联盟IVR和视频分成广告等目前效果都比较不错。 wap在线词典有吗?

六 wap手机模拟器推荐
即手机网站需要用手机登录或者模拟器访问。模拟器我们推荐OPera,或泡泡通wap浏览器。更多wap手机模拟器,参考:http://feilong.org/wap-site-browers

七 联系交流:
联系QQ: 13431619,44459416,82890065
QQ交流群: 8684529,36508170

博主:飞龙.org
链接:http://feilong.org/wap-cms-mobi
网络资料,朋友共享,http://feilong.org 可加入收藏夹

[转载] Face.com 开放 API

mikel阅读(1231)

[转载]Dreamer’s Blog » Face.com 开放 API.

哈哈,发现一个很好玩的东西:Atuo Smiley 。它是一个运行在后台的程序,功能很简单,就是当它通过摄像头检测到你在笑的时候自动打出一个 🙂 出来。这个程序可以让你方便地在邮件中加入笑脸,还可以强制你在和别人聊天的时候保持诚实!不能明明很开心却强忍住笑耍别人,那样是不对的!

演示 Demo (是 vimeo 的视频,需翻墙)

另外,这个东西是开源的,有兴趣的可以去研究一下源码。

程序和源码下载请去原文查看

UPDATE:这个程序好像只支持 Mac OS, 之前没注意,不好意思。

[转载]asp.net页面出错时的处理方法

mikel阅读(955)

[转载]asp.net页面出错时的处理方法 – 总想拥有自己的天空 – 博客园.

1.第一种做法,在Web.config文件配置

<system.web>
<customErrors defaultRedirect=~/ErrorPage.aspx
mode
=RemoteOnly>
</customErrors>
</system.web>

defaultRedirect属性用来指明当aspx页面发生了未处理错误时导向的页面; 但ASP.NET使用重定向机制来重新导航错误页面,这样错误信息就会丢失,也就是说我们用 Server.GetLastError()获得的Exception对象始终是空的。虽然可以提示用户出错,并提供一个返回出错页面的链接,却不能给管 理员一个很好的错误提示。

2.第二种做法:在global文件里的 Application_Error方法中处理

代码

然后在ErrorPage.aspx页面显示一些好友的提示信息.

3.第三种做法:在Page_Error事件里面处理

代码

我经常的做法是使用第二种方法,然后再写一个发送短信的方法(调用移动的短信借口),这样的话程序出错的时候,管理员可以收到程序出错的信息。

[转载]C#调用新浪微博API生成RSS资源文件

mikel阅读(1179)

[转载]C#调用新浪微博API生成RSS资源文件 – 一点一滴的Beer – 博客园.

C#调用新浪微博API生成RSS资源文件

作者:一点一滴的Beer 个人主页:http://beer.cnblogs.com

新浪微博现在好像势头很猛,很多人在创立自己的微博客的时候,开始出于好奇,都会跟随很多人,久而久之,自己的好友人数超过100后,那么你就发 现,你已经完全淹没在信息的洪流中了,你跟随了那么多人,很多人都是今后可能永远都不会想起,也永远也不会看到的人,这显然与“关注”的目的是相背的,更 有时候可能你只是想看下你认识的人的消息更新了没有,但是显然你不可能每次都一个个到自己的关注人物表中点开然后再一一访问他的主页,这样操作太繁琐了。

用过RSS阅读器的用户可能都体会到RSS阅读器在获取信息的优越性了吧。它能实时跟踪RSS资源的更新,并显示更新数目到指定的订阅资源后面,可 以让用户有针对性地查看信息,让用户主动地去获取信息,而不再是被动地接受信息了,这对于解决微博的“信息洪流”问题是很有效的。

笔者花费了几天时间,终于写了一个程序,用于获取指定用户的好友,并存储备份到ACCESS数据库中,然后生成一个RSS阅读资源。不敢独享,所以 开源和大家分享。今后如果有时间,我想再将它做成一个桌面软件,方便一般不懂程序的用户来操作,这都是后话了吧。

1. 新浪微博RSS订阅第三方网站

新浪微博本身没有提供RSS订阅,但是到网上搜索,发现了一个第三方的网站,提供新浪微博的RSS资源,所以,本文的RSS订阅说白了都是基于这个 第三方网站的。

http://log.medcl.net/item/2010/02/sina-bo-rss-subscribe-feed-generate-micro/

2. 网上通用的OPML文件的XML格 式

下面是从Google Reader中导出的opml文件,这是网络RSS阅读器甚至所有RSS阅读器的标准格式吧,至少“鲜果”,“有道”这些比较流行的在线阅读器都支持这个 格式的文件导入。

<?xml version="1.0" encoding="UTF-8"?>
<opml version="1.0">
	<head>
		<title>subscriptions</title>
		<dateCreated>2010-05-16 15:45:03</dateCreated>
		<ownerName></ownerName>
	</head>
	<body>
		<outline text="微博客" title="微博客">			
			<outline text="冷笑话(1567852087)" 
				title="冷笑话(1567852087)" type="rss"
				htmlUrl="http://t.sina.com.cn/1567852087" 
				xmlUrl="http://medcl.net/SinaRss.aspx?uid=1567852087" />
			<outline text="后宫优雅(1665289110)" 
				title="后宫优雅(1665289110)" type="rss"
				htmlUrl="http://t.sina.com.cn/1665289110" 
				xmlUrl="http://medcl.net/SinaRss.aspx?uid=1665289110" />
			<outline text="围脖经典语录" 
				title="围脖经典语录" type="rss"
				htmlUrl="http://t.sina.com.cn/1646465281" 
				xmlUrl="http://medcl.net/SinaRss.aspx?uid=1646465281" />			
			<outline text="破阵子(1644022141)" 
				title="破阵子(1644022141)" type="rss"
				htmlUrl="http://t.sina.com.cn/1644022141" 
				xmlUrl="http://medcl.net/SinaRss.aspx?uid=1644022141" />			
		</outline>
		<outline text="珞珈山水" title="珞珈山水">			
			<outline text="今日十大热门话题" 
				title="今日十大热门话题" type="rss"
				htmlUrl="http://bbs.whu.edu.cn/frames.html" 
				xmlUrl="http://bbs.whu.edu.cn/rssi.php?h=1" />			
			<outline text="贴图版" 
				title="贴图版" type="rss"
				htmlUrl="http://bbs.whu.edu.cn/wForum/board.php?name=Picture" 
				xmlUrl="http://bbs.whu.edu.cn/wForum/rss.php?board=Picture&amp;ic=1" />
		</outline>
	</body>
</opml>

分析OPML文件的架构,然后方便通过程序来将它需要的信息写成此架构的文件,便于阅读器引用。 OPML文件由头部标签<head>(主要是本文件的一些注释,不影响实际的RSS订阅信息,不是太重要)和<body> (RSS阅读器提取订阅资源的全部数据来源)。在<body>节点下面有个一级的<outline>节点,这个节点对应RSS阅 读器中地RSS资源的分类文件夹相关信息(显然text表示的就是文件夹名称),然后一级<outline>下面就是二级 的<outline>标签对,这里面就是RSS资源的相关数据内容了。二级<outline>中的节点的一些重要属性:text 表示资源的标题,htmlUrl表示的是信息的的Web网页地址,xmlUrl表示的是信息的RSS订阅地址。

3. 新浪微博API――从服务器上导出用户好友数据到本 地XML文件

关于新浪微博API的详细介绍,可以参考新浪微博API官方网站:

http://open.t.sina.com.cn /wiki/index.php/首页

关于身份认证和数据请求,请参考cnblogs:

《.NET调用新浪微博开放平台接口的代码示例》

http://www.cnblogs.com/cmt/archive/2010/05/13/1733904.html

下面是自己整理的代码,从服务器上请求用户的好友信息:

private void getFriends()
        {

            int previous_cursor=-1;
            int next_cursor = -1;

            while (next_cursor != 0)
            {
                string cursor = Convert.ToString(previous_cursor);
                string url = " http://api.t.sina.com.cn/statuses/friends.xml?source=AppKey&cursor=" + cursor;
                string username = "dreamzsm@gmail.com";
                string password = name; //这里输入你自己微博登录的的密码
                //注意这里的格式哦,为 "username:password"

                System.Net.WebRequest webRequest = System.Net.WebRequest.Create(url);
                System.Net.HttpWebRequest myReq = webRequest as System.Net.HttpWebRequest;

                //身份验证
                string usernamePassword = username + ":" + password;
                CredentialCache mycache = new CredentialCache();
                mycache.Add(new Uri(url), "Basic", new NetworkCredential(username, password));
                myReq.Credentials = mycache;
                myReq.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(new ASCIIEncoding().GetBytes(usernamePassword)));

                WebResponse wr = myReq.GetResponse();
                Stream receiveStream = wr.GetResponseStream();
                StreamReader reader = new StreamReader(receiveStream, Encoding.UTF8);
                string content = reader.ReadToEnd();


                XmlDocument xmlDoc = new XmlDocument();

                xmlDoc.LoadXml(content);
                // xmlDoc.Load("data1.xml");

                XmlNodeList nodeList = xmlDoc.SelectSingleNode("users").ChildNodes;//获取根节点的所有子节点

                next_cursor = Convert.ToInt16(nodeList.Item(nodeList.Count - 2).InnerText);
                previous_cursor = Convert.ToInt16(nodeList.Item(nodeList.Count-1).InnerText);



                string xmlName = "friends_" + nodeList.Item(nodeList.Count - 1).InnerText + "_" + Convert.ToInt16(nodeList.Item(nodeList.Count - 2).InnerText) + ".xml";
                previous_cursor = next_cursor;

                xmlDoc.Save(xmlName);

            }

          

        }

为了程序设计简单一点,笔者就有点偷懒了,没有仔细研究如何将所有的数据写到一个XML文件中,而是每次请求得到的20条数据写成一个XML文件, 最后我159个好友,按照指定的命名方法生成了8个XML文件。

clip_image002

如此,就得到了所有的你的好友(就是你跟随的人)的信息了,以单人为例,其主要信息如下:

<user>
    <id>1710993410</id>
    <screen_name>某丫大人</screen_name>
    <name>某丫大人</name>
    <province>43</province>
    <city>1</city>
    <location>湖南 长沙</location>
    <description>饭否儿,心朝饭否,春暖花开。 我还是@饿YA 我还真是懒得介绍了。</description>
    <url>http://1</url>
    <profile_image_url>http://tp3.sinaimg.cn/1710993410/50/1273755892</profile_image_url>
    <domain>
    </domain>
    <gender>f</gender>
    <followers_count>168</followers_count>
    <friends_count>79</friends_count>
    <statuses_count>846</statuses_count>
    <favourites_count>0</favourites_count>
    <created_at>Sun Mar 14 00:00:00 +0800 2010</created_at>
    <following>false</following>
    <verified>false</verified>
    <allow_all_act_msg>false</allow_all_act_msg>
    <geo_enabled>false</geo_enabled>
    <status>
      <created_at>Sun May 16 21:02:44 +0800 2010</created_at>
      <id>364379114</id>
      <text>烦死了快、</text>
      <source>
        <a href="">新浪微博</a>
      </source>
      <favorited>false</favorited>
      <truncated>false</truncated>
      <geo />
      <in_reply_to_status_id>
      </in_reply_to_status_id>
      <in_reply_to_user_id>
      </in_reply_to_user_id>
      <in_reply_to_screen_name>
      </in_reply_to_screen_name>
    </status>
  </user>

可以看到这里面的信息量是超级多的,我简单介绍下几个主要的节点吧

id 用户新浪微博的数字ID,就像你的QQ号一样
name 用户昵称
province 省代号
city 市代号
location 所在省市(好像和上面两个节点重复了)
description 自我描述
domain 域名,就是除了数字ID后,用户申请的修改域名
gender 性别。男的是Male,女的是Female.
followers_count 粉丝数
friends_count 跟随的人数
statuses_count 发表的状态也就是微博数
favourites_count 收藏微博数目吧?(不知道这个有什么用)
created_at 用户创建此微博客的时间
verified 是否经过新浪的VIP认证
status 用户最近的一次状态

除了user信息外,还有一些其它信息,比如根节点下的next_cursor和previous_cousor,这方便用户分多次到服务器上请求 数据时可以此作为定位依据。

<next_cursor>20</next_cursor>

<previous_cursor>0</previous_cursor>

4. 将XML文件存储到ACCESS数 据库中进行备份

如果不想备份的可以直接从第3步中到第5步,但是笔者,觉得将数据转换成此构架后,更加方便后来的程序操作以及浏览数据。

关于XML的详细方法参考:小气的鬼

在 C#.net中如何操作XML

http://www.cnblogs.com/weekzero/archive/2005/06/21/178140.html

下面开始读取刚才从新浪微博服务器上请求得到的XML文件了。然后转换成ACCESS数据库内容。(当然你要先用ACCESS在指定目录下建立一 个*.mdb文件用来存储数据)

下面是对单个XML文件进行读取,并插入到数据库中(这段代码是在ASP.NET中写的)

 public void readTsinaFriends(string fileName)
    {
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load(Server.MapPath(fileName));  

       XmlNodeList nodeList = xmlDoc.SelectSingleNode("users").ChildNodes;//获取 根节点的所有子节点
       ;

        //删除不用的一级节点,比如提示人数的所在位置的标记
       XmlNode root = xmlDoc.SelectSingleNode("users");
     //  XmlNodeList xnl = xmlDoc.SelectSingleNode("Employees").ChildNodes;
       for (int k = 0; k < nodeList.Count; k++)
       {
           XmlElement xe = (XmlElement)nodeList.Item(k);
           if(xe.Name=="user")
           {//去掉XML文件中不需要的节点:next_cursor,previous_coursor以及user节点中的status,方便XML直接转换成DataTable
                XmlNodeList nodeList1 = xmlDoc.SelectNodes("users/user");//得到所有的标签user一级节点

                foreach (XmlNode xmlNodeTemp in nodeList1)
                {
                    if (xmlNodeTemp.LastChild.Name == "status")//移除每个user节点中的"status"子节点--(一般情况下此节点都放在最后一个,所以就不遍历了,直接地址定位)
                    {
                        xmlNodeTemp.RemoveChild(xmlNodeTemp.LastChild);
                    }                
                }
              
               
           }
           else if (xe.Name == "next_cursor" || xe.Name == "previous_cursor")
           {
               root.RemoveChild(xe);
               if (k < nodeList.Count) k = k - 1;
           }
       }



        string tbxml = xmlDoc.OuterXml;
        DataTable dt = new DataTable();

        DataSet ds = new DataSet();
        System.IO.StringReader reader = new System.IO.StringReader(tbxml);
        ds.ReadXml(reader);
        dt = ds.Tables[0];//如果XML文本中有同名的父子节点,那么此语句就会多读出一条数据,这可能是此API函数的局限性吧

        DataTable dtCopy = dt.Copy();
        //dtCopy.Columns.Remove("url");
        //dtCopy.Columns.Remove("profile_image_url");
        dtCopy.Columns.Remove("description"); //这个字段里面字符编码不太规则,在插入ACCESS的时候总有问题,而且用处不大,所以就去除了。(又偷懒了呃)


        DataRow drTemp = dtCopy.NewRow();
        string strInsert = string.Empty;

        OleDbConnection aConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\\coursware\\网络软文\\API_微波\\weibo.mdb");
        aConnection.Open();

        for (int i = 0; i < dtCopy.Rows.Count - 1; i++)
        {
            drTemp = dtCopy.Rows[i];
            strInsert = "'"+drTemp[0].ToString()+"','";
            for (int j = 1; j < dtCopy.Columns.Count - 1; j++)
            {
                strInsert += (drTemp[j].ToString() + "','");
            }
            strInsert += drTemp[dtCopy.Columns.Count - 1].ToString() + "'";
           
            string strCmd = "INSERT INTO Friends VALUES(" + strInsert + ")";

            
            OleDbCommand command = new
                OleDbCommand(strCmd, aConnection);
            command.ExecuteNonQuery();
        }
        aConnection.Close();
       
             
     
    }

对多个XML文件进行遍历,一个个导入到ACCESS数据库中:

 /// <summary>
    /// 将所有好友都导出了,然后存储在ACCESS数据库中了。
    /// </summary>
    public void readAllXml()
    {
        for (int i = 0; i < 8; i++)
        {
            string fileName = "friends_" + Convert.ToString(i * 20) + "_" + Convert.ToString(i*20+20)+".xml";//按照存储XML文件时的命名规则进行读取
            readTsinaFriends(fileName);
        }
    }

经过上面的操作后,你再打开你的ACCESS数据库文件weibo.mdb文件中对应的表,就可以看到所以的信息都已经导入到ACCESS中了。如 下图所示:

clip_image004

5. 对ACCESS数据库查询并写成RSS阅 读器的OPML格式

对于制作RSS阅读器的OPML格式,需要的数据只有两条字段:一个是id字段,一个是name字段。

这个过程实际上就是对数据进行XML编码的过程,啥都不说了,一切都在代码中了(也是在ASP.NET工程中写的):

/// <summary>
    /// 建立新浪微博的RSS文件
    /// </summary>
    public void CreateTsinaRssXmlFile()
    {

        OleDbConnection aConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\\coursware\\网络软文\\API_微波\\weibo.mdb");


        string strCmd = "select id as idnum,screen_name as name from Friends";
        //从ACCESS中获取数据
        aConnection.Open();
        OleDbDataAdapter da = new OleDbDataAdapter(strCmd, aConnection);
        DataSet ds = new DataSet();
        da.Fill(ds, "TSina");
        ds.DataSetName = "RssReader";
        DataTable dt = ds.Tables[0];//数据集的第0张表格


        XmlDocument xmldoc;

        XmlElement xmlelem;

        xmldoc = new XmlDocument();
        //加入XML的声明段落
        XmlDeclaration xmldecl;
        xmldecl = xmldoc.CreateXmlDeclaration("1.0", "UTF-8", null);
        xmldoc.AppendChild(xmldecl);

        //加入一个根元素
        xmlelem = xmldoc.CreateElement(" ", "opml", " ");
        xmldoc.AppendChild(xmlelem);

        XmlNode root = xmldoc.SelectSingleNode("opml");//查找<opml> 节点


        XmlElement xeHead = xmldoc.CreateElement("head");//创建一个<head>节点 
        //为head节点增加子节点
        XmlElement xeHeadsub = xmldoc.CreateElement("title");
        xeHeadsub.InnerText = "Rss Reader";//设置节点文本 
        xeHead.AppendChild(xeHeadsub);//添加到<head>子节点中 
        root.AppendChild(xeHead);//添加到<head>节点中 


        //增加body子节点,然后,将所有的RSS订阅信息全部写入到body节点中间
        XmlElement xeBody = xmldoc.CreateElement("body");
        root.AppendChild(xeBody);


        //第一层循环是标签(文件夹循环)由于本次只做一个标签,所以就只循环一次了

        //RSS的文件夹属性节点
        XmlElement xe1 = xmldoc.CreateElement("outline");
        xe1.SetAttribute("text", "Tsina");//设置该节点title属性
        xe1.SetAttribute("title", "Tsina");//设置该节点title属性 --第一层的outline节点的属性表示的是RSS的标签或者说是文件夹


        //下面就要开始为此文件夹节点添加下属子节点,也就是添加一些实质的RSS地址了
        string strTitle = string.Empty;
        string strText = string.Empty;
        string strXmlUrl = string.Empty;
        string strHtmlUrl = string.Empty;


        for (int i = 0; i < dt.Rows.Count; i++)
        {
            strTitle = dt.Rows[i]["NAME"].ToString().Trim();
            strText = strTitle;
            strXmlUrl = "http://medcl.net/SinaRss.aspx?uid=" + dt.Rows[i]["IDNum"].ToString().Trim();
            strHtmlUrl = "http://t.sina.com.cn/" + dt.Rows[i]["IDNum"].ToString().Trim();

            XmlElement xesub1 = xmldoc.CreateElement("outline");
            xesub1.SetAttribute("text", strText);//设置该节点title属性
            xesub1.SetAttribute("title", strTitle);//设置该节点title属性 --第一层的outline节点的属性表示的是RSS的标签或者说是文件夹
            xesub1.SetAttribute("type", "rss");
            xesub1.SetAttribute("xmlUrl", strXmlUrl);

            xesub1.SetAttribute("htmlUrl", strHtmlUrl);
            xe1.AppendChild(xesub1);//添加到<Node>节点中 
        }
        xeBody.AppendChild(xe1);


        //保存创建好的XML文档
        xmldoc.Save(Server.MapPath("RssReader.xml"));

    }

最后在指定的目录下,程序就自动生成了一个RssReader.xml的文件了。大功告成了!

clip_image006

然后将此文件就可以导入到任何一个RSS阅读器中了,用户就能够通过RSS阅读器来获取微博信息了,而且现在的RSS阅读器都有个一键转贴到微博的 功能,很方便的,不想转到自己微博的,也可以通过RSS阅读器直接收藏到阅读器中。辛苦了两天,今天能有这么一点小成果,还是觉得很不错的,呵呵,也祝大 家也能好运。本次代码比较还需要各种完善,比如,如何将所以的数据写成一个XML文件,这个笔者就暂时不做了,留给大家去做吧。

Rss阅读器效果图如下:

clip_image008

后记:新浪微博开放了API,从此新浪微博的可玩性就变强了很多了。写下本文主要是为了抛砖引玉,其实还有很多其它功能笔者想实现,但现在因为毕业 在即,还要忙毕业设计,所以希望大家可以试试,比如利用API来备份用户发的微博等等。

最后也写上本人的微博地址吧,如果有何指教,请留言:http://t.sina.com.cn/fly4u

———————————————–

Author:一点一滴的Beer

Email /Gtalk:dreamzsm@gmail.com

From:http://www.cnblogs.com/beer

Notes:欢迎转贴,但请在页面中加个链接注明出处,就当是对作者的一点小鼓励吧^_^

Time:2010-5-17

作者:一点一滴的Beer
出处:http://www.cnblogs.com/beer/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,请尊重作者的劳动成果。

[转载]程序员这碗饭

mikel阅读(1197)

[转载]程序员这碗饭 – Lau Yee .Net – 博客园.

出来混,无非为一个“钱”。

别给我强调你有多么的喜欢这个行业,有多么的喜欢写代码,有多么的喜欢钻研新的技术。做为一个深爱技术的老程序员,我和你一样。但浅意识里你衡量最多的还 是那个字。

已经有太多的人被忽悠近来(强烈鄙视略质培训机构),如果你近来看这篇文 章,我很不幸的告诉你,你也认为这碗饭不好吃了。你是否幻想过,有诏一天你能写出一个伟大的作品、某一天你会成为一个行业专家、某一天一回是一个领域的顶 尖高手,受万人景仰,靠此腰缠万贯。但现在你开始怀疑了。也许你比我看得开点,做这行只是因为待遇还可以,还能混口饭吃。我猜你是第一种,你肯定是那种喜 欢思考的程序员。因为混很容易,但是要混得出色,就必须要思考。令我矛盾的是这两种想法我都有。我只能极力的不将自己归为混日子的那种。你也认为应该坚持 吗?

时不如前,人一天天的老去,一天瞎忙火,却始终不明白为什么?

人总要为自己考虑。以前花费了太多的时间沉迷于技术,宁愿去做苦力而不是去享受温柔。也能这是我的最求,但却不是我最求的生活?我本末倒置,忘了实现美好 生活和实现人生价值的等级。

说起来真是老不如新,大多新人都很清楚自己在做什么,他们有理想有盲目的职业规划,但这感觉很好。他们会幻想他们的职业生涯。什么软件开发、项目管理、系 统设计是很美好的,有那一车一车的书教他们应该怎么去做。他们知道只要把这些东西看完、熟悉了他们便是专家高手。直到他们产生怀疑,直到他们发现教他们的 人其实比他们还迷茫。到那时他便也成了老人了。为什么现在我们放慢了我们的脚步,不再像以前一样执著、有朝气。

我们不期待已此改变人生,只希望活得滋润一些,爽一些。在翻开很久前的计划,在里面加上“钱”,根据实际情况,从新的制定,认真地执行它。

有些前辈们教导我们不可沉湎于技术,如果你的心思全部放在这上面,那么注定你将成为孔乙己一类的人物!除非你愿意60岁还在写代码。呵呵,就我来说,事实 上我愿意。不管到时候称呼是什么、职位是什么,我仍喜欢写程序。但要活的更滋润一些,那么就适可而止为之,技术只不过是你今后前途的支柱之一,而且还不是 最大的支柱。你如果能看出我的矛盾,就不要一样不可救药。

计划的第一步是选定一个课题(呵呵,还好这个已经完成了),然后围绕他但是不能局限它,而对此进行深入的学习实践。我说的围绕不局限于技术。以前我总是不 明白,时常瞧不起某人,说他“什么都不懂,凭啥拿那么多钱,凭啥升官!”,但后来我不得不承认,人家的综合能力的却有我所不及之处,有时候人家的几句话, 就能顶上我们的几百行代码。所以一定要培养自己多方面的能力,包括管理,亲和力,察言观色能力,攻关能力等,要成为综合素质的高手,则前途无量,否则只能 躲在角落看显示器!技术以外的技能才是更重要的本事!!

以前总是懒得说、懒得写。让别人还以为你自命清高,难以交流。这样别人怎么认识你,你怎么能有更广的涉足。所以从现在开始就要多说、多写。多与人沟通。为 了技术和同行沟通。为了思路和业内人士沟通。为了解决方案和同事沟通,为了钱要善于在领导面前表达自己的观点。我不介意你明天就去给领导谈给你加薪的事 情,不要抹不下脸。这也是中磨练。要是你有什么其他的想法可以详详细细的把它写下来,发Email给领导。即使这次不成功,也会在他心里种下一些种子。

也许哪里的饭都不好吃,也许是大多数人都太浮躁了。要静下心了。如果你始终不能静下心的话,那我恭喜你,也应该考虑自己当老板了。在这条路上你已经比我多 走了一步。如果不幸没有成功,那更恭喜你,你比我更近了两步了,至少为下一次冲击积累了经验,不干永远没出息,而且要干成必然要经历失败。不经历风雨,怎 么见彩虹,没有人能随随便便成功!

[转载]C#动态创建和动态使用程序集、类、方法、字段等(一)

mikel阅读(1009)

[转载]C#动态创建和动态使用程序集、类、方法、字段等(一) – longgel – 博客园.

有时候在整个项目架构里也需要动态创建程序集的需求,那如何创建程序集呢,请跟我来学习一下吧。

首先需要知道动态创建这些类型是使用的一些什么技术呢?其实只要相关动态加载程序集呀,类呀,都是使用反射,那么动态创建也一样使用的是反射, 是属于反射的技术!也就是将对象或者数据映射成一个对象或者程序集保存起来而已。

首先我们需要了解每个动态类型在.net中都是用什么类型来表示的。

程序集:System.Reflection.Emit.AssemblyBuilder(定义并表 示动态程序集)

构造函 数:System.Reflection.Emit.ConstructorBuilder(定义并表示动态类的构造函数)

自定义属 性:System.Reflection.Emit.CustomAttributeBuilder(帮助生成自定义属性 使用构造函数传递的参数来生成类的属性)

枚举:System.Reflection.Emit.EnumBuilder(说明并表示枚举类 型)

事件:System.Reflection.Emit.EventBuilder(定义类的事件)

字段:System.Reflection.Emit.FieldBuilder(定义并表示字段。 无法继承此类)

局部变量:System.Reflection.Emit.LocalBuilder(表示方法或构 造函数内的局部变量)

方法:System.Reflection.Emit.MethodBuilder(定义并表示动态 类的方法(或构造函数))

模块:System.Reflection.Emit.ModuleBuilder(定义和表示动态 程序集中的模块)

参数:System.Reflection.Emit.ParameterBuilder(创建或关 联参数信息 如:方法参数,事件参数等)

属性:System.Reflection.Emit.PropertyBuilder(定义类型的 属性 (Property))

类:System.Reflection.Emit.TypeBuilder(在运行时定义并创建类 的新实例)

我们有了这些类型,基本上就可以动态创建我们的任何需要使用的类型,当然很多可以动态创建的类型我不可能都介绍完,如果在项目中有需要可以去查 阅MSDN,里面都有DEMO的,主要的问题就是要理解每一种类型的定义,比如:程序集加载是靠AppDomain,程序集里包含多个模块,模块里可以声 明类,类里可以创建方法、属性、字段。方法需要在类中才可以创建的,局部变量是声明在方法体内等等规则。看MSDN就非常容易弄懂了。

1.如何动态创建它们了

AppDomain:应用程序域(由 AppDomain 对象表示)为执行托管代码提供隔离、卸载和安全边界。AppDomain同时可以载入多个程序集,共同来实现功能。

程序集:简单来说就是一个以公共语言运行库(CLR)为宿主的、版本化的、自描述的二进制文件。(说明:定义来自C#与.NET3.5高级程序设计 (第四版))

模块:类似于以前的单元,用于分割不同的类和类型,以及资源(resource, 资源记录就是字符串,图象以及其它数据,他们只在需要的时候才会被调入内存)。类型的Meta信息也是模块的一部分。多个模块组建成一个程序集。

所谓动态就是在程序运行时,动态的创建和使用。

直接看代码吧,其实超级简单。

//动态创建程序集
AssemblyName DemoName = new AssemblyName(DynamicAssembly);
AssemblyBuilder dynamicAssembly
= AppDomain.CurrentDomain.DefineDynamicAssembly(DemoName, AssemblyBuilderAccess.RunAndSave);
//动态创建模块
ModuleBuilder mb = dynamicAssembly.DefineDynamicModule(DemoName.Name, DemoName.Name + .dll);
//动态创建类MyClass
TypeBuilder tb = mb.DefineType(MyClass, TypeAttributes.Public);
//动态创建字段
FieldBuilder fb = tb.DefineField(“”, typeof(System.String), FieldAttributes.Private);
//动态创建构造函数
Type[] clorType = new Type[] { typeof(System.String) };
ConstructorBuilder cb1
= tb.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, clorType);
//生成指令
ILGenerator ilg = cb1.GetILGenerator();//生成 Microsoft 中间语言 (MSIL) 指令
ilg.Emit(OpCodes.Ldarg_0);
ilg.Emit(OpCodes.Call,
typeof(object).GetConstructor(Type.EmptyTypes));
ilg.Emit(OpCodes.Ldarg_0);
ilg.Emit(OpCodes.Ldarg_1);
ilg.Emit(OpCodes.Stfld, fb);
ilg.Emit(OpCodes.Ret);
//动态创建属性
PropertyBuilder pb = tb.DefineProperty(MyProperty, PropertyAttributes.HasDefault, typeof(string), null);
//动态创建方法
MethodAttributes getSetAttr = MethodAttributes.Public | MethodAttributes.SpecialName;
MethodBuilder myMethod
= tb.DefineMethod(get_Property, getSetAttr, typeof(string), Type.EmptyTypes);
//生成指令
ILGenerator numberGetIL = myMethod.GetILGenerator();
numberGetIL.Emit(OpCodes.Ldarg_0);
numberGetIL.Emit(OpCodes.Ldfld, fb);
numberGetIL.Emit(OpCodes.Ret);
//保存动态创建的程序集
dynamicAssembly.Save(DemoName.Name + .dll);

这一节讲了如何创建动态程序集、类、构造函数、方法、属性等,另外保存程序集,下一节就来讲如何使用创建的程序集以及MSIL指令。

[转载]PowerDesigner将PDM导出生成WORD文档

mikel阅读(1658)

[转载]PowerDesigner将PDM导出生成WORD文档–温习老知识 – 波哥###从理论到实践,从实践到抽象,从抽象到通俗,从通俗到理论 – 博客园.

今天的温习老知识,是如何将一个PD设计的PDM来导出WORD文档,这是一个非常实用的功能,可以在软件过程的数据库设计文档编写中节省N多时 间,

那不废话了,我们就开始今天的讲解吧!

第一步,点击Report Temlates 制作模板

第二步,时间问题,我们在PATH小图标中 ,选择我们已经做好的一个FDATemplate 模板,并双击,没有模版的朋友,点New图标

这时候,我们左右2个区,Aavailable区域中选择你想要在WORD文档中展示的东东,这里我们选择List of Tables,和List of Table Columns[数据表格信息]

如图,右键点击,Selection

选择你想要在数据表格中展示的信息,想要展示的就打钩

鼠标右键选择LAYOUT样式功能

制作样式

点击保存,一个简单的RTP文档就制作完成了。

接着,我们导出WORD文档

在点击OK按钮之后,就会产生我们期待已久的,WORD文档了

I List of tables

Name

Code

FDACaseAccept

FDACaseAccept

FDACaseAcceptDeal

FDACaseAcceptDeal

FDACaseAcceptRevert

FDACaseAcceptRevert

FDACaseCategory

FDACaseCategory

FDACaseDocumentMonitor

FDACaseDocumentMonitor

FDACaseReason

FDACaseReason

FDACaseSources

FDACaseSources

FDACaseSourcesWay

FDACaseSourcesWay

FDACaseSuspectMoney

FDACaseSuspectMoney

II FDACaseAccept

Code

Comment

Data Type

Mandatory

Default

Primary

Foreign Key

AcceptCodeID

案件编码

varchar(15)

FALSE

FALSE

FALSE

AcceptId

ID主键

numeric

TRUE

TRUE

FALSE

AcceptUserID

受理人ID

int

FALSE

FALSE

FALSE

AcceptUserName

受理人姓名

varchar(50)

FALSE

FALSE

FALSE

AchieveDate

datetime

FALSE

FALSE

FALSE

ByComplaintAddress

被投诉方地址

varchar(100)

FALSE

FALSE

FALSE

ByComplaintEntCode

被投诉方企业代码

varchar(50)

FALSE

FALSE

FALSE

ByComplaintEntName

被投诉方企业名称

varchar(50)

FALSE

FALSE

FALSE

ByComplaintPhone

被投诉方电话

varchar(100)

FALSE

FALSE

FALSE

ByComplaintUserName

被投诉方姓名

varchar(30)

FALSE

FALSE

FALSE

CaseCategoryId

受理类别[外键]

int

FALSE

FALSE

FALSE

CaseDate

datetime

FALSE

FALSE

FALSE

CaseSourceId

案件来源[外键]

int

FALSE

FALSE

FALSE

CaseSourceWayId

来源方式[外键]

int

FALSE

FALSE

FALSE

CaseTag

int

FALSE

~(0)~

FALSE

FALSE

CheckTypekind

int

FALSE

~(0)~

FALSE

FALSE

如果选择Generate HTML 选项,则会产生HTML版本的数据库设计

O了,就这么简单,这让我想起了一句话,科技确定生产力。

随便带2个PD的小技巧:

在Columns中加入自己需要的列:

点击:Customize columns and Filter 后

选择自己需要的属性。。

第二个,控制ENTITY的样式

点击后如图:

Limit 就是防止长字段实体的。。