很恶心的问题,安装了delphi6 D6_upd2_ent.exe升级包后,原来的程序编译报出这样的错误。
原因是因为delphi补丁没有实现Consts.dcu和consts.pas的同步更新。
解决办法:
查找delphi6安装目录下的Consts.dcu,ExtActns.dcu文件,并删除,
打开delphi,打开你的程序,并找到Consts.pas中添加常量:SUrlMonDllMissing= ‘Unable to load %s’;
位置如下:

unit Consts;

interface

resourcestring
  SUrlMonDllMissing= 'Unable to load %s';
  SOpenFileTitle = '打开';

基本定义

1.脏读 dirty reads
其他事务读取的值被回滚了。当事务读取还未被提交的数据时,就会发生这种事件。举例来说:Transaction 1 修改了一行数据,然后 Transaction 2 在 Transaction 1 还未提交修改操作之前读取了被修改的行。如果 Transaction 1 回滚了修改操作,那么 Transaction 2 读取的数据就可以看作是从未存在过的。
2.不可重复的读 non-repeatable reads
同一事务两次读的结果不一样(数据被修改)。当事务两次读取同一行数据,但每次得到的数据都不一样时,就会发生这种事件。举例来说:Transaction 1 读取一行数据,然后 Transaction 2 修改或删除该行并提交修改操作。当 Transaction 1 试图重新读取该行时,它就会得到不同的数据值(如果该行被更新)或发现该行不再存在(如果该行被删除)。
3.虚读 phantom read
同一事务两次取到不同的行。如果符合搜索条件的一行数据在后面的读取操作中出现,但该行数据却不属于最初的数据,就会发生这种事件。举例来说:Transaction 1 读取满足某种搜索条件的一些行,然后 Transaction 2 插入了符合 Transaction 1 的搜索条件的一个新行。如果 Transaction 1 重新执行产生原来那些行的查询,就会得到不同的行。

对应的事务场景

事务前提:对于同一个银行帐户A内有200元,甲进行提款操作100元,乙进行转帐操作100元到B帐户。如果事务没有进行隔离可能会并发如下问题

1、第一类丢失更新
首先甲提款时帐户内有200元,同时乙转帐也是200元,然后甲乙同时操作,甲操作成功取走100元,乙操作失败回滚,帐户内最终为200元,这样甲的操作被覆盖掉了,银行损失100元。
2、脏读
甲取款100元未提交,乙进行转帐查到帐户内剩有100元,这是甲放弃操作回滚,乙正常操作提交,帐户内最终为0元,乙读取了甲的脏数据,客户损失100元。
3、虚读
和脏读类似,是针对于插入操作过程中的读取问题,如丙存款100元未提交,这时银行做报表进行统计查询帐户为200元,然后丙提交了,这时银行再统计发现帐户为300元了,无法判断到底以哪个为准?
4.不可重复读
甲乙同时开始都查到帐户内为200元,甲先开始取款100元提交,这时乙在准备最后更新的时候又进行了一次查询,发现结果是100元,这时乙就会很困惑,不知道该将帐户改为100还是0。
和脏读的区别是,脏读是读取前一事务未提交的脏数据,不可重复读是重新读取了前一事务已提交的数据。
5、第二类丢失更新
是不可重复读的一种特例,如上,乙不做第二次查询而是直接操作完成,帐户内最终为100元,甲的操作被覆盖掉了,银行损失100元。感觉和第一类丢失更新类似。

问题总结

对于以上问题,我们面临如下三种问题

1、丢失更新
如果两个事务都要更新数据库一个字段X,x=100
事务A 事务B
读取X=100
读取X=100
写入x=X+100
写入x=X+200
事务结束x=200
事务结束x=300
最后x==300
这种情况事务A的更新就被覆盖掉了、丢失了。
丢失更新说明事务进行数据库写操作的时候可能会出现的问题。
2、不可重复读
一个事务在自己没有更新数据库数据的情况,同一个查询操作执行两次或多次的结果应该是一致的;如果不一致,就说明为不可重复读。
还是用上面的例子
事务A 事务B
读取X=100
读取X=100
读取X=100
写入x=X+100
读取X=200
事务结束x=200
事务结束x=200
这种情况事务A多次读取x的结果出现了不一致,即为不可重复读。
再有一情况就是幻影
事务A读的时候读出了15条记录,事务B在事务A执行的过程中删除(增加)了1条,事务A再读的时候就变成了14(16)条,这种情况就叫做幻影读。
不可重复读说明了做数据库读操作的时候可能会出现的问题。
3、脏读(未提交读)
防止一个事务读到另一个事务还没有提交的记录。
如:
事务A 事务B
读取X=100
写入x=X+100
读取X=200
事务回滚x=100
读取X=100
事务结束x=100

