posts - 22,  comments - 7,  trackbacks - 0
  2008年6月24日

常见的处理异常方式有两种:
1.Web.config
2.Application_Error
这两种就不多说了,网上非常多

但可能是C/S的程序写多了,有时总觉得用着不舒服,因此想把换个自已认为舒服点的方式处理异常。
前提:使用了MasterPage

1.在MasterPage中输入以下代码:

1        internal void ShowError(Exception ex)
2        {
3            Session.Add("Exception", ex);
4            Response.Redirect("Error.aspx");
5        }

2.Error.aspx.cs中输入以下代码:

 1        protected void Page_Load(object sender, EventArgs e)
 2        {
 3            if (Session["Exception"!= null)
 4            {
 5                Exception ex = Session["Exception"as Exception;
 6
 7                if (ex != null)
 8                {
 9                    this.lblErrMsg.Text = ex.Message;
10                }

11                else
12                {
13                    this.lblErrMsg.Text = "发生未知错误";
14                }

15
16                Session.Remove("Exception");
17            }

18            else
19            {
20                Response.Redirect("Default.aspx");
21            }

22        }

3.如果你有可能使用MasterPage的嵌套,那么可能需要(如果你不介意使用Master.Master...那么就不需要了)使用这样一个类型,姑且称之为:MasterHelper吧,代码如下:

 1        internal static T GetParentMaster<T>(MasterPage master)
 2          where T : MasterPage
 3        {
 4            MasterPage masterPage = null;
 5
 6            if (master is T)
 7            {
 8                masterPage = master;
 9            }

10
11            if (master != masterPage && master != null && master.Master != null)
12            {
13                masterPage = master.Master;
14
15                while ((masterPage is T) == false)
16                {
17                    masterPage = masterPage.Master;
18                }

19            }

20
21            return masterPage as T;
22        }

4.最后,捕获并处理异常:

1            try
2            {
3                throw new Exception("这是一个测试异常");
4            }

5            catch (Exception ex)
6            {
7                MasterHelper.GetMaster<MasterPage_FullName>(this.Master).ShowError(ex);
8            }

这个方法也许很C/S,能用的上的就凑合着用吧:)


 

posted @ 2008-06-24 00:38 think8848 阅读(28) | 评论 (0)编辑
  2008年6月15日
 1private void AddCode(Form form)
 2{
 3   IDesignerHost host = null;
 4   host = (IDesignerHost)form.Site.GetService(typeof(IDesignerHost));
 5
 6   //Add method "Form1_Load" on Form1
 7   //---------------------------------------------------------------------------
 8   CodeMemberMethod member = new CodeMemberMethod();
 9   member.Name = "Form1_Load";
10   member.Parameters.Add(new CodeParameterDeclarationExpression("System.Object""sender"));
11   member.Parameters.Add(new CodeParameterDeclarationExpression("System.EventArgs""e"));
12   CodeSnippetExpression sn;
13   sn = new CodeSnippetExpression("MessageBox.Show(\"Hello world\")");
14   member.Statements.Add(sn);
15   member.Attributes = MemberAttributes.Private;
16   CodeTypeDeclaration typedecl = (CodeTypeDeclaration)form.Site.GetService(typeof(CodeTypeDeclaration));
17   typedecl.Members.Add(member);
18   //---------------------------------------------------------------------------
19
20
21   //This code will add the following line to the "InitializeMethod" method
22   // this.Load += new System.EventHandler(this.Form1_Load);
23   //---------------------------------------------------------------------------
24   member = new CodeMemberMethod();
25   foreach (CodeTypeMember typememb in typedecl.Members)
26   {
27       if (typememb.Name == "InitializeComponent")
28       { member = (CodeMemberMethod)typememb; }
29   }

30   CodeDelegateCreateExpression createDelegate1;
31   createDelegate1 = new CodeDelegateCreateExpression(new CodeTypeReference("System.EventHandler"), new CodeThisReferenceExpression(), "Form1_Load");
32   CodeAttachEventStatement attach = new CodeAttachEventStatement(new CodeThisReferenceExpression(), "Load", createDelegate1);
33   member.Statements.Add(attach);
34   typedecl.Members.Add(member);
35   //---------------------------------------------------------------------------
36
37
38   //Add and remove a label because otherwise the code to add the method seems to stay "inactive,
39   //while in this way it works
40   //---------------------------------------------------------------------------
41   Label lbl = (Label)host.CreateComponent(typeof(Label));
42   host.DestroyComponent(lbl);
43   //---------------------------------------------------------------------------
44}
posted @ 2008-06-15 01:25 think8848 阅读(28) | 评论 (0)编辑
     摘要: 54.1 How to make my Component add itself to the contained Form's IContainer list? You do this inorder to ensure that your component gets disposed along with the contained Form (logical parent).All For... 阅读全文
posted @ 2008-06-15 01:06 think8848 阅读(37) | 评论 (0)编辑
  2008年6月4日
1//清除命令字符串中的所有字符串
2string commandTextNoString = Regex.Replace(command.CommandText, @"['][\S]*[']""");
3
4Regex regex = new Regex(@"@[^,\s)]*");
5//获取参数名列表
6MatchCollection matchs = regex.Matches(commandTextNoString);
7


matchs里面包含了在CommandText中使用的所有参数名称
posted @ 2008-06-04 13:58 think8848 阅读(18) | 评论 (0)编辑
  2008年5月27日
注册前一定要把网络断开
Subscriber:QQ24785490
Subscription Code:DLR8ZC-855551-65657857678050018
posted @ 2008-05-27 11:03 think8848 阅读(2193) | 评论 (3)编辑
  2008年5月26日
string strSql = "insert into test_table"
+"(zdsxh,zdsbm,mc,fzrbh,bxrbh,bxrq,sjfrom,sjto)values"
+"(@zdsxh,@zdsbm,@mc,@fzrbh,@bxrbh,@bxrq,@sjfrom,@sjto)";

将strSql替换成
string strSql = "insert into test_table"
+"(zdsxh,zdsbm,mc,fzrbh,bxrbh,bxrq,sjfrom,sjto)values"
+"(?,?,?,?,?,?,?,?)";

替换占位符

使用正则表达式:
strSql = Regex.Replace(strSql ,  @"@[^,]*,", "?,", RegexOptions.IgnoreCase);

要加上
using System.Text.RegularExpressions;

替换占位符

string strSql = "insert into test_table"
                 + "(zdsxh,zdsbm,mc,fzrbh,bxrbh,bxrq,sjfrom,sjto)values"
                 + "(@zdsxh,@zdsbm,@mc,@fzrbh,@bxrbh,@bxrq,@sjfrom,@sjto)";
            strSql = Regex.Replace(strSql, "@\\w+", "?");
posted @ 2008-05-26 22:26 think8848 阅读(68) | 评论 (0)编辑
  2008年5月25日

.net的辅助工具列表:
Code generation

Compilation

Obfuscation

Decompilation

Object Browsing

Refactoring

Persistence and data-related code generation

See also "RAD Tools - Application Development Automation" below

RAD Tools - Application Development Automation

Model Driven Architecture

Modeling - UML

IDEs

Builds

Testing

Code validation - Standard verifiers

Profiling - Monitoring - Performance Testing - Optimization

Documentation - Code commenting

Frameworks

MVC

AOP

Code versioning - Source control

Localization

Reporting

Page templating

Scripting

Installation

Others

posted @ 2008-05-25 11:01 think8848 阅读(19) | 评论 (0)编辑
  2008年5月22日

元数据 (metadata) 最常见的定义为"有关数据的结构数据",或者再简单一点就是"关于数据的信息",日常生活中的图例、图书馆目录卡和名片等都可以看作是元数据。在关系型数据库管理系统 (DBMS) 中,元数据描述了数据的结构和意义。比如在管理、维护 SQL Server 或者是开发数据库应用程序的时候,我们经常要获取一些涉及到数据库架构的信息:

某个数据库中的表和视图的个数以及名称 ;

某个表或者视图中列的个数以及每一列的名称、数据类型、长度、精度、描述等;

某个表上定义的约束;

某个表上定义的索引以及主键/外键的信息。

下面我们将介绍几种获取元数据的方法。

获取元数据

使用系统存储过程与系统函数访问元数据

获取元数据最常用的方法是使用 SQL Server 提供的系统存储过程与系统函数。

系统存储过程与系统函数在系统表和元数据之间提供了一个抽象层,使得我们不用直接查询系统表就能获得当前数据库对象的元数据。

常用的与元数据有关的系统存储过程有以下一些:


系统存储过程 描述
sp_columns 返回指定表或视图的列的详细信息。
sp_databases 返回当前服务器上的所有数据库的基本信息。
sp_fkeys 若参数为带有主键的表,则返回包含指向该表的外键的所有表;若参数为带有外键的表名,则返回所有同过主键/外键关系与该外键相关联的所有表。
sp_pkeys 返回指定表的主键信息。
sp_Server_info 返回当前服务器的各种特性及其对应取值。
sp_sproc_columns 返回指定存储过程的的输入、输出参数的信息。
sp_statistics 返回指定的表或索引视图上的所有索引以及统计的信息。
sp_stored_procedures 返回当前数据库的存储过程列表,包含系统存储过程。
sp_tables 返回当前数据库的所有表和视图,包含系统表。

常用的与元数据有关的系统函数有以下一些:

系统函数 描述
COLUMNPROPERTY 返回有关列或过程参数的信息,如是否允许空值,是否为计算列等。
COL_LENGTH 返回指定数据库的指定属性值,如是否处于只读模式等。
DATABASEPROPERTYEX 返回指定数据库的指定选项或属性的当前设置,如数据库的状态、恢复模型等。
OBJECT_ID 返回指定数据库对象名的标识号
OBJECT_NAME 返回指定数据库对象标识号的对象名。
OBJECTPROPERTY 返回指定数据库对象标识号的有关信息,如是否为表,是否为约束等。
fn_listextendedproperty 返回数据库对象的扩展属性值,如对象描述、格式规则、输入掩码等。

由于我们无法直接利用到存储过程与函数的返回结果,因此只有在我们关心的只是查询的结果,而不需要进一步利用这些结果的时候,我们会使用系统存储过程与系统函数来查询元数据。

例如,如果要获得当前服务器上所有数据库的基本信息,我们可以在查询分析器里面运行:

EXEC sp_databases
GO

在返回结果中我们可以看到数据库的名称、大小及备注等信息。

但是如果要引用这部分信息,或者存储这部分信息以供后面使用,那么我们必须借助中间表来完成这个操作:

CREATE TABLE #sp_result
(
DATABASE_NAME sysname,
DATABASE_SIZE int,
REMARKS varchar(254) NULL
)
GO
INSERT INTO #sp_result
EXEC ('sp_databases')
GO


使用信息架构视图访问元数据

信息架构视图基于 SQL-92 标准中针对架构视图的定义,这些视图独立于系统表,提供了关于 SQL Server 元数据的内部视图。信息架构视图的最大优点是,即使我们对系统表进行了重要的修改,应用程序也可以正常地使用这些视图进行访问。因此对于应用程序来说,只要是符合 SQL-92 标准的数据库系统,使用信息架构视图总是可以正常工作的。

常用的信息架构视图有以下一些:


信息架构视图 描述
INFORMATION_SCHEMA.CHECK_CONSTRAINTS   返回有关列或过程参数的信息,如是否允许空值,是否为计算列等。
INFORMATION_SCHEMA.COLUMNS   返回当前数据库中当前用户可以访问的所有列及其基本信息。
INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE   返回当前数据库中定义了约束的所有列及其约束名。
INFORMATION_SCHEMA.CONSTRAINT_TABLE_USAGE   返回当前数据库中定义了约束的所有表及其约束名。
INFORMATION_SCHEMA.KEY_COLUMN_USAGE   返回当前数据库中作为主键/外键约束的所有列。
INFORMATION_SCHEMA.SCHEMATA   返回当前用户具有权限的所有数据库及其基本信息。
INFORMATION_SCHEMA.TABLES   返回当前用户具有权限的当前数据库中的所有表或者视图及其基本信息。
INFORMATION_SCHEMA.VIEWS   返回当前数据库中的当前用户可以访问的视图及其所有者、定义等信息。

由于这些信息架构都是以视图的方式存在的,因此我们可以很方便地获得并利用需要的信息。

例如,我们要得到某个表有多少列,可以使用以下语句:

SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME='mytable'

使用系统表访问元数据

虽然使用系统存储过程、系统函数与信息架构视图已经可以为我们提供了相当丰富的元数据信息,但是对于某些特殊的元数据信息,我们仍然需要直接对系统表进行查询。因为SQL Server 将所有数据库对象的信息均存放在系统表中,作为 SQL Server 的管理、开发人员,了解各个系统表的作用将有助于我们了解 SQL Server 的内在工作原理。

SQL Server 的系统表非常多,其中最常用的与元数据查询有关的表有如下一些:


系统表 描述
syscolumns 存储每个表和视图中的每一列的信息以及存储过程中的每个参数的信息。
syscomments 存储包含每个视图、规则、默认值、触发器、CHECK 约束、DEFAULT 约束和存储过程的原始 SQL 文本语句。
sysconstraints 存储当前数据库中每一个约束的基本信息。
sysdatabases 存储当前服务器上每一个数据库的基本信息。
sysindexes 存储当前数据库中的每个索引的信息。
sysobjects 存储数据库内的每个对象(约束、默认值、日志、规则、存储过程等)的基本信息。
sysreferences 存储所有包括 FOREIGN KEY 约束的列。
systypes 存储系统提供的每种数据类型和用户定义数据类型的详细信息。

将系统存储过程、系统函数、信息架构视图与系统表结合使用,可以方便地让我们获得所有需要的元数据信息。

示例:
1、 获得当前数据库所有用户表的名称。

SELECT OBJECT_NAME (id)
FROM sysobjects
WHERE xtype = 'U' AND OBJECTPROPERTY (id, 'IsMSShipped') = 0

其中主要用到了系统表 sysobjects以及其属性 xtype,还有就是用到了 OBJECTPROPERTY 系统函数来判断是不是安装 SQL Server 的过程中创建的对象。

2、 获得指定表上所有的索引名称

SELECT name FROM sysindexes
WHERE id = OBJECT_ID ('mytable') AND indid > 0


综合实例

下面给出了一个存储过程,它的作用是自动将当前数据库的用户存储过程加密。

DECLARE @sp_name nvarchar(400)
DECLARE @sp_content nvarchar(2000)
DECLARE @asbegin int
declare @now datetime
select @now = getdate()
DECLARE sp_cursor CURSOR FOR
SELECT object_name(id)
FROM sysobjects
WHERE xtype = 'P'
AND type = 'P'
AND crdate < @now
AND OBJECTPROPERTY(id, 'IsMSShipped')=0

OPEN sp_cursor

FETCH NEXT FROM sp_cursor
INTO @sp_name

WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @sp_content = text FROM syscomments WHERE id = OBJECT_ID(@sp_name)
SELECT @asbegin = PATINDEX ( '%AS' + char(13) + '%', @sp_content)
SELECT @sp_content = SUBSTRING(@sp_content, 1, @asbegin - 1)
+ ' WITH ENCRYPTION AS'
+ SUBSTRING (@sp_content, @asbegin+2, LEN(@sp_content))
SELECT @sp_name = 'DROP PROCEDURE [' + @sp_name + ']'
EXEC sp_executeSQL @sp_name
EXEC sp_executeSQL @sp_content
FETCH NEXT FROM sp_cursor
INTO @sp_name
END

CLOSE sp_cursor
DEALLOCATE sp_cursor

该存储过程利用了 sysobjects 和 syscomments 表,并巧妙地修改了原存储过程的 SQL 定义语句,将 AS 修改为了 WITH ENCRYPTION AS,从而达到了加密存储过程的目的。本存储过程在 SQL Server 2000 上通过。

posted @ 2008-05-22 22:53 think8848 阅读(40) | 评论 (0)编辑
  2008年4月24日
晚上抽空看了Mtaulty有关Linq to SQL的N集连播,大呼过瘾,看完才有不少感概,国外DPE的这些Evangelist真是在传教解惑,如果换成中文的,哪估计能普及更多中国的.NET 爱好者,想想几年前自己在DPE的时候,天天有数字的压力,每每像个小弟一样跟着Sales老大跑前跑后,是明白了很多的销售的道理,当时感觉自己像蜻蜓点水,不过话也说回来,那时候还没有这么多的方式,有是播又是拍、又是Blog还能即时通讯、声音文字图像无线网络一起上,手段之多方法之强啊。

  不过一直挺喜欢Video这种形式,因为即使你不懂语言,看着节目照葫芦画瓢,也能获得很多知识和体验,想想如果以前有Video,那么就不用写文字1,2,3的说了。4年以后图形的压缩、存储以及网络带宽有了一定的提高,但似乎还没有到了极大丰富的地步。


  比着Mtaulty的录像,自己也演练了5+个小时,开始喜欢起来,因为感觉之前看的或研究过的CSLA.NET, Bese4.NET,Wilson ORMapping 似乎被收编和再次统一,而且从LINQ to SQL来看,会变得更为底层,因为在平台层面操作系统是最底层的,在.NET层面CLR是最底层的,但在编程语言这个层面,没有比编译器更为底层的了,而LINQ正是来自编译器的支持。