随笔 - 25  文章 - 2 评论 - 24 trackbacks - 1
<2009年7月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

本博客中的内容均为我的原创作品

与我联系

搜索

 

常用链接

留言簿

随笔分类

随笔档案

文章档案

积分与排名

  • 积分 - 12117
  • 排名 - 4103

最新评论

阅读排行榜

评论排行榜

本例主要是判断一个字符是否是中文,

在unicode 字符串中,中文的范围是在4E00..9FFF,通过对字符的unicode编码进行判断来确定字符是否为中文。

Code

posted @ 2009-04-09 10:14 阿风的博客 阅读(93) | 评论 (0)编辑
第一次写API的程序,做了一个类似SPY++雷达手的工具,可以捕捉鼠标当前的位置,句柄,类名等。
图:

软件下载地址:http://221.224.12.5:8080/sgs/CursorPlace/CursorPlace.rar
源码地址:http://221.224.12.5:8080/sgs/CursorPlace/CursorPlace_source.rar
开发工具:VS.Net 2003
posted @ 2006-01-13 10:16 阿风的博客 阅读(1218) | 评论 (0)编辑
注:RPM 其实就是TableSchema的升级版,全称是:Rainbow Project Manager。是为我的公司数据库项目管理而改的名字的。

下载地址:http://221.224.12.5:8080/sgs/RPM/RPM.rar
版本:V2.2
大小:4.70M
发布日期:2005-12-27

      在软件开发的时候我们经常要和数据库打交道,特别是SQL Server,大部分应用软件和网站都在使用SQL Server,大型的项目里还有大量的存储过程,在很多表和存储过程的时候如何维护它们成为摆在我们面前的关键问题。
      通过RPM可以从一定的程度上让我们从这些烦琐的事情中解脱出来。

主界面,查看表结构:

 

数据库的连接:

 

执行SQL语句或存储过程的查询:

查看表的异动:

查询包含该表的存储过程:

查看一个存储过程的内容:

查看该项目表的模板结构:

生存所有表的表结构:

可以收藏管理自己的文档:

posted @ 2005-12-27 15:20 阿风的博客 阅读(73) | 评论 (1)编辑
      在软件开发的时候我们经常要和数据库打交道,特别是SQL Server,大部分应用软件和网站都在使用SQL Server,大型的项目里还有大量的存储过程,在很多表和存储过程的时候如何维护它们成为摆在我们面前的关键问题。
      最近写了一个小程序,从一定的程度上让我们从这些烦琐的事情中解脱出来.
      软件的下载地址:下载
      另:本软件使用C#编写,如果没有安装dotNetFrameWork,将无法运行,可以去微软的网站下载该语言包.
界面一:实现查询分析器的基本功能,可以通过sql语句和存储过程对数据库做各种操作。
tab1.jpg
界面二:可以方便的浏览表的Schema,包括描述部分,而且还提供浏览所有的表的Schema。
tab2.jpg
界面三:我们还可以对每个表的异动记录下来 ,下次的时候或者别人则可以很方便的查看,以及错误回滚。并提供同一个界面浏览所有表的异动日志。
tab3.jpg
界面四:我们可以查找系统中有哪些存储过程涉及到对应的表,可以很方便的对各存储过程进行查看。tab4.jpg
界面五:对数据库连接字符串的设置
conn.jpg
界面六:可以将数据库中的所有表Schema生成一个HTM页面。
saveTableSchema.jpg
界面六:生成的表Schema的HTM页面
tableSchema.jpg