锁的简介(最常用的两种锁)

x锁 排他锁
被加锁的对象只能被持有锁的事务读取和修改,其他事务无法在该对象上加其他锁,也不能读取和修改该对象
s锁 共享锁
被加锁的对象可以被持锁事务读取,但是不能被修改,其他事务也可以在上面再加s锁。

封锁协议

一级封锁协议
在事务修改数据的时候加x锁,直到事务结束(提交或者回滚)释放x锁。一级封锁协议可以有效的防止丢失更新,但是不能防止脏读不可重复读的出现。
二级封锁协议
在一级封锁的基础上事务读数据的时候加s锁,读取之后释放。二级封锁协议可以防止丢失更新,脏读。不能防止不可重复读。
三级封锁协议
在一级封锁的基础上事务读数据的时候加s锁,直到事务结束释放。二级封锁协议可以防止丢失更新,脏读,不可重复读。

一.编写 RC 脚本文本

用记事本或其它文本编辑器编写一个扩展名为“.rc”的文件。格式如下:

  •   AVI 无声动画
  •   BITMAP 位图文件
  •   CURSOR 光标文件
  •   ICON 图标文件
  •   WAVE 声音文件

RC脚本编写格式如下

    mycur cursor move.cur //加入光标
  mypic Bitmap Water.BMP //加入位图
  mywav WAVE happy.wav //加入声音
  myAVI AVI EPOEN.AVI //加入视频
  myIco ICON CJT.ICO //加入图标

以上所列均为标准资源类型,也可以给资源自定义一个类型,如:“GIFTYPE”。不过两者在调用方式上有些不同。

二.根据 RC 脚本文件编译成 RES 资源文件

在命令提示符中输入以下内容:
brcc32 FileName.rc //注:brcc32.exe在DelphiX\Bin目录中,一般Delphi会添加到环境变量中,所以直接执行brcc32命令就可以了,之后会生成一个FileName.RES的文件。

三.在Delphi单元中加入资源文件

将生成的 RES 资源文件复制到相应程序所在的目录中,在单元文件中的“{$R *DFM}”后面加上“{$R FileName.res}”,编译后资源文件就被包含在可执行文件中了。
说明:如果嫌2、3两步麻烦,可以采用更简便的做法,即:将 RC 文件直接添加到项目中,在编译Delphi项目时,会自动编译该资源文件。
如下图:

四.资源文件调用示例

(1)存取资源文件中的位图
低版本的delphi支持的位图色可能不一样,delphi6不能支持256色以上的位图。

//RC: testBmp bitmap res\test.bmp
Image1.Picture.Bitmap.LoadFromResourceName(HInstance, 'testBmp');
//RC: testBmp bmptype res\test.bmp
//此方法支持自定义格式
var
resStream: TResourceStream;
begin
resStream := TResourceStream.Create(HInstance, 'testBmp', 'bmptype');
Image1.Picture.Bitmap.LoadFromStream(resStream);
resStream.Free;
end;
(2)存取资源文件中的图标
将图标放在资源文件中,可以实现动态改变应用程序的图标。

//RC: testIcon icon res\test.ico
Application.Icon.Handle := LoadIcon(HInstance, 'testIcon');
(3)存取资源文件中的AVI动画
//RC: testAvi avi res\test.avi
Animate1.ResName := 'testAvi';
Animate1.Active := True;
(4)存取资源文件中的JPEG图像
为了能够处理JPEG图像,必须在Interface处引用JPEG单元。

var
jpg: TJPEGImage;
resStream: TResourceStream;
begin
jpg := TJPEGImage.Create;
resStream := TResourceStream.Create(HInstance, 'testJpg', 'jpgtype');
jpg.LoadFromStream(resStream);
Image1.Picture.Assign(jpg);
jpg.Free;
resStream.Free;
end;
(5)光标的调用
首先在程序中定义一个值大于0的常量,因为Delphi本身用0-负16来索引默认的光标,所以我们制定的光标应从表面上1开始索引。然后在窗口的Oncreat事件中添加以下代码:

screen.cursor[35]:=Loadcursor (hinstance,'mycur');

其中35为大于1的常量,mycur为光标在资源文件中的名字。如果希望在其他控件上使用定制光标,例如Panel控件,只需在程序的适当处加入以下代码:

Panel1.cursor:=35;
(6)调用WAV文件
在uses中加入mmsystm单元,以便在程序中播放WAV文件。播放时

