最近更新随笔
图文测试

asdfsdafdsf
Q: Can you sell yourself in two minutes? Go for it.
你能在两分钟內自我推荐吗?大胆试试吧!
A: With my qualifications and experience, I feel I am hardworking, responsible and diligent in any project I undertake. Your organization could benefit from my analytical and interpersonal skills.
依我的资格和经验,我觉得我对所从事的每一个项目都很努力、负责、勤勉。我的分析能力和与人相处的技巧,对贵单位必有价值。
Q: Give me a summary of your current job description.
对你目前的工作,能否做个概括的说明。
A: I have been working as a computer programmer for five years. To be specific, I do system analysis, trouble shooting and provide software support.
我干了五年的电脑程序员。具体地说,我做系统分析,解决问题以及软件供应方面的支持。
Q: Why did you leave your last job?
你为什么离职呢?
A: Well, I am hoping to get an offer of a better position. If opportunity knocks, I will take it.
我希望能获得一份更好的工作,如果机会来临,我会抓住。
A: I feel I have reached the "glass ceiling" in my current job. I feel there is no opportunity for advancement.
我觉得目前的工作,已经达到顶峰,即沒有升迁机会。
Q: How do you rate yourself as a professional?
你如何评估自己是位专业人员呢?
A: With my strong academic background, I am capable and competent.
凭借我良好的学术背景,我可以胜任自己的工作,而且我认为自己很有竞争力。
A: With my teaching experience, I am confident that I can relate to students very well.
依我的教学经验,我相信能与学生相处的很好。
Q: What contribution did you make to your current (previous) organization?
你对目前/从前的工作单位有何贡献?
A: I have finished three new projects, and I am sure I can apply my experience to this position.
我已经完成三个新项目,我相信我能将我的经验用在这份工作上。
Q: What do you think you are worth to us?
你怎么认为你对我们有价值呢?
A: I feel I can make some positive contributions to your company in the future.
我觉得我对贵公司能做些积极性的贡献。
Q: What make you think you would be a success in this position?
你如何知道你能胜任这份工作?
A: My graduate school training combined with my internship should qualify me for this particular job. I am sure I will be successful.
我在研究所的训练,加上实习工作,使我适合这份工作。我相信我能成功。
Q: Are you a multi-tasked individual?Do you work well under stress or pressure?
你是一位可以同时承担数项工作的人吗?你能承受工作上的压力吗?
A: Yes, I think so.
A: The trait is needed in my current(or previous) position and I know I can handle it well.
这种特点就是我目前(先前)工作所需要的,我知道我能应付自如。
Q: What is your strongest trait(s)?
你个性上最大的特点是什么?
A: Helpfulness and caring.
乐于助人和关心他人。
A: Adaptability and sense of humor.
适应能力和幽默感。
A: Cheerfulness and friendliness.
乐观和友爱。
Q: How would your friends or colleagues describe you?
你的朋友或同事怎样形容你?
A: (pause a few seconds)
(稍等几秒钟再答,表示慎重考虑。)
They say Mr. Chen is an honest, hardworking and responsible man who deeply cares for his family and friends.
他们说陈先生是位诚实、工作努力,负责任的人,他对家庭和朋友都很关心。
A: They say Mr. Chen is a friendly, sensitive, caring and determined person.
他们说陈先生是位很友好、敏感、关心他人和有决心的人。
Q: What personality traits do you admire?
你欣赏哪种性格的人?)
A: I admire a person who is)honest, flexible and easy-going.
诚实、不死板而且容易相处的人。
A: (I like) people who possess the "can do" spirit.
有"实际行动"的人。
Q: What leadership qualities did you develop as an administrative personnel?
作为行政人员,你有什么样的领导才能?
A: I feel that learning how to motivate people and to work together as a team will be the major goal of my leadership.
我觉得学习如何把人们的积极性调动起来,以及如何配合协同的团队精神,是我行政工作的主要目标。
A: I have refined my management style by using an open-door policy.
我以开放式的政策,改进我的行政管理方式。
Q: How do you normally handle criticism?
你通常如何处理別人的批评?
A: Silence is golden. Just don't say anything; otherwise the situation could become worse. I do, however, accept constructive criticism.
沉默是金。不必说什么,否则情况更糟,不过我会接受建设性的批评。
A: When we cool off, we will discuss it later.
我会等大家冷靜下来再讨论。
Q: What do you find frustrating in a work situation?
在工作中,什么事令你不高兴?
A: Sometimes, the narrow-minded people make me frustrated.
胸襟狭窄的人,有时使我泄气。
A: Minds that are not receptive to new ideas.
不能接受新思想的那些取。
Q: How do you handle your conflict with your colleagues in your work?
你如何处理与同事在工作中的意见不和?
A: I will try to present my ideas in a more clear and civilized manner in order to get my points across.
我要以更清楚文明的方式,提出我的看法,使对方了解我的观点。
Q: How do you handle your failure?
你怎样对待自己的失敗?
A: None of us was born "perfect". I am sure I will be given
a second chance to correct my mistake.
我们大家生来都不是十全十美的,我相信我有第二个机会改正我的错误。
Q: What provide you with a sense of accomplishment.
什么会让你有成就感?
A: Doing my best job for your company.
为贵公司竭力效劳。
A: Finishing a project to the best of my ability.
尽我所能,完成一个项目。
Q: If you had a lot of money to donate, where would you donate it to?Why?
假如你有很多钱可以捐赠,你会捐给什么单位?为什么?
A: I would donate it to the medical research because I want to do something to help others.
我会捐给医药研究,因为我要为他人做点事。
A: I prefer to donate it to educational institutions.
我乐意捐给教育机构。
Q: What is most important in your life right now?
眼下你生活中最重要的是什么?
A: To get a job in my field is most important to me.
对我来说,能在这个领域找到工作是最重要的。
A: To secure employment hopefully with your company.
希望能在贵公司任职对我来说最重要。
Q: What current issues concern you the most?
目前什么事是你最关心的?
A: The general state of our economy and the impact of China' entry to WTO on our industry.
目前中国经济的总体情況以及中国入世对我们行业的影响。
Q: How long would you like to stay with this company?
你会在本公司服务多久呢?
A: I will stay as long as I can continue to learn and to grow in my field.
只要我能在我的行业力继续学习和长进,我就会留在这里。
Q: Could you project what you would like to be doing five years from now?
你能预料五年后你会做什么吗?
A: As I have some administrative experience in my last job, I may use my organizational and planning skills in the future.
我在上一个工作中积累了一些行政经验,我将来也许要运用我组织和计划上的经验和技巧。
A: I hope to demonstrate my ability and talents in my field adequately.
我希望能充分展示我在这个行业的能力和智慧。
A: Perhaps, an opportunity at a management position would be exciting.
也许有机会,我将会从事管理工作。
(如果不愿正面回答,也可以说:)
It would be premature for me to predict this.
现在对此问题的预测,尚嫌过早。
(甚至还可以打趣的说:)
Hypothetically speaking, I might be able to do your current job as a director.
(或 CEO 或 president)说不定,我也能做你现在主任的工作呢!
Q: What range of pay-scale are you interested in?
你喜欢那一种薪水层次标准?
A: Money is important, but the responsibility that goes along with this job is what interests me the most.
薪水固然重要,但这工作伴随而来的责任更吸引我。
A: (假如你有家眷,可以说:)
To be frank and open with you, I like this job, but I have a family to support.
坦白地说,我喜欢这份工作,不过我必须要负担我的家庭。
Other Tips 其它建议
Know something about the organization you are applying to.
了解一些你申请工作单位的情况。
Dress properly. Don't shake hand with the interviewer until he/she extends his/her hand.
穿着要得体,人家伸手时才握手。
Don't sit down until invited to do so by the interviewer.
人家未请,先別坐下。
Make eye-contact with the interviewer during the interview.
面试时,眼睛要看着对方。
Listen actively and stay calm.
注意听,保持冷静。
If invited to a meal, be especially careful about your table manners.
被邀吃饭时,要特別注意餐桌礼节。
Don't talk with your mouth full.
嘴里有食物,不可开口说话。
Don't make much noise while you eat.
吃东西不要出声音。
Don't blow your nose or use the toothpick at table.
不要拧鼻涕或用牙签剔牙。
Don't appear to be pushy or overly anxious to get a job.
不必过分表现急着要工作。
Be honest but not too modest.
要诚实,但不必太谦虚。
Don't put yourself down or cut yourself up.
不可妄自菲薄或自贬。
Try to avoid discussing politics or religion with your interviewer.
避免与面试人谈政治或宗教。
重写是截取传入 Web 请求并自动将请求重定向到其他 URL 的过程。
比如浏览器发来请求hostname/101.aspx ,服务器自动将这个请求中定向为http://hostname/list.aspx?id=101。
url重写的优点在于:
缩短url,隐藏实际路径提高安全性
易于用户记忆和键入。
易于被搜索引擎收录
二 实现url重写的基本方法
下载MS的URLRewriter.dll,放到你的web程序的bin下
下载地址1:http://www.rickel.cn/uploads/DevTools/MSDNURLRewriting.msi
下载地址2:download.microsoft.com/download/0/4/6/0463611e-a3f9-490d-a08c-877a83b797cf/MSDNURLRewriting.msi
下载完成后,在web.config里设置如下:
<?xml version="1.0" encoding="utf-8" ?>
<!--overred-->
<configuration>
<configSections>
<section name="RewriterConfig"type="URLRewriter.Config.RewriterConfigSerializerSectionHandler, URLRewriter" />
</configSections>
<RewriterConfig>
<Rules>
<RewriterRule>
<LookFor>~/d(\d+)\.aspx</LookFor>
<SendTo>~/default.aspx?id=$1</SendTo>
</RewriterRule>
</Rules>
</RewriterConfig>
<system.web>
<httpHandlers>
<add verb="*" path="*.aspx" type="URLRewriter.RewriterFactoryHandler, URLRewriter" />
</httpHandlers>
</system.web>
</configuration>
其中
<section name="RewriterConfig" type="URLRewriter.Config.RewriterConfigSerializerSectionHandler, URLRewriter" />
用于指定配置节"RewriterConfig"的处理程序类的名称为”URLRewriter.Config.RewriterConfigSerializerSectionHandler”,该类存在于bin目录下的URLRewriter .dll文件中
关键的是这两句
<LookFor>~/d(\d+)\.aspx</LookFor>
<SendTo>~/default.aspx?id=$1</SendTo>
<LookFor>~/d(\d+)\.aspx</LookFor>表示,用户输入的url,d(\d+)\.aspx是 url中文件名匹配的正则表达式(此处为字母d开头,后面跟一个或多个数字,并以.aspx结尾。用户也可根据自己的需要自行设定)。
<SendTo>~/default.aspx?id=$1</SendTo>,表示当服务器接收到符合上面条件的请求后如何重写url。此处表示访问defalutl.aspx并传入参数id,其值$1将用用户请求的文件名中的第一个数字来表示。
例如用户输入 hostname/d11.aspx,服务器会把他重写为http://hostname/default.aspx?id=11。换句话说用户输入http: //hostname/d11.aspx,实际访问的是http://hostname/default.aspx?id=11。这样就起到了隐藏真实文件名,并便于用户记忆的作用。
处理回发
在重写后的url里如果产生回发,例如有一个按钮,又调用了该被重写的aspx,用户浏览器中将会显示该aspx文件实际的地址,也就是http: //hostname/default.aspx?id=11。但从用户的角度考虑,如 果单击按钮时突然看到 URL 更改会使他们感到不安。因此必须解决这个问题。
解决方法有二:
(1)自己定义一个Actionlessform类,在aspx中不再使用系统提供的form 标记
namespace ActionlessForm
{
public class Form : System.Web.UI.HtmlControls.HtmlForm
{
protected override void RenderAttributes(HtmlTextWriter writer)
{
writer.WriteAttribute("name", this.Name);
base.Attributes.Remove("name");
writer.WriteAttribute("method", this.Method);
base.Attributes.Remove("method");
this.Attributes.Render(writer);
base.Attributes.Remove("action");
if (base.ID != null)
writer.WriteAttribute("id", base.ClientID);
}
}
}
创建此类并对其进行编译之后,要在 ASP.NET Web 应用程序中使用它,应首先将其添加到 Web 应用程序的 References 文件夹中。然后,要使用它来代替 HtmlForm 类,做法是在 ASP.NET 网页的顶部添加以下内容:
<%@ Register TagPrefix="skm" Namespace="ActionlessForm" Assembly="ActionlessForm" %>
然后,将 <form runat="server">(如果有)替换为:<skm:Form id="Form1" method="post" runat="server">
并将右边的 </form> 标记替换为:</skm:Form>
个人并不推荐该方法
(2)第二种方法就是继承page,这样你不需要在aspx页中改任何东西。
代码:
using System;
using System.IO;
using System.Web;
using System.Web.UI;
namespace URL
{
public class OLPage : Page
{
public OLPage()
{}
protected override void Render(HtmlTextWriter writer)
{
if (writer is System.Web.UI.Html32TextWriter)
{
writer = new FormFixerHtml32TextWriter(writer.InnerWriter);
}
else
{
writer = new FormFixerHtmlTextWriter(writer.InnerWriter);
}
base.Render(writer);
}
}
internal class FormFixerHtml32TextWriter : System.Web.UI.Html32TextWriter
{
private string _url; // 假的URL
internal FormFixerHtml32TextWriter(TextWriter writer):base(writer)
{
_url = HttpContext.Current.Request.RawUrl;
}
public override void WriteAttribute(string name, string value, bool encode)
{
if (_url != null && string.Compare(name, "action", true) == 0)
{
value = _url;
}
base.WriteAttribute(name, value, encode);
}
}
internal class FormFixerHtmlTextWriter : System.Web.UI.HtmlTextWriter
{
private string _url;
internal FormFixerHtmlTextWriter(TextWriter writer):base(writer)
{
_url = HttpContext.Current.Request.RawUrl;
}
public override void WriteAttribute(string name, string value, bool encode)
{
if (_url != null && string.Compare(name, "action", true) == 0)
{
value = _url;
}
base.WriteAttribute(name, value, encode);
}
}
}
把这个文件编译成dll,并在你的项目中引用它。
然后把项目中的所有aspx文件对应的cs文件中的继承page类的代码改写为继承OLPage。
例如
public class WebForm1:page
改写为
public class WebForm1:URL.OLPage
这样就解决回发问题。
编译*.dll方法:/t:library name.cs
为了今后分析IL代码。先把一个最最常用的指的功能列出来一下:
ldstr
功能:将对字符串的对象引用推送到堆栈上,ldstr 指令推送对表示在元数据中存储的特定字符串的新字符串对象的对象引用(O 类型)。ldstr 指令分配必需的内存量并执行将字符串从在文件中使用的形式转换为在运行时要求的字符串格式所需的任何格式转换。
搞个示例:Console.WriteLine("Hi Flashccie");
ldstr "Hi Flashccie"
call void [mscorlib]System.Console::WriteLine(string)
ret
ldc.i4 num,,,,idc.i4.0,,,,idc.i4.1................
功能:将值 num 推送到堆栈上,对于整数 -128 到 127 有特殊的简短编码(并因此更有效),对于整数 -1 到 8 尤其有特殊的简短编码。所有简短编码都将 4 字节整数推送到堆栈上。如:ldc.i4.0 ,ldc.i4.1,.....等
较长的编码用于 8 字节整数以及 4 和 8 字节浮点数,并且用于不适合短格式的 4 字节值。有三种方法可以将 8 字节整数常数推送到堆栈上
1. 使用 ldc.i8指令用于必须以超过 32 位表示的常数。
2. 使用 idc.i4 指令(后跟 conv.i8)用于需要 9 到 32 位的常数。
3. 使用短格式指令(后跟 conv.i8)用于可以 8 位或更少位表示的常数。
stloc index
功能:从堆栈中弹出值并将其放在局部变量 index 中。(index最大:65534,从0开始)
stloc 指令从计算堆栈中弹出位于顶部的值并将其移动到局部变量号 index 中,其中局部变量从 0 向上进行编号。值的类型必须与当前方法的本地签名所指定的局部变量的类型匹配。
在将值保存到只能容纳长度小于 4 个字节的整数值的局部变量中时,会在将该值从堆栈移动到局部变量中时将其截断。将浮点值从其本机大小(F 类型)舍入到与该参数关联的大小。
怎么理解呢?
比如你在一个方法中定义下以下几个变量:
int i;
int i0=new Int();
哪么就会生成以下IL代码:
.locals init (
[0] int32 num,
[1] int32 num2)
L_0000: nop
//初始化i0为0
L_0001: ldc.i4.0 //将0推上栈顶
L_0002: stloc.1 //从堆栈顶部弹出一个值到索引号为1的变量中去
未完....基本的指令,最少也要求能把简单的一个程序搞完才行。不过,指令相对也不会很多。很晚了。睡去了。。
今天在项目中我自己写了个集合类,由于要存储非常多的数据,所以我想把集合类下载到用户本地,然后在本地再取对象,这样就减少了频繁读取数据库的次数,可是在用到ArrayList的contains的时候,我的对象明明在集合里存在,但是还是返回False ,后来想到ArrayList是引用类型,在每一次实例化的时候对象的内存地址都不一样,本来想遍历集合,但考虑到效率不高,在网上找到可以重写Equals方法,在C#的容器中,常用的三个容器数组,ArrayList, Hashtable..数组比较简单,实现某种单一数据的存储,但是并不能自由插入,移除和容纳不同的对象..,所以ArrayList是数组的替代品, 并且由于ArrayList可以自由的添加,删除,插入,读取,给我们提供了足够大的自由性,颇得我的青睐..不过使用中,难免有些缺点,感觉最麻烦的就是检测某对象是否在Items中..因为每一个new出来的Class在内存中的表现不相同,即便是同一个类,你new出来两个,然后再判断,也是会一样的!!所以每次使用ArrayList.Contains()检测对象的时候,难免都得不到自己想要的结果..因为每个Class都是继承自Object类..而ArrayList.Contains()的实现是IList.Contains,而此方法是调用Class中的Equals方法判断是否相等,这个时候,可以在自己的对象中覆写Object.Equals方法,以达到自己的目的..注意,如果你覆写了Equals方法,则也要覆写GetHashCode(),因为Equals是用获取Object.GetHashCode()来做判断的.看看下面的代码就明白:
1
using System;
2
3
namespace HashCode_Test
4

