MS Sql Server 提供了很多数据库修复的命令,当数据库质疑或是有的无法完成读取时可以尝试这些修复命令。
1. DBCC CHECKDB
重启服务器后,在没有进行任何操作的情况下,在SQL查询分析器中执行以下SQL进行数据库的修复,修复数据库存在的一致性错误与分配错误。
use master
declare @databasename varchar(255)
set @databasename='需要修复的数据库实体的名称'
exec sp_dboption @databasename, N'single', N'true' --将目标数据库置为单用户状态
dbcc checkdb(@databasename,REPAIR_ALLOW_DATA_LOSS)
dbcc checkdb(@databasename,REPAIR_REBUILD)
exec sp_dboption @databasename, N'single', N'false'--将目标数据库置为多用户状态
然后执行 DBCC CHECKDB('需要修复的数据库实体的名称') 检查数据库是否仍旧存在错误。注意:修复后可能会造成部分数据的丢失。
2. DBCC CHECKTABLE
如果DBCC CHECKDB 检查仍旧存在错误,可以使用DBCC CHECKTABLE来修复。
use 需要修复的数据库实体的名称
declare @dbname varchar(255)
set @dbname='需要修复的数据库实体的名称'
exec sp_dboption @dbname,'single user','true'
dbcc checktable('需要修复的数据表的名称',REPAIR_ALLOW_DATA_LOSS)
dbcc checktable('需要修复的数据表的名称',REPAIR_REBUILD)
------把’ 需要修复的数据表的名称’更改为执行DBCC CHECKDB时报错的数据表的名称
exec sp_dboption @dbname,'single user','false'
3. 其他的一些常用的修复命令
DBCC DBREINDEX 重建指定数据库中表的一个或多个索引
用法:DBCC DBREINDEX (表名,’’) 修复此表所有的索引。
还有其他很多修复命令,诸如DBCC CHECKIDENT 等等,用到的概率比较小,大家可以在ms sql server 的 联机丛书中检索一下。
"我已不上学好多年"之短信邮箱
昨天晚上手机收到当当的促销短信,内容大概是:尊敬的当当网顾客,快开学了,我们为你准备了.....
今天又收到淘宝的邮箱:亲爱的huerreson,快开学了吧,东东有准备好吗? 小二这边也整理了一份清单哦,快来看看你还缺什么吧~~~点击这里查看哦~
按键选择下拉列表
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>按键选择下拉列表</title>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'/>
<meta name="generator" content="editplus" />
<meta name="author" content="Huerreson,huerreson[at]msn.com" />
<meta name="keywords" content="" />
<meta name="description" content="" />
<style type="text/css">
body{font-size:12px;font-family:verdana;}
label{font-weight:bold;}
h1{font-size:20px;}
h2{font-size:14px;}
.demo{width:80%;border:1px solid #ccc;background:#f8f8f8;margin-bottom:5px;padding:5px;}
#demo3{background:#ABE1AC;}
.explain{width:80%;font-size:12px;color:#333;text-align:right;}
</style>
<script type="text/javascript" language="javascript">
//<![[CDATA
var keyDownTimes = 0;
function selectBySortLetter(Obj)
{
var nav = navigator.appVersion;
if (nav.indexOf('MSIE')!=-1){
var keyCode = event.keyCode;
var realKey = String.fromCharCode(keyCode);
var ObjOptionLen = Obj.options.length;
var MatchTimes = 0;
var MatchOptionIndexs = "";
for (var i=0;i<ObjOptionLen;i++){
if (Obj.options[i].SortLetter == realKey)
{
MatchTimes = MatchTimes + 1;
MatchOptionIndexs = MatchOptionIndexs + i +",";
}
}
if (MatchTimes>0)
{
if (MatchTimes>keyDownTimes)
{
var MatchOptionArray = new Array (MatchTimes);
MatchOptionArray = MatchOptionIndexs.substr(0,MatchOptionIndexs.lastIndexOf(',')).split(',');
Obj.options[MatchOptionArray[keyDownTimes]].selected = true;
keyDownTimes = keyDownTimes + 1;
}
else
{
keyDownTimes = 0;
}
}
}
}
//]]>
</script>
</head>
<body>
<h1>模拟下拉列表按键查找选择</h1>
<div id="demo1" class="demo">
<h2>下拉列表可以使用按键匹配选项文本首字母来选择,如:列表1:</h2>
<label for="demoList1">列表1</label>
<select id="demoList1">
<option value="CN">China</option>
<option value="CA">Canada</option>
<option value="HK">Hong Kong</option>
<option value="ID">Indonesia</option>
<option value="KR">South Korea</option>
<option value="MY">Malaysia</option>
<option value="SG">Singapore</option>
<option value="TW">Taiwan</option>
<option value="UK">United Kingdom</option>
<option value="US">United States</option>
</select>
<div>这种情况下,不需要做任何工作,就能使用按键查找.</div>
</div>
<div id="demo2" class="demo">
<h2>但是遇到选项文本不是英文字母的情况下,如列表2:</h2>
<label for="demoList2">列表2</label>
<select id ="demoList2">
<option value="">请选择省份</option>
<option value="安徽">安徽</option>
<option value="北京">北京</option>
<option value="重庆">重庆</option>
<option value="福建">福建</option>
<option value="甘肃">甘肃</option>
<option value="广东">广东</option>
<option value="广西">广西</option>
<option value="贵州">贵州</option>
<option value="海南">海南</option>
<option value="河北">河北</option>
<option value="河南">河南</option>
<option value="黑龙江">黑龙江</option>
<option value="湖北">湖北</option>
<option value="湖南">湖南</option>
<option value="江苏">江苏</option>
<option value="江西">江西</option>
<option value="吉林">吉林</option>
<option value="辽宁">辽宁</option>
<option value="内蒙">内蒙</option>
<option value="宁夏">宁夏</option>
<option value="青海">青海</option>
<option value="山东">山东</option>
<option value="山西">山西</option>
<option value="陕西">陕西</option>
<option value="上海">上海</option>
<option value="四川">四川</option>
<option value="天津">天津</option>
<option value="西藏">西藏</option>
<option value="新疆">新疆</option>
<option value="云南">云南</option>
<option value="浙江">浙江</option>
</select>
<div>这种情况下,按键查找就没法发挥作用了;为了避免这种情况,我见过有些网站特意在开头加上一个英文字母.如选项"安徽"变成了"A-安徽";但是我觉得这样不美观.</div>
</div>
<div id="demo3" class="demo">
<h2>基于这个出发点,我用JS模拟实现了类似功能,演示列表3:</h2>
<label for="demoList3">列表3</label>
<select id ="demoList3" οnkeydοwn="selectBySortLetter(this)">
<option value="">请选择省份</option>
<option value="安徽" SortLetter="A">安徽</option>
<option value="北京" SortLetter="B">北京</option>
<option value="重庆" SortLetter="C">重庆</option>
<option value="福建" SortLetter="F">福建</option>
<option value="甘肃" SortLetter="G">甘肃</option>
<option value="广东" SortLetter="G">广东</option>
<option value="广西" SortLetter="G">广西</option>
<option value="贵州" SortLetter="G">贵州</option>
<option value="海南" SortLetter="H">海南</option>
<option value="河北" SortLetter="H">河北</option>
<option value="河南" SortLetter="H">河南</option>
<option value="黑龙江" SortLetter="H">黑龙江</option>
<option value="湖北" SortLetter="H">湖北</option>
<option value="湖南" SortLetter="H">湖南</option>
<option value="江苏" SortLetter="J">江苏</option>
<option value="江西" SortLetter="J">江西</option>
<option value="吉林" SortLetter="J">吉林</option>
<option value="辽宁" SortLetter="L">辽宁</option>
<option value="内蒙" SortLetter="N">内蒙</option>
<option value="宁夏" SortLetter="N">宁夏</option>
<option value="青海" SortLetter="Q">青海</option>
<option value="山东" SortLetter="S">山东</option>
<option value="山西" SortLetter="S">山西</option>
<option value="陕西" SortLetter="S">陕西</option>
<option value="上海" SortLetter="S">上海</option>
<option value="四川" SortLetter="S">四川</option>
<option value="天津" SortLetter="T">天津</option>
<option value="西藏" SortLetter="X">西藏</option>
<option value="新疆" SortLetter="X">新疆</option>
<option value="云南" SortLetter="Y">云南</option>
<option value="浙江" SortLetter="Z">浙江</option>
</select>
</div>
<div class="explain">说明:只支持Internet Explorer.</div>
</body>
</html>
asp.net 1.x和asp.net 2.0的程序不能共用一个应用程序池
在同一 IIS 进程中不可能运行两个不同的 ASP.NET 版本。请使用 IIS 管理工具重新配置服务器以在一个单独的进程中运行应用程序。
有关更多信息,请参阅在 http://go.microsoft.com/fwlink/events.asp 的帮助和支持中心。
ISAPI_Rewrite 防盗链
[ISAPI_Rewrite]
RewriteCond Host: (.+)
RewriteCond Referer: (?!http:///1.*).*
RewriteCond Cookie: (?!(.+;)*id=valid(;.*)?)
RewriteRule .*/.(?:swf|gif|jpg|png|wmv|mp3|rmvb|rar|zip) http/://www.domain.com.cn/iisrewitecond/block.gif [I,O,R,L]
我们把http.ini文件贴在上面,大家不难看出,这个差别在什么地方.为什么有些人的 /block.gif不正常显示!为什么有些人的图片全都被BLOCK.GIF所代替!
数据库MMC不能打开文件SQL Server Enterprise Manager.MSC
打开企业管理器时提示的错误
“Microsoft Management Console
—————————
MMC 不能打开文件 C:/Program Files/Microsoft SQL Server/80/Tools/Binn/SQL Server Enterprise Manager.MSC。
这可能是由于文件不存在,不是一个 MMC 控制台,或者用后来版本的 MMC 创建。也可能是由于您没有访问此文件的足够权限。
—————————
确定
—————————”
解决方法:
运行mmc,控制台–添加/删除管理单元–添加–找到Microsoft SQL 企业管理器–添加–关闭–确定(注:此处点击添加完后就可以关闭了,不要等待响应,如果你多次点击了添加,后来可以看到n多个sql企业管理器。。。),再回到控制台–选项–控制台模式选择”用户模式完全访问”–将下面的选择全部取消。最后,从控制台–另存为–存储为:C:/Program Files/Microsoft SQL Server/80/Tools/BINN/SQL Server Enterprise Manager.MSC(即SqlServer的安装目录下的binn文件夹)。
实在不行的话,重新注册DLL
运行:regsvr32 C:/Windows/system32/msxml3.dll
什么是DBO
DBO是每个数据库的默认用户,具有所有者权限,即DbOwner
通过用DBO作为所有者来定义对象,能够使数据库中的任何用户引用而不必提供所有者名称。
比如:你以User1登录进去并建表Table,而未指定DBO,
当用户User2登进去想访问Table时就得知道这个Table是你User1建立的,要写上User1.Table,如果他不知道是你建的,则访问会有问题。
如果你建表时把所有者指给了Dbo,则别的用户进来时写上Dbo.Table就行了,不必知道User1。
不光表是如此,视图等等数据库对象建立时也要如此才算是好。
建表、存储过程、视图等数据库对象时,其对应的所有者是创建它的用户。则除了该用户其他登录用户要引用这些东东时,都要加上前缀,很是麻烦。而且,程序因此易出错,你查来查去问题确出在这,浪费你时间。
怎么样把sql server 2000的用户表的所有者,改成dbo,而不是用户名
附修改存储过程的方法,在查询器中执行:
exec sp_changeobjectowner 'usera.hishop_creatorder', 'dbo'),就把 usera的存储过程改为dbo所有了。
答:方法一:右键点击该表-》设计表,在上面的一排小图标中,点最后一个“条件约束”,点“表”页,在里面更改所有者。(若没有条件约束的小图标,可以点右键,能看到一个“check约束”的选项)
方法二:利用脚本直接执行,用系统帐号或者超户登陆到该数据库,然后执行下面语句:
sp_configure 'allow updates','1'
go
reconfigure with override
go
update sysobjects set uid=1 where uid<>1
go
sp_configure 'allow updates','0'
go
reconfigure with override
第二种方法只能使用一次,第二次使用会出错。
更改MSSQLServer的默认端口后连接字段的相应修改
"Provider=sqloledb; Data Source=190.190.200.100, 1433;Network Library=DBMSSOCN;Initial Catalog=pubs;User ID=sa;Password=asdasd;"
让你的to-do list更有效的9个建议
我们每个人都想将工作和生活管理得井井有条,有效的时间管理方法对于生活的帮助自然是不言而喻,所以相信大部分人都和我一样多少使用过一些时间管理的工具,最常见的就是在outlook中带有的“任务”(to-do list)功能,但往往用过一段时间后就会因为种种原因而不再使用,最重要的原因往往就是to-do list发挥不了很好的效果。我就不只一次地兴致勃勃地告诉自己“这次是真的要开始实施to-do list管理了”,但也不只一次地以失败和不能坚持而告终。
时间管理专家Mark Forster认为to-do list没有效果的主要原因有两个:一是你从来不会完整地完成一份to-do list,二是你往往在完成一个工作后,会再想到几个后续需要跟进的事,所以to-do list会越来越长,越来越多。针对这种情况,他还给出改进to-do lists的九个建议:
1、将to-do list写在纸上而不是放在电脑上
2、不要重新抄写,保持各项目的原貌以及修改,你也可以知道每个项目在列表上保留了多长时间
3、谨慎选择to-do list上的项目,只写下那些你真正有时间去完成的工作,而且需要预留需要应付各种意外情况的时间
4、新想法单独列出,不要将新想法直接写到to-do list中,单独列个“日后可能做”的列表
5、保持每个项目都是可具体执行的行动,最好不要写“完成XX项目的报告”这样的项目,而是写“完成XX项目报告的提纲”等等
6、不要为每个项目分优先级,这点与我们一般的了解有很大的不同。Mark认为如果为项目分优先级,那么那些优先级低的项目就永远都不会被完成,如果我们已经谨慎地确定了必须作的项目才写到to-do lists上,那么再区分优先级就没有什么意义
7、从头开始浏览to-do list,可以先选择你目前最喜欢做的事来做,但一定要从头开始逐一浏览,而不要随机挑选
8、每次完成一项工作后,都再次从头开始浏览
9、对于email,也按照时间顺序从头开始浏览,选择需要处理的工作
其实Mark也说,他自己并不喜欢to-do lists。虽然上面的建议应该会对我们改进任务列表的效果有所帮助,但我仍对实际效果持怀疑态度,而且在阅读了这篇文章后更加感觉GTD的方法对于时间管理以及提高工作效率会有很大的帮助,准备在最近整理一些相关资料,并开始GTD。
Timeout expired. The timeout period elapsed prior to completion…
via:http://www.ironspeed.com/Designer/4.2.2/WebHelp/Iron_Speed_Designer_Help.htm#Part_VI/Timeout_expired_The_timeout_period_elapsed_prior_to_completion.htm
Timeout expired. The timeout period elapsed prior to completion…
Problem
You receive this error message when your application attempts to call a stored procedure or other external program:
Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
This error occurs when a database query or stored procedure is not able to complete execution before a pre-set timeout period expires.
Solution
Step 1: Increase the amount of time that ASP.NET waits for the database query to run before throwing an exception. Programmatically set the CommandTimeout property in the IDbCommand object in a code customization in your application. IDbCommand is a .NET Framework object. CommandTimeout specifies the amount of time in seconds that .NET waits for the database query command to execute. Set that value high enough to exceed the amount of time required to execute your query or database stored procedure. You may need to adjust this timeout parameter on an application-by-application basis.
C#:
System.Data.IDbCommand.CommandTimeout = 50;
Visual Basic .NET:
System.Data.IDbCommand.CommandTimeout = 50
Step 2: Increase the amount of time that your database driver waits on your connection. This is different from the IDbCommand.CommandTimeout property. Both must be set properly for your query or stored procedure to run.
See Timeout error… for details.
See Also
Part VII: Troubleshooting Applications
Global中使用线程隔时执行一项任务
GLOBAL中线程的应用(书中学习,整理了一下),以下是过5分钟删除一张表的记录
using System;
using System.Collections;
using System.ComponentModel;
using System.Web;
using System.Web.SessionState;
using DataBase;
using System.Data.SqlClient;
using System.Web.Security;
using System.IO ;
using System.Threading;
namespace FreightCom
{
/** <summary>
/// Global 的摘要说明。
/// </summary>
public class Global : System.Web.HttpApplication
{
/** <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.IContainer components = null;
private OnLineUser ou=new OnLineUser();
private UserLoginInfo Login=new UserLoginInfo();
public Global()
{
InitializeComponent();
}
protected void Application_Start(Object sender, EventArgs e)
{
SchedulerAgent.StartAgent();
}
protected void Session_Start(Object sender, EventArgs e)
{
}
protected void Application_BeginRequest(Object sender, EventArgs e)
{
}
protected void Application_EndRequest(Object sender, EventArgs e)
{
}
protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
}
protected void Application_Error(Object sender, EventArgs e)
{
}
protected void Session_End(Object sender, EventArgs e)
{
}
protected void Application_End(Object sender, EventArgs e)
{
SchedulerAgent.Stop();
}
Web 窗体设计器生成的代码#region Web 窗体设计器生成的代码
/** <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
}
#endregion
}
public interface ISchedulerJob
{
void Execute();
}
public class SchedulerConfiguration
{
private int sleepInterval;
private ArrayList jobs=new ArrayList();
public int SleepInterval
{
get{return sleepInterval;}
}
public ArrayList Jobs
{
get {return jobs;}
}
public SchedulerConfiguration(int newSleepInterval)
{
sleepInterval=newSleepInterval;
}
}
public class Scheduler
{
private SchedulerConfiguration configuration = null;
public Scheduler(SchedulerConfiguration config)
{
configuration=config;
}
public void Start()
{
while(true)
{
try
{
foreach(ISchedulerJob job in configuration .Jobs)
{
job.Execute();
}
}
catch{}
finally
{
Thread.Sleep(configuration.SleepInterval);
}
}
}
}
public class SchedulerAgent
{
private static System.Threading.Thread schedulerThread=null;
public static void StartAgent()
{
SchedulerConfiguration config=new SchedulerConfiguration(1000*300);//设置时间,此处为5分钟
config.Jobs.Add(new AlertJob());
Scheduler scheduler=new Scheduler(config);
System.Threading.ThreadStart myThreadStart=new System.Threading.ThreadStart(scheduler.Start);
schedulerThread=new System.Threading.Thread(myThreadStart);
schedulerThread.Start();
}
public static void Stop()
{
if(null!=schedulerThread)
{
schedulerThread.Abort();
}
}
}
public class AlertJob:ISchedulerJob
{
private OnLineUser ou=new OnLineUser();
public void Execute()
{
ou.UserDelOnline();//一个删除的方法
}
}
}
asp.net防止页面重复提交
解决重复提交:OnClientClick="this.disabled=true;this.form.submit();" UseSubmitBehavior="False"
解决方法二:
this.btnSubmit.Attributes["onclick"] = this.GetPostBackEventReference(this.btnSubmit) + ";this.disabled=true;"; //防止重复提交
Response.Buffer = ture;
Reponse.ExpirseAbsolute=DataTime.Now.AddSecond(-1);
Response.Expirse = 0;
Response.CacheControl = "no-cache";
.NET开源项目介绍及资源推荐:数据持久层
在.NET平台下,关于数据持久层框架非常多,本文主要对如下几种做简要的介绍并推荐一些学习的资源:
1.NHibernate
2.NBear
3.Castle ActiveRecord
4.iBATIS.NET
5.DAAB
附加介绍:DLinq
一.NHibernate
提起NHibernate,相信大家都不陌生,NHibernate来源于非常优秀的基于Java的Hibernate关系型持久化工具,它从数据库底层来持久化.Net对象到关系型数据库,NHibernate为我们完成这一切,而不用自己写SQL语句去操作数据库对象,所写的代码仅仅和对象关联,NHibernat自动产生SQL语句,并确保对象提交到正确的表和字段中去.大量减少开发时人工使用SQL和ADO.NET处理数据的时间. NHibernate可以帮助消除或者包装那些针对特定数据库的SQL代码,并且把结果集从表格的表示形式转换到一系列的对象去。NHibernate采用XML文件配置的方式,每一个实体类都会对应一个映射文件,如下面的例子:
public class User
{
public User()
{
}
private string id;
private string userName;
private string password;
private string emailAddress;
private DateTime lastLogon;
public string Id
{
get { return id; }
set { id = value; }
}
public string UserName
{
get { return userName; }
set { userName = value; }
}
public string Password
{
get { return password; }
set { password = value; }
}
public string EmailAddress
{
get { return emailAddress; }
set { emailAddress = value; }
}
public DateTime LastLogon
{
get { return lastLogon; }
set { lastLogon = value; }
}
}它对应的.hbm.xml文件如下: <?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
<class name="NHibernateWebDemo.Model.User, NHibernateWebDemo.Model" table="users">
<id name="Id" column="LogonId" type="String" length="20">
<generator class="assigned" />
</id>
<property name="UserName" column= "Name" type="String" length="40"/>
<property name="Password" type="String" length="20"/>
<property name="EmailAddress" type="String" length="40"/>
<property name="LastLogon" type="DateTime"/>
</class>
</hibernate-mapping>
官方主页:http://www.nhibernate.org/
学习资源
园子里首推DDL的Blog:http://www.cnblogs.com/renrenqq/,有NHibernate文档的中文翻译以及DLL写的一些非常优秀的NHibernate文章。
大名鼎鼎的张老三:http://blog.csdn.net/billy_zh/category/22383.aspx
Aero的Nhibernate学习手记系列:http://www.cnblogs.com/chwkai/category/32514.html
无心之柳的Blog也非常值得推荐:http://www.cnblogs.com/9527/
博客园O/R Mapping团队:http://www.cnblogs.com/team/ORMapping.html
二.NBear
园子里Teddy开发的NBear大家都非常熟悉,现在已经发布了3.0正式版。NBear包含的组件不仅仅是数据持久层,还包含了IOC,分布式组件和Web组件。看一下Teddy对于NBear的介绍:
NBear的核心包括一个泛型、强类型的的ORM数据持久化接口、一组相关的Entity相关组件、高性能分布式组件、Web组件,因此:
1、NBear最适合开发各类基于ASP.NET 2.0,对性能要求较高的Web程序。NBear.Web组件提供了许多加速Web开发的组件,将使您基于标准 ASP.NET方式的开发效率大大提高;同时,简单易用、性能突出的泛型持久化支持,则将使您能够将更多注意力集中到业务开发,同时也不会有传统ORM持久化框架的性能问题和繁琐配置需要(NBear几乎不需手动配置,性能则接近DAAB)。
2、基于MQ和.Net Remoting的高性能分布式组件,将使您开发和维护分布式程序更加容易。一个基于NBear.IoC模块的开发的应用程序甚至无需重新编译就能部属为真正的负载均衡的分布式程序。
3、对于桌面应用程序,NBear同样是一个几乎没有什么学习曲线(多少人会为写一个小小的日历程序而仔细研究透彻Hibernate的参考手册?)、实用高效的数据持久化方案。
4、随着NBearV3带来的全面的ORM支持、更详细的文档和教程,和全面的代码生成工具,NBear也已经可以被用于企业级程序开发。
官方首页:http://teddyma.cnblogs.com/articles/Ilungasoft_Framework.html
学习资源
学习资源当然首推Teddy的个人Blog:http://www.cnblogs.com/teddyma/
博客园NB团队:http://nbteam.cnblogs.com/
三.Castle ActiveRecord
ActiveRecord是Castle中的一个子项目,现在的版本是RC1。它同样是一个非常优秀的持久层框架,在底层封装了NHibernate,改用Attribute来代替配置文件,这样就不用再像NHibernate那样去编写复杂的配置文件。如下代码片断所示:
[ActiveRecord("Users")]
public class User : ActiveRecordBase
{
private int _id;
private string _name;
private string _password;
private string _emailAddress;
private DateTime _lastLogon;
[PrimaryKey(PrimaryKeyType.Identity, "LogonID")]
public int Id
{
get { return _id; }
set { _id = value; }
}
[Property("LogonName")]
public string Name
{
get { return _name; }
set { _name = value; }
}
[Property("Password")]
public string Password
{
get { return _password; }
set { _password = value; }
}
[Property("EmailAddress")]
public string Address
{
get { return _emailAddress; }
set { _emailAddress = value; }
}
[Property("LastLogon")]
public DateTime LastLogon
{
get { return _lastLogon; }
set { _lastLogon = value; }
}
}
官方主页:http://www.castleproject.org
学习资源
官方文档:http://www.castleproject.org/activerec ... tation/v1rc1/index.html
叶子的家:http://wj.cnblogs.com/
TerryLee的Castle开发系列:
http://terrylee.cnblogs.com/archiv ... astl_ioc_article.html
Castle项目成员之一ayende的Blog:http://www.ayende.com/Blog/
四.iBATIS.NET
iBATIS.NET分为DataMapper和DataAccess两部分,应该说DataMapper是这个框架的核心,DataMapper使用XML文件来实现从实体到SQL statements的映射,学习起来非常简单,是用DataMapper后,我们可以自由的使用SQL语句或者存储过程;DataAccess允许我们通过一个简单的接口来操作数据,而不必了解底层实现的细节。如下代码片断:
[Serializable]
public class Person
{
private int id;
private string firstName;
private string lastName;
private DateTime? birthDate;
private double? weightInKilograms;
private double? heightInMeters;
public Person() { }
public int Id
{
get { return id; }
set { id = value; }
}
public string FirstName
{
get { return firstName; }
set { firstName = value; }
}
public string LastName
{
get { return lastName; }
set { lastName = value; }
}
public DateTime? BirthDate
{
get { return birthDate; }
set { birthDate = value; }
}
public double? WeightInKilograms
{
get { return weightInKilograms; }
set { weightInKilograms = value; }
}
public double? HeightInMeters
{
get { return heightInMeters; }
set { heightInMeters = value; }
}
}
映射文件如下:
<?xml version="1.0" encoding="utf-8" ?>
<sqlMap namespace="Person" xmlns="http://ibatis.apache.org/mapping"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<alias>
<typeAlias alias="Person" type="IBatisNetDemo.Domain.Person,IBatisNetDemo" />
</alias>
<resultMaps>
<resultMap id="SelectAllResult" class="Person">
<result property="Id" column="PER_ID" />
<result property="FirstName" column="PER_FIRST_NAME" />
<result property="LastName" column="PER_LAST_NAME" />
<result property="BirthDate" column="PER_BIRTH_DATE" />
<result property="WeightInKilograms" column="PER_WEIGHT_KG" />
<result property="HeightInMeters" column="PER_HEIGHT_M" />
</resultMap>
</resultMaps>
<statements>
<select id="SelectAllPerson" resultMap="SelectAllResult">
select
PER_ID,
PER_FIRST_NAME,
PER_LAST_NAME,
PER_BIRTH_DATE,
PER_WEIGHT_KG,
PER_HEIGHT_M
from PERSON
</select>
<select id="SelectByPersonId" resultClass="Person" parameterClass="int">
select
PER_ID,
PER_FIRST_NAME,
PER_LAST_NAME,
PER_BIRTH_DATE,
PER_WEIGHT_KG,
PER_HEIGHT_M
from PERSON
where PER_ID = #value#
</select>
<insert id="InsertPerson" parameterclass="Person" >
<selectKey property="Id" type="post" resultClass="int">
${selectKey}
</selectKey>
insert into Person
( PER_FIRST_NAME,
PER_LAST_NAME,
PER_BIRTH_DATE,
PER_WEIGHT_KG,
PER_HEIGHT_M)
values
(#FirstName#,#LastName#,#BirthDate#, #WeightInKilograms#, #HeightInMeters#)
</insert>
<update id="UpdatePerson" parameterclass="Person">
<![CDATA[ update Person set
PER_FIRST_NAME =#FirstName#,
PER_LAST_NAME =#LastName#,
PER_BIRTH_DATE =#BirthDate#,
PER_WEIGHT_KG=#WeightInKilograms#,
PER_HEIGHT_M=#HeightInMeters#
where
PER_ID = #Id# ]]>
</update>
<delete id="DeletePerson" parameterclass="Person">
delete from Person
where
PER_ID = #Id#
</delete>
</statements>
</sqlMap>官方主页:http://ibatis.apache.org/
学习资源
官方文档:http://opensource.atlassian.com/confluen ... IBATIS/Quick+Start+Guide
善友的iBATIS.NET开发指南系列:http://www.cnblogs.com/shanyou/archive/2006/04/29/388610.html
五.DAAB
DAAB是微软Enterprise Library中的一个应用程序块,能够帮助我们实现通用的数据访问,所以也把它列在这里介绍一下。DAAB使应用程序中的数据访问在不知道具体的数据库系统的情况下进行,相信很多朋友对DAAB都很熟性并且已经在项目中使用,就不多介绍了,看一个简单的代码片断:
public string GetCustomerList()
{
// 创建Database对象
Database db = DatabaseFactory.CreateDatabase();
// 使用SQL语句创建DbCommand对象
string sqlCommand = "Select CustomerID, Name, Address, City, Country, PostalCode " +
"From Customers";
DbCommand dbCommand = db.GetSqlStringCommand(sqlCommand);
StringBuilder readerData = new StringBuilder();
// 调用ExecuteReader方法
using (IDataReader dataReader = db.ExecuteReader(dbCommand))
{
while (dataReader.Read())
{
// Get the value of the 'Name' column in the DataReader
readerData.Append(dataReader["Name"]);
readerData.Append(Environment.NewLine);
}
}
return readerData.ToString();
}
官方主页:http://msdn.microsoft.com/practices/
学习资源
企业的帮助文档和Hands On Lab
TerryLee的Enterprise Library系列:http://www.cnblogs.com/Terrylee/archi ... nterprise_Library.html
附加介绍:DLinq
DLinq虽然不能算是开源框架,但是说到数据持久,还是提一下比较好,DLinq是微软下一代数据库集成查询语言,在这之前微软曾经尝试过ObjectSpace,最后是不了了之。DLinq实现的方式有点类似于前面说过的ActiveRecord,不支持使用外部的XML配置文件,而是使用了Attribute的方式,如下代码片断所示:
[Table(Name="Customers")]
public class Customer
{
[Column(Id=true)]
public string CustomerID;
[Column]
public string City;
}
官方主页:http://msdn.microsoft.com/netframework/future/linq/
学习资源
下载LINQ May CTP版:http://msdn.microsoft.com/data/ref/linq/
ScottGu的Blog:http://weblogs.asp.net/scottgu/default.aspx
最后值得一提的是,微软又推出个Ado.net vNext,使用映射文件来配置,更加类似于NHibernate。关于持久层框架,还有很多,这里就不再介绍了,如Grove等。
原文地址:http://www.cnblogs.com/wuweizhi/archive/2007/04/03/697903.html
SqlParameter让我们尽可能的避免Sql注入
via:http://99love.blueidea.com/archives/2007/4572.shtml
最近一些时间在BI的论坛上看到一些朋友的提问,有一些是关于sql语句的问题
虽然重点不是问sql注入的,但这些朋友的的程序的确存在sql注入的问题,这是很危险的。
关于Sql注入的基本概念,相信不需多说,大家都清楚,经典的注入语句是' or 1=1--
单引号而截断字符串,“or 1=1”的永真式的出现使得表的一些信息被暴露出来,如果sql语句是select * from 的话,可能你整个表的信息都会被读取到,更严重的是,如果恶意使用都使用drop命令,那么可能你的整个数据库得全线崩溃。
当然,现在重点不是讲sql注入的害处,而是说说如何最大限度的避免注入问题。
sql注入的存在在最大危害,是sql的执行语句没有和控制语句分开,我们想要select一些东西,但用户可能拼出' or 1=1甚至再加上delete/update/drop,后来是属于控制语句了,所以要避免sql的注入,就必须把查询语句与控制语句分开。
SqlParameter给我们提供了一个很好的类,有了它,我们可以不现拼接字符串,也可以不再担心单引号带来的惨剧,因为,这一切会有人来为我们完成的。
简单的给个示例
传统的查询语句的sql可能为
string sql="select * from users where user_id='"+Request.QueryString["uid"]+"'";
很显然,我们在这里拼接了字符串,这就给sql注入留下了可乘之机。
现在,我们要改写这样的语句,使用SqlParameter来做
SqlCommand SqlCmd = new SqlCommand(sql, SqlConn);
SqlParameter _userid = new SqlParameter("uid", SqlDbType.Int);
_userid.Value = Request.QueryString["u_id"];
SqlCmd.Parameters.Add(_userid);
这样,我们可以保证外接参数能被正确的转换,单引号这些危险的字符也会转义了,不会再对库造成威胁。
当然,这仅是一个示例而已,在真实的情况下,可能你还要对 Request.QueryString["u_id"]进行必要的检测与分析,这样才安全
所以,使用参数化的sql语句,是一种很好的做法,不过,我们也还有更好的办法,那就是使用参数化的存储过程,如果你有兴趣,可以继续探讨。
做网站的一些定律
1.250定律
拉德认为:每一位顾客身后,大体有250名亲朋好友。如果您赢得了一位顾客的好感,就意味着赢得了250个人的好感;反之,如果你得罪了一名顾客,也就意味着得罪了250 名顾客。 在你的网站访客中,一个访客可能可以带来一群访客,任何网站都有起步和发展的过程,这个过程中此定律尤其重要。
2.达维多定律
达维多认为,一个企业要想在市场上总是占据主导地位,那么就要做到第一个开发出新产品,又第一个淘汰自己的老产品。 国内网站跟风太严重,比如前段时间的格子网,乞讨网,博客网,一个成功了,大家一拥而上。但实际效果是,第一个出名的往往最成功,所以在网站的定位上,要动自己的脑筋,不是去捡人家剩下的客户。同理,买人家出售的数据来建站效果是很糟糕的。
3.木桶定律
水桶定律是指,一只水桶能装多少水,完全取决于它最短的那块木板。这就是说任何一个组织都可能面临的一个共同问题,即构成组织的各个部分往往决定了整个组织的水平。 注意审视自己的网站,是速度最糟糕?美工最糟糕?宣传最糟糕?你首先要做的,不是改进你最强的,而应该是你最薄弱的。
4.马太效应
《新约》中有这样一个故事,一个国王远行前,交给三个仆人每人一锭银子,吩咐他们:“你们去做生意,等我回来时,再来见我。”国王回来时,第一个仆人说: “主人,你交给我们的一锭银子,我已赚了10锭。”于是国王奖励他10座城邑。第二个仆人报告说:“主人,你给我的一锭银子,我已赚了5锭。” 于是国王例奖励了他5座城邑。第三个仆人报告说:“主人,你给我的一锭银子,我一直包在手巾里存着,我怕丢失,一直没有拿出来。”于是国王命令将第三个仆人的一锭银子也赏给第一个仆人,并且说:“凡是少的,就连他所有的也要夺过来。凡是多的,还要给他,叫他多多益善。”这就是马太效应。 在同类网站中,马太效应是很明显的。一个出名的社区,比一个新建的社区,更容易吸引到新客户。启示是,如果你无法把网站做大,那么你要做专。作专之后再做大就更容易。
5.手表定理
手表定理是指一个人有一只表时,可以知道现在是几点钟,而当他同时拥有两只表时却无法确定。
一个网站,你只需要关注你特定的用户群需求。不要在意不相干人的看法。
6.不值得定律
不值得定律:不值得做的事情,就不值得做好 不要过度seo,如果你不是想只做垃圾站。不要把时间浪费在美化再美化页面,优化再优化程序,在你网站能盈利后,这些事情可以交给技术人员完成。
7.彼得原理
劳伦斯.彼得认为:在各种组织中,由于习惯于对在某个等级上称职的人员进行晋升提拔,因而雇员总是趋向于晋升到其不称职的地位。
不要轻易改变自己网站的定位。如博客网想变门户,盛大想做娱乐,大家拭目以待吧。
8.零和游戏原理
当你看到两位对弈者时,你就可以说他们正在玩“零和游戏”。因为在大多数情况下, 总会有一个赢,一个输,如果我们把获胜计算为得1分,而输棋为-1分,那么,这两人得分之和就是:1+(-1)=0 不要把目光一直盯在你的竞争网站上,不要花太多时间抢它的访客。我们把这些时间用来寻找互补的合作网站,挖掘新访客。
9.华盛顿合作规律
华盛顿合作规律说的是: 一个人敷衍了事,两个人互相推诿, 三个人则永无成事之日。
如果你看准一个方向,你自己干,缺人手就招。不要轻易找同伴一起搞网站,否则你会发现,日子似乎越过越快了,事情越做越慢了。
10.邦尼人力定律
一个人一分钟可以挖一个洞,六十个人一秒种却挖不了一个洞。合作是一个问题,如何合作也是一个问题。你需要有计划。
11.牛蛙效应
把一只牛蛙放在开水锅里,牛蛙会很快跳出来;但当你把它放在冷水里,它不会跳出来,然后慢慢加热,起初牛蛙出于懒惰,不会有什么动作,当水温高到它无法忍受的时候,想出来,但已经没有了力气。 如果你是soho,注意关注你的财务。不要等到没钱了再想怎么挣,你会发现那时候挣钱更难。
12.蘑菇管理
蘑菇管理是许多组织对待初出茅庐者的一种管理方法,初学者被置于阴暗的角落(不受重视的部门,或打杂跑腿的工作),浇上一头大粪(无端的批评、指责、代人受过),任其自生自灭(得不到必要的指导和提携)。
做网站毕竟要遭遇这样的阶段,搜索引擎不理你,友情链接找不到,访客不上门。这是磨练。
13.奥卡姆剃刀定律
如无必要,勿增实体。
把网站做得简单,再简单,简单到非常实用,而不是花俏。google的首页为什么比雅虎好?
14.巴莱多定律(Paredo 也叫二八定律)
你所完成的工作里80%的成果,来自于你20%的付出;而80%的付出,只换来20%的成果。
随时衡量你所做的工作,哪些是最有效果的。
- 1.马蝇效应
林肯少年时和他的兄弟在肯塔基老家的一个农场里犁玉米地,林肯吆马,他兄弟扶犁,而那匹马很懒,慢慢腾腾,走走停停。可是有一段时间马走得飞快。 林肯感到奇怪,到了地头,他发现有一只很大的马蝇叮在马身上,他就把马蝇打落了。看到马蝇被打落了,他兄弟就抱怨说:”哎呀,你为什么要打掉它,正是那家伙使马跑起来的嘛!” 在你心满意足的时候,去寻找你的马蝇。没有firefox,不会有ie7,firefox就是微软的马蝇之一。马蝇不可怕,怕的是会一口吃掉你的东西,像 ie当初对网景干的那样。 - 2.最高气温效应
每天最热总是下午2 时左右,我们总认为这个时候太阳最厉害,其实这时的太阳早已偏西,不再是供给最大热量的时候了。此时气温之所以最高,不过是源于此前的热量积累。
你今天的网站流量,是你一个星期或更长时间前所做的事带来的。 - 3.超限效应(溢出效应)
刺激过多、过强和作用时间过久而引起心理极不耐烦或反抗的心理现象,称之为“超限效应”。 别到别人论坛里发太多广告。别在自己网站上放太多广告。别在自己的论坛里太多地太明显地诱导话题。 - 4.懒蚂蚁效应
生物学家研究发现,成群的蚂蚁中,大部分蚂蚁很勤劳,寻找、搬运食物争先恐后,少数蚂蚁却东张西望不干活。当食物来源断绝或蚁窝被破坏时,那些勤快的蚂蚁一筹莫展。“懒蚂蚁”则“挺身而出”,带领众伙伴向它早已侦察到的新的食物源转移。 不要把注意力仅仅放在一个网站上,即使这个网站现在为你带来一切。你要给自己一些时间寻找新的可行的方向,以备万一。 - 5.长尾理论
ChrisAnderson认为,只要存储和流通的渠道足够大,需求不旺或销量不佳的产品共同占据的市场份额就可以和那些数量不多的热卖品所占据的市场份额相匹敌甚至更大。 对于搜索引擎,未必你需要一个热门词排在第一位,如果有一千个冷门词排在第一位,效果不但一样,还会更稳定更长远。 - 6.破窗理论
栋建筑上的一块玻璃,又没有及时修好,别人就可能受到某些暗示性的纵容,去打碎更多的玻璃。 管理论坛时,如果你发现第一个垃圾贴,赶紧删掉他吧。想想:落伍现在为什么那么多××贴?现在控制比最初控制难多了。 - 7.“羊群效应”,又称复制原则(Copy Strategy)
一个羊群(集体)是一个很散乱的组织,平时大家在一起盲目地左冲右撞。如果一头羊发现了一片肥沃的绿草地,并在那里吃到了新鲜的青草,后来的羊群就会一哄而上,争抢那里的青草,全然不顾旁边虎视眈眈的狼,或者看不到其它地方还有更好的青草。
不要轻易跟风,保持自己思考的能力。 - 8.墨菲定律
如果坏事情有可能发生,不管这种可能性多么小,它总会发生,并引起最大可能的损失。
除非垃圾站,否则不要作弊,对搜索引擎不要,对广告也不要。 - 9.光环效应
人们对人的某种品质或特点有清晰的知觉,印象比较深刻、突出, 这种强烈的知觉, 就像月晕形式的光环一样,向周围弥漫、扩散,掩盖了对这个人的其他品质或特点的认识。
不要轻易崇拜一个人或者公司、一个概念、一种做法。 - 10.蝴蝶效应
一只亚马逊河流域热带雨林中的蝴蝶,偶尔扇动几下翅膀,两周后,可能在美国德克萨斯州引起一场龙卷风。
不管你做什么,网站或者其他,你都应该关注新闻。机遇或者灾难可能就在那。 - 11.阿尔巴德定理
一个企业经营成功与否,全靠对顾客的要求了解到什么程度。 我赞同别人的点评:看到了别人的需要,你就成功了一半;满足了别人的需求,你就成功了全部。尤其是做网站。 - 12.史密斯原则
如果你不能战胜他们,你就加入到他们之中去。
不要试图做孤胆英雄。如果潮流挡不住,至少,你要去思考为什么。