Playsound(pchar('mywav'),hinstance,sndsync or snd_resource);

其中mywav为声音文件在资源中的名称。

资源类型除上述类型外,还可以字体文件,字符串文件等。

在控制台下使用资源文件

新建一工程,将唯一的一个Form删除,然后修改工程文件。增加一句{$Apptype console},在uses子句中加入mmsystem,并将其它引用单元删掉。将Begin和end之间语句删掉。至此,我们就可和Turbo PASCAL下编程序一样,且还可以调用windows的API和资源。将资源文件—-{$R myfist.res}加入。在Begin和end之间写下:

writeln('演示程序,按任意键开始!');
readln;
playsound(pchar('mywav'),hinstance,snd_sync or snd_resource);
writeln('演示结束!');

使用Image Editor工具

Delphi本身自带了一个叫Image Editor的工具,同样可以编辑资源文本,但和本文的方法比较,可得出下表:

Image Editor Brcc32
BMP 只支持16位色 任意色
光标 黑白两色 任意色
ICO 只支持16位色 任意色
AVI 不支持 支持
WAV 不支持 支持
字符串 不支持 支持

上面说的是直接在程序本身的调用。其实资源文件还有其它用法。比如说在你的程序携带其它文件,要用的时候释放出来。
例如:

myexe exefile 'ha1.exe'//脚本文件

下面是自定义释放函数ExtractRes,本例中使用如下:

ExtractRes('exefile','myexe','c:\new.exe');

就把ha1.exe以new.exe为名字保存到C盘根目录下了.

function TForm1.ExtractRes(ResType, ResName, ResNewName: string): boolean;
var
Res: TResourceStream;
begin
try
Res := TResourceStream.Create(Hinstance, Resname, Pchar(ResType));
try
Res.SavetoFile(ResNewName);
Result := true;
finally
Res.Free;
end;
except
Result := false;
end;
end;

其实vs2010旗舰版已经安装了Silverlight for Windows Phone项目模版的,只是Silverlight for Windows Phone项目模版是英文的,而vs2010安装的是中文的,所以读取不出来。

解决方法有两个

第一个是在vs2010的工具-选项里面更改语言为英文,更改之前需要更改系统为英文。

第二个方法是将模版从系统模版文件夹复制到用户模版那里,将X:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\ProjectTemplates\CSharp\下面的Silverlight for Windows Phone文件夹复制到X:\Users\你的用户名\Documents\Visual Studio 2010\Templates\ProjectTemplates\Visual C#下。

本文参考:http://www.cnblogs.com/kyo-yo/archive/2011/04/23/Something-About-WP7-Install.html

1.确保有注册资格
首先你需要有一个以edu.cn结尾的邮箱,没有的话,可以找个大学生帮个忙。或者直接联系微软,填写一个表格,告诉微软你希望加入会员,但是你的学校目前不在支持列表里。 24小时内,会有人回信告诉你,他知道你的请求了,然后会给你一个兑换码,用这个兑换码你就可以兑换一个dreamspark会员了。这里有个可以注册edu邮箱的地址
2.登陆Dreamspark
进入https://www.dreamspark.com/Default.aspx,用你的Windows Live ID登录(什么是Dreamspark?Dreamspark最大的作用是免费下载正版的微软开发工具。)
3.开始验证edu邮箱
点击Dreamspark网站左边的“Get Verified”,然后按提示操作,选国家China,选择城市,验证方式选择学生,下面的选通过学校验证,然后选自己edu.cn的邮箱的那个大学,之后提示你输入电子邮件地址,这时输入你的edu.cn那个邮箱地址,然后它会立即发送邮件过去~
4.激活dreamspark
https://www.dreamspark.com/Activate页面,输入从edu.cn那个邮箱中收到的邮件所得到的key,此时dreamspark注册成功。
5. 注册APP HUP
进入http://create.msdn.com/,注册自己的app hub,选择学生,输入
Windows Live ID按提示操作即可。
注意:

  • 1.填写个人资料时,要和Xbox Live里面的资料一致!Xbox Live的资料更改地址:https://live.xbox.com/en-US/Account/BillingAccountInformation
  • 2.填写个人资料时,必须是有效地址,可以是美国地址(别的国家的也可以,但是没有中国,蛋疼……,有效地址网上搜一下一大把)
6.注册成功
之后它会发送邮件给你,一封是确认邮箱地址,一封是注册成功
7.越狱你的设备
通过SDK工具带的Windows Phone Developer Registration解锁你的手机,输入live id即可。
注意:手机必须没有通过其他方式越狱,因为越狱会屏蔽微软的一些服务,导致此工具连接不了手机,这时可以重置一下手机就可以了。

