CharlesChen's Technical Space

简单实用是我一直在软件开发追求的目标(I Focus on. Net technology, to make the greatest efforts to enjoy the best of life.)
Not the best, only better
posts - 122, comments - 491, trackbacks - 11, articles - 0
  博客园 :: 首页 ::  :: 联系 :: 订阅 订阅 :: 管理

公告

置顶随笔

摘要: 1、 C#事件是特殊的委托 2、 C#中使用委托模型来实现事件的。 3、 C#中的委托是一个引用类型,可以把它看成一个特殊的”类”。 阅读全文

posted @ 2010-07-08 11:03 Charles Chen 阅读(3482) 评论(25) 编辑

摘要: 一、起因:一位同事在使用XmlDocument.Load("test.xml")方法加载xml文件时候,出现错误,错误是:test.xml文件找不到,也就是说程序找不到test.xml文件。 二、经过: 当出现这个毫无疑问的错误后,马上到应用程序的执行目录下去寻找是否存在test.xml文件。因为这里使用的相对路径,所以应当在当前程序执行目录下去寻找。但是奇怪的是应用程序的执行目录下是存在test...阅读全文

posted @ 2010-05-13 22:46 Charles Chen 阅读(766) 评论(1) 编辑

摘要: 记得已经写过一篇关于(Observer模式), http://www.cnblogs.com/Charles2008/archive/2008/10/06/1305116.html 发布/订阅简称(Pub/Sub)模式,这种Pub/Sub设计模式是observer的一种变体。Observer模式在Design patterns用于:一个对象(Observer)观察者被注入到另一个对象(主题Subj...阅读全文

posted @ 2009-03-07 15:17 Charles Chen 阅读(1129) 评论(0) 编辑

posted @ 2008-12-11 09:17 Charles Chen 阅读(3293) 评论(10) 编辑

posted @ 2008-10-21 07:00 Charles Chen 阅读(2023) 评论(7) 编辑

posted @ 2008-10-06 23:28 Charles Chen 阅读(441) 评论(0) 编辑

posted @ 2008-07-20 16:32 Charles Chen 阅读(3995) 评论(9) 编辑