{
5
/**//// <summary>
6
/// 给你的类加入Equals,测试类
7
/// </summary>
8
public class Class2
9

{
10
int myHashCode = 0;
11
public Class2( int id ) //传递进一个int,作为GetHashCode的值
12
{
13
myHashCode = id;
14
}
15
16
//覆写GetHashCode,关键的一步
17
public override int GetHashCode()
18
{
19
return myHashCode;
20
}
21
22
//这步,可有可无,主要是做测试结果用的
23
public override string ToString()
24
{
25
return DateTime.Now.ToString();
26
}
27
28
/**//// <summary>
29
/// 重载了Equals方法,这步和GetHashCode配合起来才会有效果
30
/// </summary>
31
/// <param name="o">要检测的对象</param>
32
/// <returns>返回是否相同</returns>
33
public override bool Equals( object o )
34
{
35
return o.GetHashCode() == myHashCode;
36
}
37
38
//在这里使用运算符重载,主要是为了进一步演示Equals
39
public static bool operator ==(object c1, Class2 c2)
40
{
41
return c1.GetHashCode().Equals( c2.GetHashCode() );
42
}
43
44
//当你重载了==运算符后,必须要重载!=运算符
45
public static bool operator !=(object c1, Class2 c2)
46
{
47
return c1.GetHashCode().Equals( c2.GetHashCode() );
48
}
49
50
}
51
}
这里是测试代码:
1
System.Collections.ArrayList arr = new System.Collections.ArrayList();
2
3
int i = 0;
4
for ( i = 0; i < 4 ; i ++ )
{
5
Class2 class2 = new Class2(i); //我们添加四个对象
6
arr.Add( class2 );
7
}
8
9
for ( i = 0; i < 4 ; i ++ )
10