1. <cite>

貌似每个人都比较熟悉<blockquote> 标签,但是你可知道<blockquote>的小弟弟<cite>?<cite> 允许你定义元素内的文字作为一种参考。一般,浏览器会用斜体来显示<cite> 标签内的文字,但是这可以用一点CSS来改变。

2. <optgroup>

<optgroup>标签是定义select标签中的选项分组的一种很好的方法。

3. <acronym> html5中没有了

<acronym> 是一种定义或更多解释一组文字的方法。当你用鼠标放到使用<acronym>标签的文字时,一个显示title标签的内容的框框将会出现在下边。

4. <address>

<address> 标签是一个非常不起眼的小标签,但是这并不意味着它没有用。

5. <ins> 和<del>

如果你想使用标签来显示编辑版本,<ins> 和<del> 正好适合。顾名思义,<ins> 用下划线高亮显示添加进来的内容,而<del> 用删除线显示被移除的信息。

6. <label>

貌似表单元素最容易忘掉何时标记文本。对于表单元素,最常忘记的就是<label> 标签。不仅仅是一个便捷的标记文本的方式,<label> 标签还能传递一个”for” 属性来指定哪个元素将会被关联。<label> 不仅易于用样式来控制,还允许你让标题可点击。

7. <fieldset>

Fieldset是一个小巧的标签,你可以用来为你的表单元素添加逻辑分组。<fieldset>标签就会在其内部的元素周围画一个框。另外一点就是可以在fieldset里面添加<legend> 标签来定义分组的标题。

8. <abbr>

<abbr> 标签颇类似于<acronym> 标签,不同的是<abbr> 标签只用于定义缩写单词。就像<acronym>一样,你可以为这个标签定义一个title属性。当用户将鼠标放到缩写文字上面时,全部内容就会在下面显示。<abbr> 标签很少用,但是对于屏幕阅读者、拼写检查者以及搜索引擎是非常有用的。

9. rel

Rel 可以是一个极度有用的 属性,任何HTML元素都可以应用一个rel属性。它有助于传递没有另外指定的额外参数。这对于在HTML中使用JavaScript的时候是非常有用的。如果你有一个想要在行内编辑的链接,你可以添加:

10. <wbr>

<wbr>标签是一个难以相信的不出名的标签。坦率的讲,我也很怀疑你们会接触到这个标签, 因为它几乎从来没有用到。(的确,在我写这篇文章之前我几乎没有见到过这个标签)。事实上,这个标签算是一个软断行,允许你在某一行内指定一个断行点,表明在该点处可以断行,但是不是一定会断行,仅仅是在有需要断行的时候才会断行。如果你想避免出现水平滚动条,那么使用这个标签是很棒的。

一、字符转换函数

1、ASCII()
返回字符表达式最左端字符的ASCII 码值。在ASCII()函数中,纯数字的字符串可不用‘’括起来,但含其它字符的字符串必须用‘’括起来使用,否则会出错。
2、CHAR()
将ASCII 码转换为字符。如果没有输入~ 255 之间的ASCII 码值,CHAR()返回NULL 。
3、LOWER()和UPPER()
LOWER()将字符串全部转为小写;UPPER()将字符串全部转为大写。
4、STR()
把数值型数据转换为字符型数据。
STR ([,length[,]])
length 指定返回的字符串的长度,decimal 指定返回的小数位数。如果没有指定长度,缺省的length 值为,decimal 缺省值为。
当length 或者decimal 为负值时,返回NULL;
当length 小于小数点左边(包括符号位)的位数时,返回length 个*;
先服从length ,再取decimal ;
当返回的字符串位数小于length ,左边补足空格。

二、去空格函数

1、LTRIM()
把字符串头部的空格去掉。
2、RTRIM()
把字符串尾部的空格去掉。

三、取子串函数

1、left()
LEFT ()
返回character_expression 左起integer_expression 个字符。
2、RIGHT()
RIGHT ()
返回character_expression 右起integer_expression 个字符。
3、SUBSTRING()
SUBSTRING (,length)
返回从字符串左边第starting_ position 个字符起length个字符的部分。

四、字符串比较函数