摘要: 一、起因: 开发团队的一名开发人员突然离职,他把他负责的模块任务交给了我。其中一个模块是他写了一个用户控件,我在我的页面尚始终都用不起,运行时发生错误,错误消息是:The base class includes the field *****, but its type (****) is not compatible with the type of control (ASP.webuserc...阅读全文

posted @ 2008-06-27 14:02 Charles Chen 阅读(2458) 评论(10) 编辑

摘要: 最近比较空闲,我喜欢在空闲的时间来总结总结新的知识。记得一个项目中要实现Google Map中搜索功能。通过在网上查阅相关资料。原来是要使用GoogleMap提供的API函数来实现。下面我用GoogleMap来实现以个简单的Map,可以通过某个地区的经纬度来查询城市的地理位置。(支持缩放,移动等功能) 纬度 经度 源文件下载: 点击下载阅读全文

posted @ 2008-03-03 10:54 Charles Chen 阅读(1046) 评论(6) 编辑

2012年4月17日

摘要: 我们知道Reflector可以反编译IL代码,根据它可以查看到不同语言的源代码(如C#,VB.Net等),但是Reflector还可以导出成工程文件,得到源代码的工程项目文件。通过这种方式得到的工程文件如果用Visual Studio打开后,虽然大多数的问题是由于缺少引用“程序集”带来的编译不能通过,但是还是一些非与此相关的问题存在,需要对反编译的工程项目进行手动修改和调整。阅读全文

posted @ 2012-04-17 16:34 Charles Chen 阅读(89) 评论(0) 编辑

2012年4月16日

      在项目中写了一个存储过程:    

Create PROCEDURE [dbo].[****] @ParkingAddress nvarchar(50) AS
BEGIN
insert into table(ParkingAddress)
values(@ParkingAddress)
END
if(@@rowcount>0)
return 1
else
return 0
     在程序中我需要调用这个存储过程并且得到它的返回值。因此需要获取该存储过程的返回值。在程序中我通过SqlCommand中的ExecuteNonQuery方法调用成功后,一时不知道怎么得到它的返回值。(没有用output输出参数),故查了些资料得到了解决方案,下面是一些记录,这里整理在一起,便于以后查找方便。

     要点:output是在存储过程中的参数的返回值(输出参数),而ReturnValue是存储过程返回的值(使用return关键字),一个存储过程可以有任意多个依靠参数返回的值,但只有一个ReturnValue。

一、获取存储过程的返回值--通过查询分析器获得
     存储过程大体分成三类:

1、返回记录集的存储过程:执行结果是一个记录集,例如,从数据库中检索出符合某一个或几个条件的记录。

2、返回数值得的存储过程(也可称为标量存储过程),其执行完后返回一个值,例如数据库中执行一个有返回值的函数或命令。

3、行为存储过程,用来实现数据库的某个功能,而没有返回值,例如在数据库中的更新和删除操作。

另外:含有return的存储过程其返回值为return返回的那个值。

没有return的存储过程,无论执行结果又无结果集,其返回值都是0,

带有输出参数的存储过程,如果有RETURN则返回RETURN返回的那个值,如果要SELECT输出参数,则出现输出参数的值,和有无RETURN无关。

二、获取存储过程的返回值--通过程序获得

SqlParameter[] cmdParms = { .. ,new SqlParameter("@return",SqlDbType.Int)};
cmdParms[cmdParms.Length - 1].Direction = ParameterDirection.ReturnValue;或者
cmdParms[cmdParms.Length - 1].Direction = ParameterDirection.Output或者
cmdParms[cmdParms.Length - 1].Direction = ParameterDirection.Input;

得到返回值 object obj = cmdParms[cmdParms.Length - 1].Value;

根据上面的思路,最后在项目中通过 

            SqlParameter p = new SqlParameter("@ReturnValue", SqlDbType.Int);//这里的@ReturnValue可以根据需要自己命名,如果不命名系统将提供默认的一个名称。
            p.Direction = ParameterDirection.ReturnValue;

            SqlCommand.Parameters.Add(P);

            SqlCommand.ExecuteNonQuery();

            object obj=SqlCommand.Parameters["ReturnValue"].Value;

 就这样程序就得到存储过程中的返回值。

问题解决!

           


posted @ 2012-04-16 17:25 Charles Chen 阅读(49) 评论(0) 编辑

2012年2月16日

摘要: SQL Server 2000中使用本地系统帐户和域用户帐户两者区别阅读全文

posted @ 2012-02-16 14:51 Charles Chen 阅读(433) 评论(0) 编辑

2012年2月15日

    本文转载于T-Sql:字符串分组聚合,也许你还有更简单的办法?    

    今天在看订阅的RSS的时候,看到这么一个问题:T-Sql中如何对分组的信息进行聚合,并以逗号连接字符;也就是对一个表中的某个字段进行分组,然后对另一个字段聚合,如果表达得不太清楚,请看下面的表。

 原表:

Parent
Child
Charles William
Charles Harry
Anne Peter
Anne Zara
Andrew Beatrice
Andrew Eugenie


处理后的结果:  

Parent
Children
Charles William,Harry
Anne Peter,Zara
Andrew Eugenie,Beatrice

 

     貌似很简单,以我的思考,先写一个聚合函数,然后再查询语句里面调用这个聚合函数;实际上还有更简单的办法,这是作者给出的解决办法,没有用到自定义聚合函数,他用的是FOR XML PATH(‘’)这样的处理方式,感觉真是爽

with t  as(
 
select 'Charles' parent, 'William' child union
 
select 'Charles''Harry' union
 
select 'Anne''Peter' union
 
select 'Anne''Zara' union
 
select 'Andrew''Beatrice' union
 
select 'Andrew''Eugenie' 
)

SELECT parent, STUFF( ( SELECT ','+ child 
                        
FROM t a 
                        
WHERE b.parent = a.parent 
                        
FOR XML PATH('')),1 ,1'')  children
FROM t b 
GROUP BY parent

 

如果你还有其他的解决办法,希望你也能给出你的答案, 多多益善

 

考虑到不熟悉STUFF()这个函数,故根据这个思路自己写了另外的方法:

select  parent,right(list,len(list)-1from 
(
select parent,
(SELECT ','+ children
                        FROM t a   
                        where a.parent=b.parent                       
                        FOR XML PATH('')) as list
from t b
group by parent
) x

 最终查询出来的结果集和使用上面的Stuff函数是一样的.

另外补充一下关于Stuff函数的用法:

/*
用法描述:
Stuff(expression1_Str,startIndex,lengthInt,expression2_Str)函数共有四个参数,其功能是将expression1_Str中自startIndex位置起删除lengthInt个字符,然后将expression2插入到expression1_Str中的startIndex位置。
*/

select 'abcdefg'
select STUFF('abcdefg',1,0,'1234') --结果为'1234abcdefg'
select STUFF('abcdefg',1,1,'1234') --结果为'1234bcdefg'
select STUFF('abcdefg',2,1,'1234') --结果为'a1234cdefg'
select STUFF('abcdefg',2,2,'1234') --结果为'a1234defg'

--一般的程序设计语言和Sql语言一样,都把字符串当作字符数组处理,但一个差别在于,大多数程序设计语言的数组下标起始位为0,而Sql Server中为1,由于惯性思维,常常把一般程序设计语言中的0起始位带至SQL编程中。

posted @ 2012-02-15 15:41 Charles Chen 阅读(65) 评论(0) 编辑

摘要: SQL中使用update inner join和delete inner join阅读全文

posted @ 2012-02-15 11:24 Charles Chen 阅读(51) 评论(0) 编辑

2011年5月25日

本文转载于:http://hi.baidu.com/yangyangye2008/blog/item/1775770215a22782d53f7c18.html

两者大同小异,之说comBoBox吧,我们知道数据绑定控件被绑定之后是无法再在里面添加数据的,因为这是后的DataSource是无法修改的!不管是先再comBoBox之前使用其属性Items下的Add方法添加都会被后来的DisplayMember覆盖,

①这样是不行的:

comboBox1.Items.Add("--选择所有--");

this.comboBox1.DataSource = EmployerSet;

this.comboBox1.DisplayMember = "EmployeesTable.FirstName";

这种错误时先添加一项殊不知,会被后来的覆盖掉!

②另外可能有人想的是:

this.comboBox1.DataSource = EmployerSet;

this.comboBox1.DisplayMember = "EmployeesTable.FirstName";

comboBox1.Items.Insert(0,"--选择所有--");

这一种是最普遍的错误,这时候错误会出现在红色位置:设置 DataSource 属性后无法修改项集合。

怎么解决了,在长期的经历中我发现还是有方法可行的,第二种最佳,是昨天做项目的时候发现的:

第一种方法,想修改绑定的数据源之后再绑定,代码如下:

DataTable dt = EmployerSet.Tables["EmployeesTable"];

DataRow dr = dt.NewRow();

dr["FirstName"] = "--选择所有--";

dt.Rows.InsertAt(dr, 0);

this.comboBox1.DataSource = dt;

this.comboBox1.DisplayMember = "FirstName";

方法二:

采用了数据源的管理对象BindingContext,先将当前项的值修改之后再赋予呈现成员

this.comboBox1.DataSource = EmployerSet;

DataRowView rowV = (DataRowView)this.BindingContext[EmployerSet, "EmployeesTable"].Current;

rowV["FirstName"] = "--选择所有--";

this.comboBox1.DisplayMember = "EmployeesTable.FirstName";

你可以测试发现其实 rowV["FirstName"]原本的值就是EmployeesTable.FirstName中的第一个值,只是后来被修改了,接着赋予其呈现成员,这里之所以修改数据源会成功,我自己的认为是使用到了数据的管理对象,就好像是管理员可以修改一样而别人无法修改!

posted @ 2011-05-25 09:57 Charles Chen 阅读(519) 评论(0) 编辑

2011年1月25日

摘要: 唉,又是一次相当费力费时的系统维护,为了便于总结和思考,故对这次系统维护进行记录笔记!阅读全文

posted @ 2011-01-25 12:23 Charles Chen 阅读(282) 评论(0) 编辑

2010年12月15日

摘要: 这几天对SQL中的事务进行复习,来自于对客户项目维护引起的思考!先说说项目维护中遇到的问题:我们公司开发的软件项目,它建立在第三方公司开发项目(你见到过垄断主义的软件吗?)之上,数据库是直接的依赖关系,它偶尔出现死机的现象?阅读全文

posted @ 2010-12-15 13:57 Charles Chen 阅读(2101) 评论(26) 编辑

2010年12月13日

摘要: 设计模式的要点:设计模式(Design pattern)的鼻祖来至于建筑学领域。 建筑学定义的模式是:每个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。 然后在软件设计里面,从建筑学那边借鉴过来,软件设计模式描述了在软件设计过程中某一类常见问题的一般性解决方案。通过建筑学和软件设计的不同领域,其实也能看出有很强的类比性。通过对比可以看出,软件设计模式描述了常见问题的一般性解决方案。其实我们知道在软件设计过程中,设计软件其实有很多的陷阱,你可以拿到工具和语言可以做各种各样的事情,解决各种各样的问题。阅读全文

posted @ 2010-12-13 13:53 Charles Chen 阅读(309) 评论(0) 编辑

2010年12月10日

摘要: 记得曾经学习State设计模式的时候,记录了学习笔记.NET下的状态(State)模式 ------行为型模式 ,而最近一段时间我借助于项目的重构时间温习了关于行为型的模式----State(状态)模式。 关于State设计模式的要点和代码结构在.NET下的状态(State)模式 ------行为型模式一文中已经有比较的清晰的说明,这里我就通过一个Demo来从另一个方面介绍关于State模式的分析。 案例Demo:这样的一个场景:有一个关于PDA设备的在押人员点名的管理系统,在点名的过程中,在押人员有不同的状态(在所,不在所,外出就医,外出探亲等),不同的在押状态在PDA上显示的方式和点名的行阅读全文

posted @ 2010-12-10 15:10 Charles Chen 阅读(191) 评论(0) 编辑