其他的功能不一一描述了。
如果对本软件有什么好的意见,欢迎提出来,以方便以后改进。
posted @ 2005-11-23 16:28 阿风的博客 阅读(278) | 评论 (1)编辑
SELECT 
(
case when a.colorder=1 then d.name else '' end) N'表名'
a.colorder N
'字段序号'
a.name N
'字段名'
(
case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 then ''else '' end) N'标识'
(
case when (SELECT count(*
FROM sysobjects 
WHERE (name in 
(
SELECT name 
FROM sysindexes 
WHERE (id = a.id) AND (indid in 
(
SELECT indid 
FROM sysindexkeys 
WHERE (id = a.id) AND (colid in 
(
SELECT colid 
FROM syscolumns 
WHERE (id = a.id) AND (name = a.name))))))) AND 
(xtype 
= 'PK'))>0 then '' else '' end) N'主键'
b.name N
'类型'
a.length N
'占用字节数'
COLUMNPROPERTY(a.id,a.name,'PRECISION'as N'长度'
isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0as N'小数位数'
(
case when a.isnullable=1 then ''else '' end) N'允许空'
isnull(e.text,'') N'默认值'
isnull(g.[value],''AS N'字段说明' 
--into ##tx 

FROM syscolumns a left join systypes b 
on a.xtype=b.xusertype 
inner join sysobjects d 
on a.id=d.id and d.xtype='U' and d.name<>'dtproperties' 
left join syscomments e 
on a.cdefault=e.id 
left join sysproperties g 
on a.id=g.id AND a.colid = g.smallid 
order by object_name(a.id),a.colorder 
posted @ 2005-11-22 12:48 阿风的博客 阅读(130) | 评论 (0)编辑
前几天刚写的,对多个主键 多表 多个字段组合查询 多字段排序的情况下实现真分页的存储过程:
CREATE procedure TEACHERS_SEARCH
@schoolid as int=0,
@teacher_name as nvarchar(50)='',
@push_status as tinyint=0,
@count as tinyint=0,  --真分页统计
@pageSize as int=10--当前页需要显示的记录数
@topSize as int=10  --包括该页前面的记录总数
as

--@status 0:全部;1:在课件区;2:在blog区;3:既在课件区又在blog区;
declare @str nvarchar(2000)
declare @str_search nvarchar(1000)

set @str_search='1=1'
if(@schoolid<>0)
 
set @str_search=@str_search+' and teacher.schoolid='+str(@schoolid)
if(@teacher_name<>'')
 
set @str_search=@str_search+' and teacher.name like '''+@teacher_name +'%'''
if(@push_status=1)
 
set @str_search=@str_search+' and  TeacherRecommand.status in (1,3)'
if(@push_status=2)
 
set @str_search=@str_search+' and  TeacherRecommand.status in (2,3)'
if(@push_status=3)
 
set @str_search=@str_search+' and  TeacherRecommand.status in (1,2)'

if(@count=0)
set @str='
  select * from (SELECT  top 
'+ str(@pageSize+' *  from  ( select top '+ str(@topSize+' Teacher.schoolid,Teacher.teacherid,teacher.name as teacher_name,school.name as school_name,teacher.email,teacher.telephone, TeacherRecommand.status,School.rainbowsite as rainbowsite
  FROM Teacher INNER JOIN
      School ON Teacher.schoolid = School.schoolid 
    LEFT OUTER JOIN
      TeacherRecommand ON Teacher.schoolid = TeacherRecommand.schoolid AND 
      Teacher.teacherid = TeacherRecommand.teacherid
  WHERE 
'+@str_search +' order by teacher.schoolid desc,teacher.teacherid desc) a
 order by schoolid asc,teacherid asc) b
 order by schoolid desc,teacherid desc
'
else
set @str='
  SELECT count(*)
  FROM Teacher INNER JOIN
      School ON Teacher.schoolid = School.schoolid 
    LEFT OUTER JOIN
      TeacherRecommand ON Teacher.schoolid = TeacherRecommand.schoolid AND 
      Teacher.teacherid = TeacherRecommand.teacherid
  WHERE 
'+@str_search
--print @str
exec (@str)
GO
posted @ 2005-11-16 10:50 阿风的博客 阅读(165) | 评论 (0)编辑

已失效

[v1.3新增功能]:

  1:由于pop登录程序有所修改,导致v1.1不能登录,因此升级。
  2:新增将软件在最小化时放入托盘的功能,减少在放气球时候占用状态栏空间。
  3:新增在重复放气球时个数设置功能。
  4:新增查看放气球的帖子的连接功能
                                2005-11-10

点击这里进行下载   POP气球机v1.3


有BUG请在这里给我留言。

本程序采用C#编写,如果操作系统没有安装.NET Framework 语言包中文版,将无法运行,请先到Microsoft网站下载,地址:点击这里下载

posted @ 2005-11-10 23:43 阿风的博客 阅读(179) | 评论 (0)编辑

在开发一个大型的项目的时候,数据库在多表,表关联复杂的情况下,使用存储过程是一种理想的选择,存储过程可以帮助我们处理一些数据

层逻辑比较复杂的事务。存储过程在首次运行时将被编译,因此在多次调用的时候会大大节省数据库服务器的负担,提高程序的运行效率。

但是在.net里调用存储过程的方法是比较痛苦的,特别是在多个传入传出的情况下。
如下面的一个存储过程:

CREATE PROCEDURE MEMBER_TEACHER_GET
@pid as int=null,  --教师代号
@depart as int=null,  --教师部门
@uname as nvarchar(18)='',  --登陆名
@tname as nvarchar(20)='',   --真实姓名
@status as char(10)='',      --状态
@count  as tinyint=null     --真分页时所用
 AS

--处理过程省略

GO

在传统上调用存储过程的方法如下:
            string conn_str=this.txtConn.Text.Trim();
            SqlConnection myconn
=new SqlConnection(conn_str);
            SqlCommand mycomm
=new SqlCommand("MEMBER_TEACHER_GET",myconn);
            mycomm.CommandType
=CommandType.StoredProcedure;

            SqlParameter myp1
=new SqlParameter("@pid",SqlDbType.Int,4);
            mycomm.Parameters.Add(myp1);
            mycomm.Parameters[
"@pid"].Value="1001";

            SqlParameter myp2
=new SqlParameter("@depart",SqlDbType.Int,4);
            mycomm.Parameters.Add(myp2);
            mycomm.Parameters[
"@depart"].Value="1000";

            SqlParameter myp3
=new SqlParameter("@uname",SqlDbType.NVarChar,18);
            mycomm.Parameters.Add(myp3);
            mycomm.Parameters[
"@uname"].Value="t1";

            SqlParameter myp4
=new SqlParameter("@tname",SqlDbType.NVarChar,20);
            mycomm.Parameters.Add(myp4);
            mycomm.Parameters[
"@tname"].Value="教师1";

            SqlParameter myp5
=new SqlParameter("@status",SqlDbType.TinyInt,1);
            mycomm.Parameters.Add(myp5);
            mycomm.Parameters[
"@status"].Value="1";


            SqlDataAdapter myAdapter
=new SqlDataAdapter();
            myAdapter.SelectCommand
=mycomm;

            DataTable d
=new DataTable();
            myAdapter.Fill(d);
            myAdapter.Dispose();

            
this.dataGrid1.DataSource=d;

其中大部分的时间都放在对参数的传入上了。调用一个存储过程尚是如此,在一个大一点的项目里存储过程几百的个情况下,这样就会给程序

开发带来很大的重复劳动和繁琐的工作量。

而实际上,我们完全可以把这种繁琐的事情封装起来,这是封装后的所调用存储过程的全部代码:

conn c=new conn(this.txtConn.Text.Trim());
DataTable dt
=c.getDataProcedure("MEMBER_TEACHER_GET",new object[] {1001,1000,"t1","教师1",1});
this.dataGrid1.DataSource=dt;


最重只需要传入存储过程的名称和对应的参数即可。
下面分析conn类中getDataProcedure方法的实现。

在传统对存储过程参数的参入下是让存储过程里的参数名和传入参数值一一对应。而实际上,在数据库里,存储过程中的传入参数都是事先写

好,定死的,因此,我们完全可以省去这部分代码的输入,写一个方法getProcParameters让它去数据库里去取得,返回一个ArrayList列表。

其方法如下:

        public ArrayList getProcParameters(string proc)
        
{
            System.Data.SqlClient.SqlCommand mycomm
=new SqlCommand("sp_sproc_columns",myconn);
            DataTable td
=new DataTable();
            mycomm.CommandType
=CommandType.StoredProcedure;

            mycomm.Parameters.Add(
"@procedure_name",(object)proc);
            System.Data.SqlClient.SqlDataAdapter myadapter
=new SqlDataAdapter(mycomm);
            myadapter.Fill(td);
            myadapter.Dispose();

            ArrayList al
=new ArrayList();
            
for(int i=1;i<td.Rows.Count;i++)
            
{
                al.Add(td.Rows[i][
3].ToString());
            }

            
            
return al;
        }


这样,我们就可以在getDataProcedure里我们就可以自动将存储过程的参数和外面传入的参数值一一对应起来。问题就解决了。
        public DataTable getDataProcedure(string proc,object[] parms)
        
{
            System.Data.SqlClient.SqlCommand mycomm
=new SqlCommand(proc,myconn);
            mycomm.CommandType
=CommandType.StoredProcedure;

            ArrayList al
=getProcParameters(proc);

            
for(int i=0;i<parms.Length;i++)
            
{
                mycomm.Parameters.Add(al[i].ToString(),parms[i]);
            }


            SqlDataAdapter myAdapter
=new SqlDataAdapter();
            myAdapter.SelectCommand
=mycomm;

            DataTable d
=new DataTable();
            myAdapter.Fill(d);
            myAdapter.Dispose();

            
return d;
        }


当然,为了提高程序的效率,我们可以改写方法getProcParameters,可以从一个XML里读取存储过程的参数,或者也可以先将所有的参数初始

化到一个数组里去。有兴趣的朋友可以一试。

posted @ 2005-10-31 12:31 阿风的博客 阅读(197) | 评论 (0)编辑
已失效
PCPOP多功能外挂v1.1  下载地址 
MD5校验码: 38330253a3de4d1bf286ce190802d2b4

有BUG请在这里给我留言。

本程序采用C#编写,如果操作系统没有安装.NET Framework 语言包中文版,请先到Microsoft网站下载,地址:点击这里下载

[v1.1新增功能]:

  1:为赠送卡片和购买卡片新增了进度条,这样在赠送和购买大数量的卡片时有系统操作进度提示,从而方便自己掌握剩余的时间。
  2:为循环再放气球新增了一个进度条,这样可以通过进度条形象的提示你下次重新放气球所剩余的时间
  3:将操作日志控件由ListView换成TextBox,以方便用户拷贝日志内容。
  4:其他界面做了部分优化和修改

界面预览:

posted @ 2005-10-05 23:16 阿风的博客 阅读(458) | 评论 (4)编辑
已失效
PCPOP多功能外挂v1.0 Beta 下载地址 
MD5校验码: c4d4a350f0b986880fd0aad2d8c5832f

有BUG请在这里给我留言。

本程序采用C#编写,如果操作系统没有安装.NET Framework 语言包,请先到Microsoft网站下载,地址:点击这里下载

基本功能:

  1:在一个界面里查看自己的各种基本资料。
  2:为帖子自动放气球,并可设置循环再放。
  3:可以不受Web页面数量限制批量购买卡片。
  4:可以不受Web页面数量限制批量赠送卡片。
  5:可以修改自己的密码。
  6:可以提取和存入pop币。
  7:可以转帐其他用户pop币。
  8:可以使用代理连接。
  9:所有功能均采用多线程技术,因此在操作过程中不会出现软件假死现象。

说明:

  1:本程序采用C#编写,如果操作系统没有安装.NET Framework 语言包,将无法运行,请先到微软网站下载并安装语言包。
  2:为防止木马程序修改本软件,请在第一次使用本软件登录前先校验本软件的MD5,本软件相应版本的MD5请去我的博客查看。
  3:如果你发现本软件存在BUG或对本软件有什么好的建议,欢迎通过各种方式和我联系。




界面预览:


waigua1.JPG

posted @ 2005-10-05 13:42 阿风的博客 阅读(186) | 评论 (2)编辑