1、CHARINDEX()
返回字符串中某个指定的子串出现的开始位置。
CHARINDEX (<’substring_expression’>,)
其中substring _expression 是所要查找的字符表达式,expression 可为字符串也可为列名表达式。如果没有发现子串,则返回值。
此函数不能用于TEXT 和IMAGE 数据类型。
2、PATINDEX()
返回字符串中某个指定的子串出现的开始位置。
PATINDEX (<’%substring _expression%’>,)其中子串表达式前后必须有百分号“%”否则返回值为。
与CHARINDEX 函数不同的是,PATINDEX函数的子串中可以使用通配符,且此函数可用于CHAR、VARCHAR 和TEXT 数据类型。

五、字符串操作函数

1、QUOTENAME()
返回被特定字符括起来的字符串。
QUOTENAME (<’character_expression’>[,quote_ character]) 其中quote_ character 标明括字符串所用的字符,缺省值为“[]”。
2、REPLICATE()
返回一个重复character_expression 指定次数的字符串。
REPLICATE (character_expression integer_expression) 如果integer_expression 值为负值,则返回NULL 。
3、REVERSE()
将指定的字符串的字符排列顺序颠倒。
REVERSE () 其中character_expression 可以是字符串、常数或一个列的值。
4、REPLACE()
返回被替换了指定子串的字符串。
REPLACE () 用string_expression3 替换在string_expression1 中的子串string_expression2。
5、SPACE()
返回一个有指定长度的空白字符串。
SPACE () 如果integer_expression 值为负值,则返回NULL 。
6、STUFF()
用另一子串替换字符串指定位置、长度的子串。
STUFF ()
如果起始位置为负或长度值为负,或者起始位置大于character_expression1 的长度,则返回NULL 值。
如果length 长度大于character_expression1 中start_ position 以右的长度,则character_expression1 只保留首字符。

六、数据类型转换函数

1、CAST()
CAST ( AS [ length ])
2、CONVERT()
CONVERT ([ length ], [,style])
1)data_type为SQL Server系统定义的数据类型,用户自定义的数据类型不能在此使用。
2)length用于指定数据的长度,缺省值为。
3)把CHAR或VARCHAR类型转换为诸如INT或SAMLLINT这样的INTEGER类型、结果必须是带正号或负号的数值。
4)TEXT类型到CHAR或VARCHAR类型转换最多为个字符,即CHAR或VARCHAR数据类型是最大长度。
5)IMAGE类型存储的数据转换到BINARY或VARBINARY类型,最多为个字符。
6)把整数值转换为MONEY或SMALLMONEY类型,按定义的国家的货币单位来处理,如人民币、美元、英镑等。
7)BIT类型的转换把非零值转换为,并仍以BIT类型存储。
8)试图转换到不同长度的数据类型,会截短转换值并在转换值后显示“+”,以标识发生了这种截断。
9)用CONVERT()函数的style 选项能以不同的格式显示日期和时间。style 是将DATATIME 和SMALLDATETIME 数据转换为字符串时所选用的由SQL Server 系统提供的转换样式编号,不同的样式编号有不同的输出格式。

七、日期函数

1、day(date_expression)
返回date_expression中的日期值
2、month(date_expression)
返回date_expression中的月份值
3、year(date_expression)
返回date_expression中的年份值
4、DATEADD()
DATEADD ()
返回指定日期date 加上指定的额外日期间隔number 产生的新日期。
5、DATEDIFF()
DATEDIFF ()
返回两个指定日期在datepart 方面的不同之处,即date2 超过date1的差距值,其结果值是一个带有正负号的整数值。
6、DATENAME()
DATENAME ()
以字符串的形式返回日期的指定部分此部分。由datepart 来指定。
7、DATEPART()
DATEPART ()
以整数值的形式返回日期的指定部分。此部分由datepart 来指定。
DATEPART (dd,date) 等同于DAY (date)
DATEPART (mm,date) 等同于MONTH (date)
DATEPART (yy,date) 等同于YEAR (date)
8、GETDATE()
以DATETIME 的缺省格式返回系统当前的日期和时间

八、字符串操作函数

Null函数
–ISNULL (, ),ISNULL() 函数将表达式中的NULL 值用指定值替换
–如果check_expresssion 不是NULL, 则返回其原来的值,否则,返回replacement_value 的值
select IsNull(‘NickName’, ‘none’)
select IsNull(null,’none’)
–NULLIF (, )
–它在expression1 与expression2 相等时返回NULL 值,若不相等时则返回expression1 的值
select nullif(‘abc’,’sql’)
select nullif(‘a’,’a’)
–COALESCE()函数返回众多表达式中第一个非NULL 表达式的值。如果所有的表达式均为NULL,则COALESCE() 函数返回NULL 值
select coalesce(null,’abe’,null)
select coalesce(‘a’,null)