{
11
Class2 class2 = new Class2(i); //重新创建四个对象,判断是否和容器中的对象相等
12
Console.WriteLine( i + ":" + arr.Contains(class2));//全部输出true
13
}
14
15
16
17
Class2 class2_1 = new Class2(1); //再创建对象1,并添加到容器中,以判断是否有多个对象1存在
18
arr.Add( class2_1 );
19
20
for ( i = 0;i<arr.Count;i++ )
{
21
Class2 class2_3 = new Class2(1);//这个时候我们要检测出容器中有多少个对象1
22
if ( arr[i].Equals( class2_3 ) )
{//我们用Equals来检测是否相等
23
Console.WriteLine( "我用Equals找到\t" );
24
}
25
if ( arr[i] == class2_3 ) //我们用==来检测相等
26
{
27
Console.WriteLine( "我用==找到\t" );
28
}
29
Console.WriteLine( arr[i].ToString() + "\t HashCode:" + arr[i] .GetHashCode()); //这里输出HashCode和ToString()查看
30
31
}
32
相 信上面的代码很容易看的懂..在我的Class2类中覆写了GetHashCode() ,ToString() ,Equals(object o),并重载了==运算符和!=运算符..将传递的id作为HashCode,然后判断当前传递的对象Object.GetHashCode是否等于当前 对象的GetHashCode..这样就解决了ArrayList.Contains不能对Class做出正确判断的问题..
另外,还有 一个容器Hashtable的使用和判断,并不能用上面的方法解决..因为Hashtable.Contains的实现方法是 IDictionary.Contains来做判断..需要实现IDictionary接口的方法才可以.因为牵涉到的内容比较多.所以不能在这里全部写 完..关于具体的方法和实现,我会找时间写出来的..
最后大家可以自己做一个没有实现Equals方法的类,再用ArrayList.Contains来做判断..可以看到结果都是flase..和上面的代码是个对比..
这个方法不仅可以用在ArrayList,而且也可以在多个地方使用,比如两个Class之间的关联?Class1和Class2是否关联??
Learn Scott:希望本文能对你有所帮助。
最近新换了一个工作,在一个全国连锁的服装公司总部做开发,管理全国的分店进销存等的管理,以前从来没有用过uniqueidentifier这个数据类型,在分布式开发中比较常用,下面是此数据类型的相关介绍。
全局唯一标识符
尽管 IDENTITY 属性自动为表生成行号,但不同表的标识符列可以生成相同的行号。这是因为 IDENTITY 属性只须在所使用的表上保持唯一。如果应用程序需要生成在整个数据库或世界各地所有网络计算机的全部数据库中均为唯一的标识符列,请使用 ROWGUIDCOL 属性、uniqueidentifier 数据类型和 NEWID 函数。
使用 ROWGUIDCOL 属性定义全局唯一标识符列时应注意;
- 一个表只能有一个 ROWGUIDCOL 列,且该列必须定义为 uniqueidentifier 数据类型。
- SQL Server 不为该列自动生成值。若要插入全局唯一数值,应为列创建 DEFAULT 定义,以使用 NEWID 功能生成全局唯一数值。
- 在设置 ROWGUIDCOL 属性后,使用 ROWGUIDCOL 关键字可在选择列表中引用该列。这与使用 IDENTITYCOL 关键字引用 IDENTITY 列相似。
- 可使用 OBJECTPROPERTY 函数确定表是否含有 ROWGUIDCOL 列,使用 COLUMNPROPERTY 函数确定 ROWGUIDCOL 列的名称。
- 由于 ROWGUIDCOL 属性不强制唯一性,所以应使用 UNIQUE 约束以确保插入 ROWGUIDCOL 列的值是唯一的。
uniqueidentifier 数据类型存储 16 字节的二进制值,该值的使用与全局唯一标识符 (GUID) 一样。GUID 是一个唯一的二进制数字;世界上的任何两台计算机都不会生成重复的 GUID 值。GUID 主要用于在拥有多个节点、多台计算机的网络中,分配必须具有唯一性的标识符。
uniqueidentifier 列的 GUID 值通常由以下方式获得:
- 在 Transact-SQL 语句、批处理或脚本中调用 NEWID 函数。
- 在应用程序代码中,调用返回 GUID 值的应用程序 API 函数或方法。
Transact-SQL NEWID 函数以及应用程序 API 函数和方法从它们网卡上的标识数字以及 CPU 时钟的唯一数字生成新的 uniqueidentifier 值。每个网卡都有唯一的标识号。由 NEWID 返回的 uniqueidentifier 使用服务器上的网卡生成。由应用程序 API 函数和方法返回的 uniqueidentifier 使用客户机上的网卡生成。
一般不将 uniqueidentifier 定义为常量,因为很难保证实际创建的 uniqueidentifier 具有唯一性。指定 uniqueidentifier 常量的方法有两种:
uniqueidentifier 数据类型不象IDENTITY 属性那样为新插入的行自动生成新的ID。为了得到新的 uniqueidentifier 值,表必须具有一个指定 NEWID 函数的 DEFAULT 子句,或使用 NEWID 函数的 INSERT 语句:
CREATE TABLE MyUniqueTable
(UniqueColumn UNIQUEIDENTIFIER DEFAULT NEWID(),
Characters VARCHAR(10) )
GO
INSERT INTO MyUniqueTable(Characters) VALUES ('abc')
INSERT INTO MyUniqueTable VALUES (NEWID(), 'def')
GO
uniqueidentifier 列可以包含多次出现的 uniqueidentifier 值,除非也对此列指定了 UNIQUE 或 PRIMARY KEY 约束。当有多行引用源表中的同一主键时,引用其它表的 uniqueidentifier 主键的外键列将包含多次出现的个别 uniqueidentifier 值。
一个表可以有多个 uniqueidentifier 列。每个表中可以指定一个具有 ROWGUIDCOL 属性的 uniqueidentifier 列。ROWGUIDCOL 属性表明此列的 uniqueidentifier 值唯一地标识表中的行。但是,该属性并没有执行该唯一性。唯一性必须通过其它机制来执行,比如为列指定 PRIMARY KEY 约束。ROWGUIDCOL 属性主要用于 SQL Server 复制。
uniqueidentifier 数据类型的主要优点是保证由 Transact-SQL NEWID 函数或应用程序 GUID 函数生成的值在全球是唯一的。
uniqueidentifier 数据类型的具有几个缺点:
- 值长且难懂。这使用户难以正确键入它们,并且更难记住。
- 这些值是随机的,而且它们不能接受任何使它们对用户变得更有意义的模式。
- 没有任何方式可以决定生成 uniqueidentifier 值的顺序。它们不适用于那些依赖递增的键值的现有应用程序。
- uniqueidentifier 数据类型具有 16 个字节,与其它那些诸如 4 字节的整数相比要相对大一些。这意味着使用 uniqueidentifier 键建立的索引可能会比使用 int 键实现的索引相对慢一些。
在设计分布式数据库时非常有用。
先看如下2中SQL写法:
(1)
declare @monthstart datetime
declare @monthend datetime
declare @minID int
declare @maxID int
set @monthstart= ‘2006-06-20 17:02:00’
set @monthend= ‘2006-07-20 17:02:00’
select @minID = min(postid),@maxID = max(postId) from table_posts where postdate between @monthstart and @monthend
select @minID,@maxId
(2)
declare @minID int
declare @maxID int
select @minID = min(postid),@maxID = max(postId) from table_posts where postdate between '2006-06-20 17:02:00' and '2006-07-20 17:02:00'
select @minID,@maxID
这2条语句执行结果会有区别么?
有?回复告诉俺啥区别被。
没有。俺也这么想滴。
再描述一下俺查询滴数据量。俺查询滴那个表的数据量是近200万,不算多。
好啦,现在答案揭晓:第一条执行速度N慢,相对于第二条来说,多浪费20多秒的时间。
你别问俺为啥,俺也郁闷,至今未找到根子。不过在轻舞flash老哥的帮助下,还是找到了两者差距的所在。第一条逻辑读9万多,比第二条多9万多。汗一个。。。。
不是啥子数据库服务器的缘故,就算是俺也不知道,因为服务器不是俺设置的。
但你非得在查询条件中使用变量怎么办?牛人自有牛人的办法。还是flash老哥给的方法,贴出来共享。不过上面的问题谁碰到过可要联系俺啊。
另类解决方案闪亮登场:
declare @monthstart datetime
declare @monthend datetime
declare @minD int
declare @maxID int
declare @sqlcom varchar(8000)
set @monthstart='2006-06-20 17:02:00'
set @monthend='2006-07-20 17:02:00'
set @sqlcom='select min(postid) as minId, max(postId) as maxId from forums_posts where postdate between '''+Convert(varchar(16),@monthstart,121) +''' and '''+ Convert(varchar(16),@monthend ,121)+''''
print @sqlcom
exec(@sqlcom)
走过,路过,要记得留过。。。
鄙视看帖不回的,俺多辛苦的文章啊!
PS:
可能是表的问题,因为我在另一个表执行类似第一条那样的语句,速度很快。另一个表的字段同样有索引。
PS:
以上2种不同的语句,如果不带Min、Max函数,则他们时间上相差无几。而且读盘一样。难道是Min、Max函数搞怪?
Google Ping 介绍
通 过 Google“博客搜索”Ping API, 用户可以程序化的方式将博客内容的更新通知给 Google“博客搜索”引擎。这对于经常更新博客内容的用户尤其有用。博客服务提供商的管理人员也可以利用此API将其平台上的博客内容变化向 Google 通告,以便 Google“博客搜索”及时抓取来自这一服务提供商的最新内容。为设置对 Google“博客搜索”的自动 Ping 机制,请按照如下所述设置XML-RPC客户端或REST客户端以发送请求。您可以任选一种方法进行通知;两者都将按照相同的方式进行处理。
XML-RPC客户的请求应包含如下元素:
RPC端点: http://blogsearch.google.com/ping/RPC2
调用方法名: weblogUpdates.extendedPing
参数: (应按照如下所列的相同顺序传送)
- 站点名
- 站点URL
- 需要检查更新的页面URL
- 相应的RSS、RDF或Atom种子的URL
- 可选 页面内容的分类名称(或标签)。您可以指定多个值,之间用'|'字符进行分隔。
XML-RPC响应中将返回含有两个元素的<struct> :
- flerror (Boolean):当有错误发生时设为true/1
- message (string) :"Thanks for the ping." (如果成功) 或者一个错误信息(如果不成功)。
XML-RPC请求的例子
POST /RPC2 HTTP/1.0
User-Agent: request
Host: blogsearch.google.com
Content-Type: text/xml
Content-length: 447
<?xml version="1.0"?>
<methodCall>
<methodName>weblogUpdates.extendedPing</methodName>
<params>
<param>
<value>Official Google Blog</value>
</param>
<param>
<value>http://googleblog.blogspot.com/</value>
</param>
<param>
<value>http://googleblog.blogspot.com/</value>
</param>
<param>
<value>http://googleblog.blogspot.com/atom.xml</value>
</param>
</params>
</methodCall>
XML-RPC响应的例子
HTTP/1.1 200 OK
Connection: close
Content-Length: 451
Content-Type: text/xml
Date: Sun, 30 Sep 2001 20:02:30 GMT
Server: Apache
<?xml version="1.0"?>
<methodResponse>
<params>
<param>
<value>
<struct>
<member>
<name>flerror</name>
<value>
<boolean>0</boolean>
</value>
</member>
<member>
<name>message</name>
<value>Thanks for the ping.</value>
</member>
</struct>
</value>
</param>
</params>
</methodResponse>
REST客户的请求中包含如下元素:
URL: http://blogsearch.google.com/ping
参数:
- name = 博客的名字
- url = 博客的URL
- changesURL = RSS、RDF或Atom种子的URL (可选)
响应中将返回文本内容,在成功的时候是"Thanks for the ping.",在失败时是一条错误消息。
例子:
Google 将所接受的“博客搜索” Ping 记录以XML格式发布到http://blogsearch.google.com/changes.xml。changes.xml文件格式包含一个根元素<weblogUpdates>和一个或多个的<weblog>元素。
<weblogUpdates version="2" updated="Wed, 30 May 2006 14:10:00 GMT" count="1384779">
<weblog name="Some Blog"
url="http://googleblog.blogspot.com"
rssUrl="http://googleblog.blogspot.com/atom.xml"
when="1"/>
...
</weblogUpdates>
- version:用来指示一个主要的格式变化,目前的版本是2。
- updated:以 HTTP 1.0格式表示的日期时间。它指示了该文件上一次更新的时间。
- count:一个递增的数字,表示了changes.xml文件的版本。新版本changes.xml文件通常具有更大的count值。
- name:Blog的名称。
- url: Blog的url。
- rssUrl: 相应的RSS、Atom或其它种子的URL。
- when: <weblogUpdates>元素的updated属性对应的时间减去相应的 Ping 发生的时间的差值,单位为秒。
====================================================================
下面实现如何使用XML RPC编程实现Google Ping服务.
首先,下载CookComputing.XmlRpc
我使用的是2.0版本.最新版为2.1.0
1.建立xml rpc客户端
public class GoogleXmlRpc
{
/// <summary>
/// 返回值,用于处理Google Ping返回值的结构
/// </summary>
public struct ReturnValue
{
public bool flerror;
public string message;
}
[XmlRpcUrl("http://blogsearch.google.com/ping/RPC2")]
public interface IGooglePing : IXmlRpcProxy
{
[XmlRpcMethod("weblogUpdates.extendedPing")]
ReturnValue Ping(string websiteName, string websiteUrl, string changedUrl, string feedUrl);
}
}
2.向Google发出一个ping通告
在你的程序添加文章或更新文章时,发出ping通告.
string websiteName="venjiang 的博客"; // 博客名称
string websiteUrl="http://blog.hidotnet.com/venjiang/"; // 博客网站地址
string changeUrl = "http://blog.hidotnet.com/venjiang/"; // 要更新的地址
string feedUrl = "http://blog.hidotnet.com/venjiang/Rss.aspx"; // 聚合地址rss或atom
GoogleXmlRpc.IGooglePing proxy = (GoogleXmlRpc.IGooglePing)XmlRpcProxyGen.Create(typeof(GoogleXmlRpc.IGooglePing)); // 创建代理类
// 最新版本,支持泛型,可以直接使用:
// GoogleXmlRpc.IGooglePing proxy =XmlRpcProxyGen.Create<GoogleXmlRpc.IGooglePing>();
GoogleXmlRpc.ReturnValue returnValue = proxy.Ping(websiteName, websiteUrl, changeUrl, feedUrl); // ping
if (returnValue.flerror)
Response.Write( "Google Ping 出错!");
else
Response.Write "Google Ping 成功!";
3.查看google 更新列表
下载:http://blogsearch.google.com/changes.xml 你可以看到你的博客相关信息已加入更新列表,目前google更新列表,有一定延迟.
有一个solution,里面有5个project,其中有一个project我删掉了,打开solution的时候提示无法加载,我就把这个project给Remove掉了,结果发现无法编译,提示如下:
The project file '' has been renamed or is no longer in the solution.
仔细想了一下,IDE无法编译,肯定是别的项目有引用这个project的DLL,于是我把别的project所有引用在bin文件夹中的的全部删掉,还是发现无法编译。郁闷。到google上查了一下,只找到一个方法说是重新建立这个project,我晕。
难道要我重新返工到移除项目以前(移除项目前是可以编译的,虽然项目加载不到)?
不死心,在应用这个项目的DLL的项目的References中,我找到了这个引用,显示的是引用项目,把这个DLL的引用移除掉,OK,可以编译了,看来以后引用项目的时候,在bin文件删除的仅仅是物理的copy到本地的dll文件,而要删除引用,还是要在References中把这个引用彻底移除掉。
现在是2007年6月6日9点15分,以后就在博客苑落户了,以前从来没有系统的写过什么东西,要好好锻炼一下自己的文笔了。
文章浅薄,各位前辈见笑了。
//多好的日子啊,66大顺。
今日同事说论坛后台编辑不了,我跟踪一下,发现程序并无异常报告。分析后认为是数据库错误,于是执行SQL语句排错。经测试,发现修改字段时,使用较长的字符串时报如下错误:
将截断字符串或二进制数据。
语句已终止。
记得以前也碰到过这样的错误,确实是数据库错误。从错误信息提示分析,容易让人以为是非法字符引起的,我初步也这么认为(呵呵,以前碰到这个错误的原因不记得了!),于是排除几个认为非法的字符(还好仅仅是几个字符,不然我也不会找到真正的原因了。),F5,错误信息依旧,于是看某个字段的长度,将测试字符串缩短后F5,执行成功!看来报这个错是输入的数据超过字段长度的缘故了。从错误提示信息分析,根据“截断”2字就容易让我以为是输入了非法字符,但经过这次测试,我觉得“截断”应该是某个东西过长,过大,而被截断一部分的意思,而不是我们理解的“过滤掉”这个意思。
我根据自己想法进行了几个测试。首先在输入数据末尾使用空格,以此是输入数据超过字段长度,F5,以为会报错,显示执行成功!换一种方式,将空格放输入数据中间,报错!难道SQl中有Trim?呵呵,哪位高人指点一二?
对于多数网页制作的朋友,实现在客户端保存在网页表单上的信息,比较多的是采用Cookie技术来实现,这些功能例如:下拉列表框选择的选项,文本框输入的数据等。事实上,我们可以利用微软DHTML默认行为中的userData行为来实现这个功能。
因为很多网友问到这样的问题,整理了一下,并提供了三个示例。下面将就该行为的使用做一个介绍:
UserData 行为(userData Behavior):
1、说明:
userData行为通过将数据写入一个UserData存储区(UserData store)来保存数据,userData可以将数据以XML格式保存在客户端计算机上,如果你用的是 Windows 2000 或者 Windows XP,是保存在C:\Documents and Settings\Liming\UserData\文件夹下(如果操作系统不是安装在C盘,那么C就应该是操作系统所在的分区)。
该数据将一直存在,除非你人为删除或者用脚本设置了该数据的失效期。
userData行为提供了一个比Cookie更具有动态性和更大容量的数据结构。每页的UserData存储区数据大小可以达到64 Kb,每个域名可以达到640 Kb。
userData行为通过sessions为每个对象分配UserData存储区。使用save和load方法将UserData存储区数据保存在缓存(cache)中。一旦UserData存储区保存以后,即使IE浏览器关闭或者刷新了,下一次进入该页面,数据也能够重新载入而不会丢失。
出于安全的考虑,相同协议使用同一个文件夹保存UserData存储区数据。
For security reasons, a UserData store is available only in the same directory and with the same protocol used to persist the store.
在HTML、HEAD、TITLE和STYLE标记上应用了userData行为后使用save和load方法将会出错。
Setting the userData behavior (proposed) class on the HTML, HEAD, TITLE, or STYLE object causes an error when the save or load method is called.
必须在行内或者文档的HEAD部分宣告如下样式:
<STYLE>
.userData {behavior:url(#default#userdata);}
</STYLE>
userData行为可用于Microsoft? Win32?和Unix平台上的IE 5.0以上版本,不支持Netscape。
2、语法:
HTML <ELEMENT STYLE="behavior:url('#default#userData')" ID=sID>
Script object.style.behavior = "url('#default#userData')"
object.addBehavior ("#default#userData")
注:sID参数是一个可以描述该标记的唯一id。ID是可选的,但如果有,可以在脚本中方便地对该标记加以控制。
3、成员:
expires
设置或取得使用userData行为保存数据的失效日期。
脚本语法:对象ID.expires = 参数
参数是一个使用UTC(Universal Time Coordinate,世界调整时间)格式表示失效日期的字符串。该属性可以读写,没有默认值。浏览器会对比这个日期和当前日期,如果到期,该数据就自动失效。
getAttribute()
取得指定的属性值。
load(存储区名)
从UserData存储区载入存储的对象数据。
removeAttribute()
从对象中删除指定的属性值。
save(存储区名)
将对象数据存入一个UserData存储区。
setAttribute()
设置指定的属性值。
XMLDocument
取得存储该对象数据的XML DOM引用。
具体用法可以查看MSDN(
http://msdn.microsoft.com) 4、示例
示例一:文本框标记的应用(Microsoft)
<HTML>
<HEAD>
<STYLE>
.userData {behavior:url(#default#userdata);}
</STYLE>
<SCRIPT>
function fnSaveInput(){
var oPersist=oPersistForm.oPersistInput;
oPersist.setAttribute("sPersist",oPersist.value); //将oPersist.value存储为sPersist属性
oPersist.save("oXMLBranch"); //存储在名为oXMLBranch的UserData存储区
}
function fnLoadInput(){
var oPersist=oPersistForm.oPersistInput;
oPersist.load("oXMLBranch"); //载入在名为oXMLBranch的UserData存储区
oPersist.value=oPersist.getAttribute("sPersist"); //将sPersist属性赋值给oPersist.value
}
</SCRIPT>
</HEAD>
<BODY>
<FORM ID="oPersistForm">
<INPUT CLASS="userData" TYPE="text" ID="oPersistInput">
<INPUT TYPE="button" VALUE="Load" onclick="fnLoadInput()">
<INPUT TYPE="button" VALUE="Save" onclick="fnSaveInput()">
</FORM>
</BODY>
</HTML>
[Ctrl+A 全选,提示:你可修改代码后运行]
示例二:Checkbox标记的应用
<style>
.userData {behavior:url(#default#userdata);}
</style>
<input type=checkbox id=chkbox1 class=userData>
<script>
var obj=document.all.chkbox1;
obj.attachEvent('onclick',saveChecked)
function saveChecked(){
obj.setAttribute("bCheckedValue",obj.checked);
obj.save("oChkValue");
}
window.attachEvent('onload',loadChecked)
function loadChecked(){
obj.load("oChkValue");
var chk=(obj.getAttribute("bCheckedValue")=="true")?true:false;
obj.checked=chk;
}
</script>
[Ctrl+A 全选,提示:你可修改代码后运行]
示例三:Select标记的应用 <style>
.userData {behavior:url(#default#userdata);}
</style>
<select id="select1" class="userData">
<option>option1</option>
<option>option2</option>
<option>option3</option>
<option>option4</option>
</select>
<script>
var obj=document.all.select1;
obj.attachEvent('onchange',saveSelectedIndex)
function saveSelectedIndex(){
obj.setAttribute("sSelectValue",obj.selectedIndex);
obj.save("oSltIndex");
}
window.attachEvent('onload',loadSelectedIndex)
function loadSelectedIndex(){
obj.load("oSltIndex");
obj.selectedIndex=obj.getAttribute("sSelectValue");
}
</script>
[Ctrl+A 全选,提示:你可修改代码后运行]
今天跟老板讨论工作的时候,俺问老板是不是可以使用Cache来暂时保存数据,然后再一次性插入数据库中,以避免频繁操作数据库导致的性能问题。老板否定了俺的说法。老板说Cache不靠谱,容易丢失,并且网站配置使用了Web Garden,而且还是多服务器,Cache不能共享,俺一下就蔫巴了,还真是个问题。。。。
不过俺没搞懂老板说的Web Garden是虾米咚咚,于是Google一把,终于明白了,原来Web Garden是IIS6的一个功能。
Google一把,搜到MSDN的关于Web Garden的英文文档(http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/659f2e2c-a58b-4770-833b-df96cabe569e.mspx?mfr=true),大概浏览了一下,加上老板所说,对Web Garden有了初步的了解。同时也获得了另一个名词:Web Farms。
Web Garden:IIS6 Web Garden 指的是一个应用程序可以成多个进程(w3wp.exe)来执行,一次请求使用其中的一个。用这个的主要目的是提高程序的可用性。当其中一个进程发生错误,那么也不会影响其他进程。发生错误的进程可以根据规则关闭,而其他的进程则可以继续工作。(引用别人滴,俺自己还没理顺怎么解释它。)
Web Farms:这个嘛,没找到资料,但大部分程序都是用这个方式的。
写的仓促,看过的人若不知所云,当俺是火星人好了。