??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲精品视频免费观看,亚洲欧美成人av在线观看,国产成人毛片亚洲精品http://m.tkk7.com/Ben/Java Ben 成长之\zh-cnMon, 12 May 2025 11:08:21 GMTMon, 12 May 2025 11:08:21 GMT60表名作ؓ(f)参数传递的存储q程写法http://m.tkk7.com/Ben/archive/2006/11/16/81560.htmlBenBenThu, 16 Nov 2006 08:49:00 GMThttp://m.tkk7.com/Ben/archive/2006/11/16/81560.htmlhttp://m.tkk7.com/Ben/comments/81560.htmlhttp://m.tkk7.com/Ben/archive/2006/11/16/81560.html#Feedback0http://m.tkk7.com/Ben/comments/commentRss/81560.htmlhttp://m.tkk7.com/Ben/services/trackbacks/81560.htmlSET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO

 

--=================================================================
-- 描述Q~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- 作者:(x)鲁湘
-- @tableName   该模板对应的数据库表
-- @RecordID    业务处理需要寻找表中记录的IDL(fng)
--=================================================================

ALTER    PROCEDURE WF_QingJia
   (@tableName varchar(50),@recordID varchar(50))
AS
-- 获取表中的业务数据?br />DECLARE @money varchar(100),  -- 业务逻辑需要的?br /> @sqls nvarchar(4000)  -- 保存l合SQL语句

SET @sqls='SELECT @a=Money FROM '+@tableName +' WHERE ID ='+@recordID

EXECUTE sp_executesql @sqls,N'@a varchar(50) output',@money output

-- Ҏ(gu)D行相应的业务处理
print @money
UPDATE WF_FormBill SET [Money]='真的被处理了' WHERE [ID]=@recordID

 

GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO



Ben 2006-11-16 16:49 发表评论
]]>
[转]l典SQL语句--收藏 http://blog.ourtw.com/article.php?tid_600.htmlhttp://m.tkk7.com/Ben/archive/2006/04/06/39588.htmlBenBenThu, 06 Apr 2006 07:01:00 GMThttp://m.tkk7.com/Ben/archive/2006/04/06/39588.htmlhttp://m.tkk7.com/Ben/comments/39588.htmlhttp://m.tkk7.com/Ben/archive/2006/04/06/39588.html#Feedback0http://m.tkk7.com/Ben/comments/commentRss/39588.htmlhttp://m.tkk7.com/Ben/services/trackbacks/39588.html[个h收藏]l典SQL语句.值得收藏
_օ的SQL语句Q推荐收?br />在网上经常{,常常看到有些Zؓ(f)了求得某些SQL语句而焦头烂?现在我特别把自己收藏的一些比较精典的SQL拿出来和大家分n一?br />
1. 行列转换--普?br />
假设有张学生成W?CJ)如下
Name   Subject   Result
张三   语文     80
张三   数学     90
张三   物理     85
李四   语文     85
李四   数学     92
李四   物理     82

惛_? 
姓名   语文   数学   物理
张三   80   90   85
李四   85   92   82

declare @sql varchar(4000)
set @sql = ''select Name''
select @sql = @sql + '',sum(case Subject when ''''''+Subject+'''''' then Result end) [''+Subject+'']''
from (select distinct Subject from CJ) as a
select @sql = @sql+'' from test group by name''
exec(@sql)

2. 行列转换--合ƈ

有表A,
id pid
1   1
1   2
1   3
2   1
2   2
3   1
如何化成表B:
id pid
1 1,2,3
2 1,2
3 1

创徏一个合q的函数
create function fmerg(@id int)
returns varchar(8000)
as
begin
declare @str varchar(8000)
set @str=''''
select @str=@str+'',''+cast(pid as varchar) from 表A where id=@id set @str=right(@str,len(@str)-1)
return(@str)
End
go

--调用自定义函数得到结?br />select distinct id,dbo.fmerg(id) from 表A

3. 如何取得一个数据表的所有列?br />
Ҏ(gu)如下Q先从SYSTEMOBJECTpȝ表中取得数据表的SYSTEMID,然后再SYSCOLUMN表中取得该数据表的所有列名?br />SQL语句如下Q?br />declare @objid int,@objname char(40)
set @objname = ''tablename''
select @objid = id from sysobjects where id = object_id(@objname)
select ''Column_name'' = name from syscolumns where id = @objid order by colid

是不是太单了Q?呵呵 不过l常用阿.

4. 通过SQL语句来更改用L(fng)密码

修改别h?需要sysadmin role  
EXEC sp_password NULL, ''newpassword'', ''User''

如果帐号为SA执行EXEC sp_password NULL, ''newpassword'', sa

5. 怎么判断Z个表的哪些字D不允许为空Q?br />
select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where IS_NULLABLE=''NO'' and TABLE_NAME=tablename

6. 如何在数据库里找到含有相同字D늚表?
a. 查已知列名的情况
SELECT b.name as TableName,a.name as columnname
From syscolumns   a INNER JOIN   sysobjects b  
ON a.id=b.id  
AND b.type=''U''  
AND a.name=''你的字段名字''

b. 未知列名查所有在不同表出现过的列?br />Select o.name As tablename,s1.name As columnname
From syscolumns s1, sysobjects o
Where s1.id = o.id
  And o.type = ''U''
  And Exists (
    Select 1 From syscolumns s2  
    Where s1.name = s2.name  
    And s1.id <> s2.id
    )

7. 查询Wxxx行数?br />
假设id是主键:(x)
select *
from (select top xxx * from yourtable) aa
where not exists(select 1 from (select top xxx-1 * from yourtable) bb where aa.id=bb.id)

如果使用游标也是可以?
fetch absolute [number] from [cursor_name]
行数为绝对行?br />
8. SQL Server日期计算
a. 一个月的第一?br />SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)
b. 本周的星期一
SELECT DATEADD(wk, DATEDIFF(wk,0,getdate()), 0)
c. 一q的W一?br />SELECT DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)
d. 季度的第一?br />SELECT DATEADD(qq, DATEDIFF(qq,0,getdate()), 0)
e. 上个月的最后一?
SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))
f. d的最后一?br />SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0))
g. 本月的最后一?br />SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0))
h. 本月的第一个星期一
select DATEADD(wk, DATEDIFF(wk,0,                                      
                    dateadd(dd,6-datepart(day,getdate()),getdate())    
                                                                ), 0)    
i. 本年的最后一?br />SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0))?br />-----------------------------------------------------------------------
1.按姓氏笔L?
Select * From TableName Order By CustomerName Collate Chinese_PRC_Stroke_ci_as

2.数据库加?
select encrypt(''原始密码'')
select pwdencrypt(''原始密码'')
select pwdcompare(''原始密码'',''加密后密?') = 1--相同Q否则不相同 encrypt(''原始密码'')
select pwdencrypt(''原始密码'')
select pwdcompare(''原始密码'',''加密后密?') = 1--相同Q否则不相同

3.取回表中字段:
declare @list varchar(1000),@sql nvarchar(1000)
select @list=@list+'',''+b.name from sysobjects a,syscolumns b where a.id=b.id and a.name=''表A''
set @sql=''select ''+right(@list,len(@list)-1)+'' from 表A''
exec (@sql)

4.查看盘分区:
EXEC master..xp_fixeddrives

5.比较A,B表是否相{?
if (select checksum_agg(binary_checksum(*)) from A)
  =
  (select checksum_agg(binary_checksum(*)) from B)
print ''相等''
else
print ''不相{?'

6.杀掉所有的事g探察器进E?
DECLARE hcforeach CURSOR GLOBAL FOR SELECT ''kill ''+RTRIM(spid) FROM master.dbo.sysprocesses
WHERE program_name IN(''SQL profiler'',N''SQL 事g探查?')
EXEC sp_msforeach_worker ''?''

7.记录搜烦(ch):
开头到N条记?br />Select Top N * From ?br />-------------------------------
N到M条记?要有ȝ(ch)引ID)
Select Top M-N * From ?Where ID in (Select Top M ID From ? Order by ID Desc
----------------------------------
N到结记?br />Select Top N * From ?Order by ID Desc

8.如何修改数据库的名称:
sp_renamedb ''old_name'', ''new_name''

9Q获取当前数据库中的所有用戯
select Name from sysobjects where xtype=''u'' and status>=0

10Q获取某一个表的所有字D?br />select name from syscolumns where id=object_id(''表名'')

11Q查看与某一个表相关的视图、存储过E、函?br />select a.* from sysobjects a, syscomments b where a.id = b.id and b.text like ''%表名%''

12Q查看当前数据库中所有存储过E?br />select name as 存储q程名称 from sysobjects where xtype=''P''

13Q查询用户创建的所有数据库
select * from master..sysdatabases D where sid not in(select sid from master..syslogins where name=''sa'')
或?br />select dbid, name AS DB_NAME from master..sysdatabases where sid <> 0x01

14Q查询某一个表的字D和数据cd
select column_name,data_type from information_schema.columns
where table_name = ''表名''

[n].[标题]:
Select * From TableName Order By CustomerName

[n].[标题]:
Select * From TableName Order By CustomerName


Ben 2006-04-06 15:01 发表评论
]]>
vs2003 和vs2005下的发送SMTP邮g Qdownmoon原创Q?选择?downmoon ?Blog http://m.tkk7.com/Ben/archive/2006/04/06/39580.htmlBenBenThu, 06 Apr 2006 06:18:00 GMThttp://m.tkk7.com/Ben/archive/2006/04/06/39580.htmlhttp://m.tkk7.com/Ben/comments/39580.htmlhttp://m.tkk7.com/Ben/archive/2006/04/06/39580.html#Feedback0http://m.tkk7.com/Ben/comments/commentRss/39580.htmlhttp://m.tkk7.com/Ben/services/trackbacks/39580.html vs2003 和vs2005下的发送SMTP邮g Qdownmoon原创Q?br />一、vs2003
引用 System.Web.Mail命名I间

 private void SenMail2003()
    {
        MailMessage mailObj = new MailMessage();
        mailObj.To = this.txtTo.Text;
        mailObj.From = this.txtFrom.Text;
       
        mailObj.Subject = "_NW话";
        mailObj.Body = "猪!你已中毒! 哈哈 ";
       
        mailObj.BodyFormat = MailFormat.Html;
        mailObj.BodyEncoding = MailFormat.Base64;
        mailObj.Priority = MailPriority.High;
        mailObj.Attachments.Add(new MailAttachment("c:\\swf\\000.bmp"));
        SmtpMail.Send(mailObj);
        Response.Write("发送邮件成功!");
    }

二、vs2005
引用 System.Net.Mail命名I间,安全性得C增强

 public static void SendWebMailAndAttach(string server)
    {
         string file = "e:\\inetpub\\wwwroot\\Test2005All\\TestXML\\testXML.xml";
         System.Net.Mail.MailMessage message = new System.Net.Mail.MailMessage("Test@126.com", "Test@126.com", "text message for you.", "Test Title");
         System.Net.Mail.Attachment data = new System.Net.Mail.Attachment(file, System.Net.Mime.MediaTypeNames.Application.Octet);
         System.Net.Mime.ContentDisposition disposition = data.ContentDisposition;
         disposition.CreationDate = System.IO.File.GetCreationTime(file);
         disposition.ModificationDate = System.IO.File.GetLastWriteTime(file);
         disposition.ReadDate = System.IO.File.GetLastAccessTime(file);
         message.Attachments.Add(data);
        System.Net.Mail.SmtpClient client = new System.Net.Mail.SmtpClient(server);
        client.Credentials = new NetworkCredential("用户?, "密码");
        client.Send(message);
        data.Dispose();
    }
引用CZ
SendWebMailAndAttach("smtp.126.com");



Ben 2006-04-06 14:18 发表评论
]]>
SQL中CONVERT转化函数, Concat , COALESCE的用?/title><link>http://m.tkk7.com/Ben/archive/2006/04/06/39578.html</link><dc:creator>Ben</dc:creator><author>Ben</author><pubDate>Thu, 06 Apr 2006 06:15:00 GMT</pubDate><guid>http://m.tkk7.com/Ben/archive/2006/04/06/39578.html</guid><wfw:comment>http://m.tkk7.com/Ben/comments/39578.html</wfw:comment><comments>http://m.tkk7.com/Ben/archive/2006/04/06/39578.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/Ben/comments/commentRss/39578.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/Ben/services/trackbacks/39578.html</trackback:ping><description><![CDATA[ <p>SQL中CONVERT转化函数的用?/p> <p>CONVERT的用方?</p> <p>////////////////////////////////////////////////////////////////////////////////////////</p> <p>格式:<br />CONVERT(data_type,expression[,style])</p> <p>说明:<br />此样式一般在旉cd(datetime,smalldatetime)与字W串cd(nchar,nvarchar,char,varchar)<br />怺转换的时候才用到.</p> <p>例子:<br />SELECT CONVERT(varchar(30),getdate(),101) now<br />l果?br />now<br />---------------------------------------<br />09/15/2001</p> <p>/////////////////////////////////////////////////////////////////////////////////////</p> <p>style数字在{换时间时的含义如?/p> <p>-------------------------------------------------------------------------------------------------<br />Style(2位表C年? | Style(4位表C年? | 输入输出格式 <br />-------------------------------------------------------------------------------------------------<br />- | 0 or 100 | mon dd yyyy hh:miAM(或PM) <br />-------------------------------------------------------------------------------------------------<br />1 | 101 | mm/dd/yy <br />-------------------------------------------------------------------------------------------------<br />2 | 102 | yy-mm-dd <br />-------------------------------------------------------------------------------------------------<br />3 | 103 | dd/mm/yy <br />-------------------------------------------------------------------------------------------------<br />4 | 104 | dd-mm-yy <br />-------------------------------------------------------------------------------------------------<br />5 | 105 | dd-mm-yy <br />-------------------------------------------------------------------------------------------------<br />6 | 106 | dd mon yy <br />-------------------------------------------------------------------------------------------------<br />7 | 107 | mon dd,yy <br />-------------------------------------------------------------------------------------------------<br />8 | 108 | hh:mm:ss <br />-------------------------------------------------------------------------------------------------<br />- | 9 or 109 | mon dd yyyy hh:mi:ss:mmmmAM(或PM)<br />-------------------------------------------------------------------------------------------------<br />10 | 110 | mm-dd-yy <br />-------------------------------------------------------------------------------------------------<br />11 | 111 | yy/mm/dd <br />-------------------------------------------------------------------------------------------------<br />12 | 112 | yymmdd <br />-------------------------------------------------------------------------------------------------<br />- | 13 or 113 | dd mon yyyy hh:mi:ss:mmm(24时? <br />-------------------------------------------------------------------------------------------------<br />14 | 114 | hh:mi:ss:mmm(24时? <br />-------------------------------------------------------------------------------------------------<br />- | 20 or 120 | yyyy-mm-dd hh:mi:ss(24时? <br />-------------------------------------------------------------------------------------------------<br />- | 21 or 121 | yyyy-mm-dd hh:mi:ss:mmm(24时? <br />-------------------------------------------------------------------------------------------------<br /><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #c60a00; FONT-FAMILY: Arial"><br /><font size="4">concat</font></span><font size="4"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">Ҏ(gu)的结果等?/span></font><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"><font size="4">:result = string1 + string2 + string3 + ?+ stringN</font></span></p> <p class="MsoCommentText" style="MARGIN: 0cm 0cm 0pt"> <font size="4"> <span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #c60a00; FONT-FAMILY: Arial">COALESCE</span> <span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"> </span> <span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">q回其参CW一个非I辑ּ<br /><br /></span> </font> </p> <img src ="http://m.tkk7.com/Ben/aggbug/39578.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/Ben/" target="_blank">Ben</a> 2006-04-06 14:15 <a href="http://m.tkk7.com/Ben/archive/2006/04/06/39578.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转].NET(C#)q接各类数据?集锦 http://m.tkk7.com/Ben/archive/2006/04/05/39377.htmlBenBenWed, 05 Apr 2006 06:07:00 GMThttp://m.tkk7.com/Ben/archive/2006/04/05/39377.htmlhttp://m.tkk7.com/Ben/comments/39377.htmlhttp://m.tkk7.com/Ben/archive/2006/04/05/39377.html#Feedback0http://m.tkk7.com/Ben/comments/commentRss/39377.htmlhttp://m.tkk7.com/Ben/services/trackbacks/39377.html1.C#q接q接Access
E序代码:
-------------------------------------------------------------------------------

using System.Data;
using System.Data.OleDb;

......

string strConnection="Provider=Microsoft.Jet.OleDb.4.0;";
strConnection+=@"Data Source=C:\BegASPNET\Northwind.mdb";

OleDbConnection objConnection=new OleDbConnection(strConnection);

......

objConnection.Open();
objConnection.Close();

......

--------------------------------------------------------------------------------

解释:

 q接Access数据库需要导入额外的命名I间,所以有了最前面的两条using命o(h),q是必不可少?

 strConnectionq个变量里存攄是连接数据库所需要的q接字符?他指定了要用的数据提供者和要用的数据?

 "Provider=Microsoft.Jet.OleDb.4.0;"是指数据提供?q里使用的是Microsoft Jet引擎,也就是Access中的数据引擎,asp.net是靠这个和Access的数据库q接?

 "Data Source=C:\BegASPNET\Northwind.mdb"是指明数据源的位|?他的标准形式?Data Source=MyDrive:MyPath\MyFile.MDB".

PS:
 1."+="后面?@"W号是防止将后面字符串中?\"解析{义字W?
 2.如果要连接的数据库文件和当前文g在同一个目录下,q可以用如下的Ҏ(gu)q接:
  strConnection+="Data Source=";
  strConnection+=MapPath("Northwind.mdb");
  q样可以省得你写一大堆东西?
 3.要注意连接字W串中的参数之间要用分号来分?

 "OleDbConnection objConnection=new OleDbConnection(strConnection);"q一句是利用定义好的q接字符串来建立了一个链接对?以后Ҏ(gu)据库的操作我们都要和q个对象打交?

 "objConnection.Open();"q用来打开q接.x,与Access数据库的q接完成.
--------------------------------------------------------------------------------

2.C#q接SQL Server
E序代码:
--------------------------------------------------------------------------------

using System.Data;
using System.Data.SqlClient;

...

string strConnection="user id=sa;password=;";
strConnection+="initial catalog=Northwind;Server=YourSQLServer;";
strConnection+="Connect Timeout=30";

SqlConnection objConnection=new SqlConnection(strConnection);

...

objConnection.Open();
objConnection.Close();

...

--------------------------------------------------------------------------------

解释:

q接SQL Server数据库的机制与连接Access的机制没有什么太大的区别,只是改变了Connection对象和连接字W串中的不同参数.

首先,q接SQL Server使用的命名空间不?System.Data.OleDb",而是"System.Data.SqlClient".

其次是他的q接字符串了,我们一个一个参数来介绍(注意:参数间用分号分隔):
 "user id=sa":q接数据库的验证用户名ؓ(f)sa.他还有一个别?uid",所以这句我们还可以写成"uid=sa".
 "password=":q接数据库的验证密码为空.他的别名?pwd",所以我们可以写?pwd=".
 q里注意,你的SQL Server必须已经讄了需要用户名和密码来d,否则不能用这L(fng)方式来登?如果你的SQL Server讄为Windowsd,那么在这里就不需要?user id"?password"q样的方式来d,而需要?Trusted_Connection=SSPI"来进行登?
 "initial catalog=Northwind":使用的数据源?Northwind"q个数据?他的别名?Database",本句可以写成"Database=Northwind".
 "Server=YourSQLServer":使用名ؓ(f)"YourSQLServer"的服务器.他的别名?Data Source","Address","Addr".如果使用的是本地数据库且定义了实例名,则可以写?Server=(local)\实例?;如果是远E服务器,则将"(local)"替换E服务器的名U或IP地址.
 "Connect Timeout=30":q接时旉?0U?

 在这?建立q接对象用的构造函Cؓ(f):SqlConnection.
--------------------------------------------------------------------------------

3.C#q接Oracle
E序代码:
--------------------------------------------------------------------------------

using System.Data.OracleClient;
using System.Data;

//在窗体上d一个按钮,叫Button1Q双击Button1Q输入以下代?br />private void Button1_Click(object sender, System.EventArgs e)
{
string ConnectionString="Data Source=sky;user=system;password=manager;";//写连接串
OracleConnection conn=new OracleConnection(ConnectionString);//创徏一个新q接
try
{
conn.Open();
OracleCommand cmd=conn.CreateCommand();

cmd.CommandText="select * from MyTable";//在这儿写sql语句
OracleDataReader odr=cmd.ExecuteReader();//创徏一个OracleDateReader对象
while(odr.Read())//d数据Q如果odr.Read()q回为false的话Q就说明到记录集的尾部了               
{
Response.Write(odr.GetOracleString(1).ToString());//输出字段1Q这个数是字D늃(ch)引,具体怎么使用字段名还有待研究
}
odr.Close();
}
catch(Exception ee)
{
Response.Write(ee.Message); //如果有错误,输出错误信息
}
finally
{
conn.Close(); //关闭q接
}
}

--------------------------------------------------------------------------------

4.C#q接MySQL
E序代码:
--------------------------------------------------------------------------------

using MySQLDriverCS;

// 建立数据库连?br />MySQLConnection DBConn;
DBConn = new MySQLConnection(new MySQLConnectionString("localhost","mysql","root","",3306).AsString);
DBConn.Open();

// 执行查询语句
MySQLCommand DBComm;
DBComm = new MySQLCommand("select Host,User from user",DBConn);

// d数据
MySQLDataReader DBReader = DBComm.ExecuteReaderEx();

// 昄数据
try
{
while (DBReader.Read())
{
Console.WriteLine("Host = {0} and User = {1}", DBReader.GetString(0),DBReader.GetString(1));
}
}
finally
{
DBReader.Close();
DBConn.Close();
}

//关闭数据库连?br />DBConn.Close();

--------------------------------------------------------------------------------

5.C#q接IBM DB2
E序代码:
--------------------------------------------------------------------------------

OleDbConnection1.Open();
//打开数据库连?br />OleDbDataAdapter1.Fill(dataSet1,"Address");
//得来的数据填入dataSet
DataGrid1.DataBind();
//l定数据
OleDbConnection1.Close();
//关闭q接

//增加数据库数?br />在Web Form上新增对应字D|量个数的TextBoxQ及(qing)一个buttonQؓ(f)该按键增加Click响应事g代码如下Q?br />
this.OleDbInsertCommand1.CommandText = "INSERTsintosADDRESS(NAME,
EMAIL, AGE, ADDRESS) VALUES
('"+TextBox1.Text+"','"+TextBox2.Text+"','"+TextBox3.Text+"','"+TextBox4.Text+"')";
OleDbInsertCommand1.Connection.Open();
//打开q接
OleDbInsertCommand1.ExecuteNonQuery();
//执行该SQL语句
OleDbInsertCommand1.Connection.Close();
//关闭q接

--------------------------------------------------------------------------------

6.C#q接SyBase
E序代码: (OleDb)
--------------------------------------------------------------------------------

Provider=Sybase.ASEOLEDBProvider.2;Initial Catalog=数据库名;User ID=用户?Data Source=数据?Extended Properties="";Server Name=ip地址;Network Protocol=Winsock;Server Port Address=5000;



Ben 2006-04-05 14:07 发表评论
]]>
[转帖]SQL Server - [分布式查?事务]http://m.tkk7.com/Ben/archive/2006/03/29/38085.htmlBenBenWed, 29 Mar 2006 08:35:00 GMThttp://m.tkk7.com/Ben/archive/2006/03/29/38085.htmlhttp://m.tkk7.com/Ben/comments/38085.htmlhttp://m.tkk7.com/Ben/archive/2006/03/29/38085.html#Feedback0http://m.tkk7.com/Ben/comments/commentRss/38085.htmlhttp://m.tkk7.com/Ben/services/trackbacks/38085.html 分布式查?/font>
    OPENROWSET
    从Excel取数?/font>
    SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0','Excel 8.0;Database=d:\1.xls',[Sheet1$])
    从Oracle取数?/font>
    SELECT * FROM OPENROWSET('MSDAORA.1','NetServiceName';'User';'Password','SELECT * FROM OracleTalbe')
 
    Linked Server(for Oracle)
    建立Linked Server
    sp_addlinkedserver'Allies', 'Oracle', 'MSDAORA.1', 'NetServiceName'
    Oracle的Login
    sp_addlinkedsrvlogin'Allies', FALSE, 'SQLServerLogin', 'OracleUser', 'OraclePassword'
    从Oracle查询数据
    SELECT*FROM OPENQUERY( Allies, 'SELECT * FROM OracleTalbe')Q或?/font>
    SELECT*FROM Allies..OracleUser.OracleTalbe
    修改Linked Server的Server Option
     sp_serveroption'Allies', 'Option Name', 'Option Value'
    例如
    sp_serveroption'OraDC', 'rpc out', 'true'
    sp_serveroption'OraDC', 'rpc', 'true'
    向Oracle插入数据Q还没有用过Q?/font>
    INSERT INTO OPENQUERY(Allies, 'SELECT ... FROM OracleTalbe WHERE 1=2') VALUES ( ... )
    删除Linked Server
    sp_dropserver'Allies', 'droplogins'
 
    注意Q用OPENROWSET、OPENQUERYӞSQL Server不对提交的SQL语句做Q何检查,直接语句提交给Linked Serverq行处理Q用四部分命名法时QSQL Server可能从Linked Server上读取被引用表的数据到SQL ServerQ然后在SQL Server上来完成其它操作?/font>
 
    讄SQL Server到Oracle的Linked ServerQ可参考以下KB文章Q?/font>
 
    分布式事务中的OPENROWSET、OPENQUERY、OPENDATASOURCE
    如果在事务,或是一些隐含用事务的情况下,例如TRIGGER中,使用OPENROWSET、OPENQUERY、OPENDATASOURCEӞ需要用分布式事务来处理?/font>
    在分布式事务中用OPENROWSET、OPENQUERY、OPENDATASOURCE或Linked ServerӞ需要注意:(x)
    1. 必须启动MSDTC服务?/font>
    Service Name为Distributed Transaction Coodinator?/font>
    2. 所涉及(qing)的Server之间如果存在|关、防火墙Q需要开启TCP 135端口?/font>
    分布式事务需要用这个端口通讯?/font>
    3. 如果Server之间跨网D,则Server之间需要能互相PING到机器名Q而不是IP地址Q?/font>
    如果怺PING机器名有问题Q修?font color="#990099">system32/driver/etc目录下的hosts文g?/font>
 
    上面的设|不正确Ӟ?x)出现类似如下的错误Q?/font>
    该操作未能执行,因ؓ(f) OLE DB 提供E序 'SQLOLEDB' 无法启动分布式事务?br />[OLE/DB provider returned message: C务不能登记到指定的事务处理器中?]
OLE DB 错误跟踪QOLE/DB Provider 'SQLOLEDB' ITransactionJoin::JoinTransaction returned 0x8004d00aQ?/font>  
 
    分布式事务可以查询下列KB文章Q?/font>
 
    使用分布式查询,可以参考:(x)Chapter 25 - Distributed Queries: OLE DB Connectivity?/font>
    关于ORAOLEDB提供E序的详l说明,可以参考:(x)Oracle Provider for OLE DB Developer's Guide - Release 9.2 ?/font>


Ben 2006-03-29 16:35 发表评论
]]>
[转]揭开正则表达式的秘面纱http://m.tkk7.com/Ben/archive/2006/02/22/31923.htmlBenBenWed, 22 Feb 2006 02:47:00 GMThttp://m.tkk7.com/Ben/archive/2006/02/22/31923.htmlhttp://m.tkk7.com/Ben/comments/31923.htmlhttp://m.tkk7.com/Ben/archive/2006/02/22/31923.html#Feedback0http://m.tkk7.com/Ben/comments/commentRss/31923.htmlhttp://m.tkk7.com/Ben/services/trackbacks/31923.html[原创文章Q{载请保留或注明出处:(x)http://www.regexlab.com/zh/regref.htm]

引言

    正则表达式(regular expressionQ描qC一U字W串匚w的模式,可以用来Q(1Q检查一个串中是否含有符合某个规则的子串Qƈ且可以得到这个子ԌQ?Q根据匹配规则对字符串进行灵zȝ替换操作?BR>
    正则表达式学?fn)v来其实是很简单的Q不多的几个较ؓ(f)抽象的概念也很容易理解。之所以很多h感觉正则表达式比较复杂,一斚w是因为大多数的文档没有做到由入深地讲解Q概念上没有注意先后序Q给读者的理解带来困难Q另一斚wQ各U引擎自带的文档一般都要介l它Ҏ(gu)的功能,然而这部分Ҏ(gu)的功能ƈ不是我们首先要理解的?BR>
    文章中的每一个D例,都可以点击进入到试面q行试。闲话少_(d)开始?/P>


1. 正则表达式规?/B>

1.1 普通字W?/B>

    字母、数字、汉字、下划线、以?qing)后边章节中没有?gu)定义的标点符P都是"普通字W?。表辑ּ中的普通字W,在匹配一个字W串的时候,匚w与之相同的一个字W?BR>
    Q匹配结果是Q成功;匚w到的内容是:(x)"c"Q匹配到的位|是Q开始于2Q结束于3。(注:(x)下标?开始还是从1开始,因当前编E语a的不同而可能不同)

   
Q匹配结果是Q成功;匚w到的内容是:(x)"bcd"Q匹配到的位|是Q开始于1Q结束于4?/P>


1.2 单的转义字符

    一些不便书写的字符Q采用在前面?"\" 的方法。这些字W其实我们都已经熟知了?/P>

表达?/P>

可匹?/P>

\r, \n

代表回R和换行符

\t

制表W?/P>

\\

代表 "\" 本n

    q有其他一些在后边章节中有Ҏ(gu)用处的标点符P在前面加 "\" 后,׃表该W号本n。比如:(x)^, $ 都有Ҏ(gu)意义Q如果要惛_配字W串?"^" ?"$" 字符Q则表达式就需要写?"\^" ?"\$"?/P>

表达?/P>

可匹?/P>

\^

匚w ^ W号本n

\$

匚w $ W号本n

\.

匚w数点(.Q本w?/P>

    q些转义字符的匹配方法与 "普通字W? 是类似的。也是匹配与之相同的一个字W?BR>
   
Q匹配结果是Q成功;匚w到的内容是:(x)"$d"Q匹配到的位|是Q开始于3Q结束于5?/P>


1.3 能够?'多种字符' 匚w的表辑ּ

    正则表达式中的一些表C方法,可以匚w '多种字符' 其中的Q意一个字W。比如,表达?"\d" 可以匚wL一个数字。虽然可以匹配其中Q意字W,但是只能是一个,不是多个。这好比玩扑克牌时候,大小王可以代替Q意一张牌Q但是只能代替一张牌?/P>

表达?/P>

可匹?/P>

\d

L一个数字,0~9 中的L一?/P>

\w

L一个字母或数字或下划线Q也是 A~Z,a~z,0~9,_ 中Q意一?/P>

\s

包括I格、制表符、换늬{空白字W的其中L一?/P>

.

数点可以匹配除了换行符Q\nQ以外的L一个字W?/P>

    Q匹配的l果是:(x)成功Q匹配到的内Ҏ(gu)Q?12"Q匹配到的位|是Q开始于3Q结束于5?BR>
   
Q匹配的l果是:(x)成功Q匹配到的内Ҏ(gu)Q?aa1"Q匹配到的位|是Q开始于1Q结束于4?/P>


1.4 自定义能够匹?'多种字符' 的表辑ּ

    使用Ҏ(gu)?[ ] 包含一pd字符Q能够匹配其中Q意一个字W。用 [^ ] 包含一pd字符Q则能够匚w其中字符之外的Q意一个字W。同L(fng)道理Q虽然可以匹配其中Q意一个,但是只能是一个,不是多个?/P>

表达?/P>

可匹?/P>

[ab5@]

匚w "a" ?"b" ?"5" ?"@"

[^abc]

匚w "a","b","c" 之外的Q意一个字W?/P>

[f-k]

匚w "f"~"k" 之间的Q意一个字?/P>

[^A-F0-3]

匚w "A"~"F","0"~"3" 之外的Q意一个字W?/P>

    Q匹配的l果是:(x)成功Q匹配到的内Ҏ(gu)Q?bc"Q匹配到的位|是Q开始于1Q结束于3?BR>
   
Q匹配的l果是:(x)成功Q匹配到的内Ҏ(gu)Q?1"Q匹配到的位|是Q开始于3Q结束于4?/P>


1.5 修饰匚wơ数的特D符?/B>

    前面章节中讲到的表达式,无论是只能匹配一U字W的表达式,q是可以匚w多种字符其中L一个的表达式,都只能匹配一ơ。如果用表辑ּ再加上修饰匹配次数的Ҏ(gu)W号Q那么不用重复书写表辑ּ可以重复匹配?BR>
    使用Ҏ(gu)是:(x)"ơ数修饰"攑֜"被修饰的表达?后边。比如:(x)"[bcd][bcd]" 可以写成 "[bcd]{2}"?/P>

表达?/P>

作用

{n}

表达式重复nơ,比如Q?A 相当?"\w\w"Q?A 相当?"aaaaa"

{m,n}

表达式至重复mơ,最多重复nơ,比如Q?A ba"?baa"?baaa"

{m,}

表达式至重复mơ,比如Q?A a12","_456","M12344"...

?

匚w表达?ơ或?ơ,相当?{0,1}Q比如:(x)

+

表达式至出?ơ,相当?{1,}Q比如:(x)

*

表达式不出现或出CQ意次Q相当于 {0,}Q比如:(x)

    Q匹配的l果是:(x)成功Q匹配到的内Ҏ(gu)Q?12.5"Q匹配到的位|是Q开始于10Q结束于14?BR>
   
Q匹配的l果是:(x)成功Q匹配到的内Ҏ(gu)Q?goooooogle"Q匹配到的位|是Q开始于7Q结束于17?/P>


1.6 其他一些代表抽象意义的Ҏ(gu)W号

    一些符号在表达式中代表抽象的特D意义:(x)

表达?/P>

作用

^

与字W串开始的地方匚wQ不匚wM字符

$

与字W串l束的地方匹配,不匹配Q何字W?/P>

\b

匚w一个单词边界,也就是单词和I格之间的位|,不匹配Q何字W?/P>

    q一步的文字说明仍然比较抽象Q因此,举例帮助大家理解?BR>
   
Q匹配结果是Q失败。因?"^" 要求与字W串开始的地方匚wQ因此,只有?"aaa" 位于字符串的开头的时候,"^aaa" 才能匚wQ?A >比如Q?aaa xxx xxx"?BR>
    Q匹配结果是Q失败。因?"$" 要求与字W串l束的地方匹配,因此Q只有当 "aaa" 位于字符串的l尾的时候,"aaa$" 才能匚wQ?A >比如Q?xxx xxx aaa"?BR>
    Q匹配结果是Q成功;匚w到的内容是:(x)"@a"Q匹配到的位|是Q开始于2Q结束于4?BR>    q一步说明:(x)"\b" ?"^" ?"$" cMQ本w不匚wM字符Q但是它要求它在匚wl果中所处位|的左右两边Q其中一Ҏ(gu) "\w" 范围Q另一Ҏ(gu) ?\w" 的范围?BR>
   
Q匹配结果是Q成功;匚w到的内容是:(x)"end"Q匹配到的位|是Q开始于15Q结束于18?/P>

    一些符号可以媄(jing)响表辑ּ内部的子表达式之间的关系Q?/P>

表达?/P>

作用

|

左右两边表达式之?"? 关系Q匹配左Ҏ(gu)者右?/P>

( )

(1). 在被修饰匚wơ数的时候,括号中的表达式可以作为整体被修饰
(2). 取匹配结果的时候,括号中的表达式匹配到的内容可以被单独得到

    Q匹配结果是Q成功;匚w到的内容是:(x)"Tom"Q匹配到的位|是Q开始于4Q结束于7。匹配下一个时Q匹配结果是Q成功;匚w到的内容是:(x)"Jack"Q匹配到的位|时Q开始于15Q结束于19?BR>
   
Q匹配结果是Q成功;匚w到内Ҏ(gu)Q?go go go"Q匹配到的位|是Q开始于6Q结束于14?BR>
   
Q匹配的l果是:(x)成功Q匹配到的内Ҏ(gu)Q?K?0.5"Q匹配到的位|是Q开始于6Q结束于10。单独获取括可围匹配到的内Ҏ(gu)Q?20.5"?/P>


2. 正则表达式中的一些高U规?/B>

2.1 匚wơ数中的贪婪与非贪婪

    在用修饰匹配次数的Ҏ(gu)W号Ӟ有几U表C方法可以同一个表辑ּ能够匚w不同的次敎ͼ比如Q?{m,n}", "{m,}", "?", "*", "+"Q具体匹配的ơ数随被匚w的字W串而定。这U重复匹配不定次数的表达式在匚wq程中,L可能多的匹配。比如,针对文本 "dxxxdxxxd"QD例如下:(x)

表达?/P>

匚wl果

(d)(\w+)

"\w+" 匹配第一?"d" 之后的所有字W?"xxxdxxxd"

(d)(\w+)(d)

"\w+" 匹配第一?"d" 和最后一?"d" 之间的所有字W?"xxxdxxx"。虽?"\w+" 也能够匹配上最后一?"d"Q但是ؓ(f)了整个表达式匹配成功,"\w+" 可以 "让出" 它本来能够匹配的最后一?"d"

    由此可见Q?\w+" 在匹配的时候,L可能多的匹配符合它规则的字W。虽然第二个举例中,它没有匹配最后一?"d"Q但那也是ؓ(f)了让整个表达式能够匹配成功。同理,?"*" ?"{m,n}" 的表辑ּ都是可能地多匹配,?"?" 的表辑ּ在可匚w可不匚w的时候,也是可能的 "要匹?。这 U匹配原则就叫作 "贪婪" 模式 ?/P>

    非贪婪模式:(x)

    在修饰匹配次数的Ҏ(gu)W号后再加上一?"?" P则可以匚wơ数不定的表辑ּ可能少的匹配,使可匚w可不匚w的表辑ּQ尽可能?"不匹?。这U匹配原则叫?"非贪? 模式Q也叫作 "勉强" 模式。如果少匚w׃(x)D整个表达式匹配失败的时候,与贪婪模式类|非贪婪模式会(x)最限度的再匹配一些,以整个表达式匹配成功。D例如下,针对文本 "dxxxdxxxd" 举例Q?/P>

表达?/P>

匚wl果

(d)(\w+?)

"\w+?" 尽可能的匚wW一?"d" 之后的字W,l果是:(x)"\w+?" 只匹配了一?"x"

(d)(\w+?)(d)

Z让整个表辑ּ匚w成功Q?\w+?" 不得不匹?"xxx" 才可以让后边?"d" 匚wQ从而整个表达式匹配成功。因此,l果是:(x)"\w+?" 匚w "xxx"

    更多的情况,举例如下Q?BR>
   
Q匹配的l果是:(x)成功Q匹配到的内Ҏ(gu) "<td><p>aa</p></td> <td><p>bb</p></td>" 整个字符Ԍ 表达式中?"</td>" 与字符串中最后一?"</td>" 匚w?

   
Q将只得?"<td><p>aa</p></td>"Q?再次匚w下一个时Q可以得到第二个 "<td><p>bb</p></td>"?/P>


2.2 反向引用 \1, \2...

    表达式在匚wӞ表达式引擎会(x)小括号 "( )" 包含的表辑ּ所匚w到的字符串记录下来。在获取匚wl果的时候,括号包含的表达式所匚w到的字符串可以单独获取。这一点,在前面的举例中,已经多次展示了。在实际应用场合中,当用某种边界来查找,而所要获取的内容又不包含边界Ӟ必须使用括h指定所要的范围。比如前面的 "<td>(.*?)</td>"?BR>
    其实Q?括号包含的表达式所匚w到的字符? 不仅是在匚wl束后才可以使用Q在匚wq程中也可以使用。表辑ּ后边的部分,可以引用前面 "括号内的子匹配已l匹配到的字W串"。引用方法是 "\" 加上一个数字?\1" 引用W?Ҏ(gu)号内匚w到的字符Ԍ"\2" 引用W?Ҏ(gu)号内匚w到的字符东y…以此类推,如果一Ҏ(gu)号内包含另一Ҏ(gu)P则外层的括号先排序号。换句话_(d)哪一对的左括?"(" 在前Q那q一对就先排序号?/P>

    举例如下Q?BR>
   
Q匹配结果是Q成功;匚w到的内容是:(x)" 'Hello' "。再ơ匹配下一个时Q可以匹配到 " "World" "?BR>
   
Q匹配结果是Q成功;匚w到的内容?"ccccc"。再ơ匹配下一个时Q将得到 999999999。这个表辑ּ要求 "\w" 范围的字W至重?ơ,?BR>
   
Q匹配结果是成功。如?"<td>" ?"</td>" 不配对,则会(x)匚wp|Q如果改成其他配对,也可以匹配成功?/P>


2.3 预搜索,不匹配;反向预搜索,不匹?/B>

    前面的章节中Q我讲到了几个代表抽象意义的Ҏ(gu)W号Q?^"Q?$"Q?\b"。它们都有一个共同点Q那是Q它们本w不匚wM字符Q只是对 "字符串的两头" 或?"字符之间的缝? 附加了一个条件。理解到q个概念以后Q本节将l箋介绍另外一U对 "两头" 或?"~隙" 附加条g的,更加灉|的表C方法?/P>

    正向预搜索:(x)"(?=xxxxx)"Q?(?!xxxxx)"

    格式Q?(?=xxxxx)"Q在被匹配的字符串中Q它Ҏ(gu)处的 "~隙" 或?"两头" 附加的条件是Q所在缝隙的右侧Q必能够匹配上 xxxxx q部分的表达式。因为它只是在此作ؓ(f)q个~隙上附加的条gQ所以它q不影响后边的表辑ּȝ正匹配这个缝隙之后的字符。这q?"\b"Q本w不匚wM字符?\b" 只是所在缝隙之前、之后的字符取来q行了一下判断,不会(x)影响后边的表辑ּ来真正的匚w?BR>
   
Q将只匹?"Windows NT" 中的 "Windows "Q其他的 "Windows " 字样则不被匹配?BR>
   
Q将可以匚w6?f"的前4个,可以匚w9?9"的前7个。这个表辑ּ可以读解成:(x)重复4ơ以上的字母数字Q则匚w其剩下最?位之前的部分。当?dng)q个表达式可以不q样写,在此的目的是作ؓ(f)演示之用?/P>

    格式Q?(?!xxxxx)"Q所在缝隙的右侧Q必M能匹?xxxxx q部分表辑ּ?BR>
   
Q将从头一直匹配到 "stop" 之前的位|,如果字符串中没有 "stop"Q则匚w整个字符丌Ӏ?BR>
   
Q只能匹?"do"。在本条举例中,"do" 后边使用 "(?!\w)" 和?"\b" 效果是一L(fng)?/P>

    反向预搜索:(x)"(?<=xxxxx)"Q?(?<!xxxxx)"

    q两U格式的概念和正向预搜烦(ch)是类似的Q反向预搜烦(ch)要求的条件是Q所在缝隙的 "左侧"Q两U格式分别要求必能够匹配和必须不能够匹配指定表辑ּQ而不是去判断右侧。与 "正向预搜? 一L(fng)是:(x)它们都是Ҏ(gu)在缝隙的一U附加条Ӟ本n都不匚wM字符?BR>
    举例5Q表辑ּ "(?<=\d{4})\d+(?=\d{4})" 在匹?"1234567890123456" Ӟ匹配除了前4个数字和?个数字之外的中间8个数字。由?JScript.RegExp 不支持反向预搜烦(ch)Q因此,本条举例不能够进行演C。很多其他的引擎可以支持反向预搜索,比如QJava 1.4 以上?java.util.regex 包,.NET 中System.Text.RegularExpressions 命名I间Qboost::regex 以及(qing)
GRETA 正则表达式库{?/P>


3. 其他通用规则

    q有一些在各个正则表达式引擎之间比较通用的规则,在前面的讲解q程中没有提到?/P>

3.1 表达式中Q可以?"\xXX" ?"\uXXXX" 表示一个字W("X" 表示一个十六进制数Q?/P>

形式

字符范围

\xXX

~号?0 ~ 255 范围的字W,比如Q?A \x20" 表示

\uXXXX

M字符可以使用 "\u" 再加上其~号?位十六进制数表示Q比如:(x)

3.2 在表辑ּ "\s"Q?\d"Q?\w"Q?\b" 表示Ҏ(gu)意义的同Ӟ对应的大写字母表C相反的意义

表达?/P>

可匹?/P>

\S

\D

匚w所有的非数字字W?/A>

\W

匚w所有的字母、数字、下划线以外的字W?/A>

\B

3.3 在表辑ּ中有Ҏ(gu)意义Q需要添?"\" 才能匚w该字W本w的字符汇?/P>

字符

说明

^

匚w输入字符串的开始位|。要匚w "^" 字符本nQ请使用 "\^"

$

匚w输入字符串的l尾位置。要匚w "$" 字符本nQ请使用 "\$"

( )

标记一个子表达式的开始和l束位置。要匚w括P请?"\(" ?"\)"

[ ]

用来自定义能够匹?'多种字符' 的表辑ּ。要匚w中括P请?"\[" ?"\]"

{ }

修饰匚wơ数的符受要匚w大括P请?"\{" ?"\}"

.

匚w除了换行W(\nQ以外的L一个字W。要匚w数Ҏ(gu)w,请?"\."

?

修饰匚wơ数?0 ơ或 1 ơ。要匚w "?" 字符本nQ请使用 "\?"

+

修饰匚wơ数?1 ơ。要匚w "+" 字符本nQ请使用 "\+"

*

修饰匚wơ数?0 ơ或Lơ。要匚w "*" 字符本nQ请使用 "\*"

|

左右两边表达式之?"? 关系。匹?"|" 本nQ请使用 "\|"

3.4 括号 "( )" 内的子表辑ּQ如果希望匹配结果不q行记录供以后用,可以使用 "(?:xxxxx)" 格式

    举例1Q表辑ּ "(?:(\w)\1)+" 匚w "a bbccdd efg" ?/A>Q结果是 "bbccdd"。括?"(?:)" 范围的匹配结果不q行记录Q因?"(\w)" 使用 "\1" 来引用?/P>

3.5 常用的表辑ּ属性设|简介:(x)IgnorecaseQSinglelineQMultilineQGlobal

表达式属?/P>

说明

Ignorecase

默认情况下,表达式中的字母是要区分大写的。配|ؓ(f) Ignorecase 可匚w时不区分大小写。有的表辑ּ引擎Q把 "大小? 概念延?UNICODE 范围的大写?/P>

Singleline

默认情况下,数?"." 匚w除了换行W(\nQ以外的字符。配|ؓ(f) Singleline 可ɞ数点可匚w包括换行W在内的所有字W?/P>

Multiline

默认情况下,表达?"^" ?"$" 只匹配字W串的开??和结??位置。如Q?BR>
①xxxxxxxxx②\n
③xxxxxxxxx?BR>
配置?Multiline 可以?"^" q可以匹配换行符之后Q下一行开始前 ?的位|,?"$" q可以匹配换行符之前Q一行结??的位|?/P>

Global

主要在将表达式用来替换时起作用,配置?Global 表示替换所有的匚w?/P>


4. l合提示

4.1 如果要要求表辑ּ所匚w的内Ҏ(gu)整个字符Ԍ而不是从字符串中找一部分Q那么可以在表达式的首尾使用 "^" ?"$"Q比如:(x)"^\d+$" 要求整个字符串只有数字?/P>

4.2 如果要求匚w的内Ҏ(gu)一个完整的单词Q而不?x)是单词的一部分Q那么在表达式首?"\b"Q比如:(x)?/P>

4.3 表达式不要匹配空字符丌Ӏ否则会(x)一直得到匹配成功,而结果什么都没有匚w到。比如:(x)准备写一个匹?"123"?123."?123.5"?.5" q几UŞ式的表达式时Q整数、小数点、小数数字都可以省略Q但是不要将表达式写成:(x)"\d*\.?\d*"Q因为如果什么都没有Q这个表辑ּ也可以匹配成功?A ?/P>

4.4 能匹配空字符串的子匹配不要@环无限次。如果括号内的子表达式中的每一部分都可以匹?0 ơ,而这个括h体又可以匚w无限ơ,那么情况可能比上一条所说的更严重,匚wq程中可能死循环。虽然现在有些正则表辑ּ引擎已经通过办法避免了这U情况出现死循环了,比如 .NET 的正则表辑ּQ但是我们仍然应该尽量避免出现这U情c(din)如果我们在写表辑ּ旉Cd@环,也可以从q一点入手,查找一下是否是本条所说的原因?/P>

4.5 合理选择贪婪模式与非贪婪模式?/P>

4.6 ?"|" 的左右两边,Ҏ(gu)个字W最好只有一边可以匹配,q样Q不?x)因?"|" 两边的表辑ּ因ؓ(f)交换位置而有所不同?/P>


5. 搜烦(ch)更多正则表达式支?

在以下搜索字D中输入关键字,查找问题的答案?



Ben 2006-02-22 10:47 发表评论
]]>
了解DLLhttp://m.tkk7.com/Ben/archive/2006/02/17/31172.htmlBenBenFri, 17 Feb 2006 03:25:00 GMThttp://m.tkk7.com/Ben/archive/2006/02/17/31172.htmlhttp://m.tkk7.com/Ben/comments/31172.htmlhttp://m.tkk7.com/Ben/archive/2006/02/17/31172.html#Feedback0http://m.tkk7.com/Ben/comments/commentRss/31172.htmlhttp://m.tkk7.com/Ben/services/trackbacks/31172.html一、从DLL技术说?/SPAN>

要了?/SPAN>DLL木马Q就必须知道q个“DLL?/SPAN>是什么意思,所以,让我们追溯到几年前,DOSpȝ大行光的日子里。在那时候,写程序是一件繁琐的事情Q因为每个程序的代码都是独立的,有时候ؓ(f)了实C个功能,p为此写很多代码,后来随着~程技术发展,E序员们把很多常用的代码集合Q通用代码Q放q一个独立的文g里,q把q个文gUCؓ(f)?/SPAN>?/SPAN>?/SPAN>Q?/SPAN>LibraryQ,在写E序的时候,把这个库文g加入~译?/SPAN>Q就能用这个库包含的所有功能而不必自己再d一大堆代码Q这个技术被UCؓ(f)?/SPAN>静态链?/SPAN>?/SPAN>Q?/SPAN>Static LinkQ。静态链接技术让劳篏的程序员松了口气Q一切似乎都很美好。可是事实证明,好的事物不?x)存在太久,因?f)静态链接就像一个粗鲁的推销员,不管你想不想要宣传单Q他都全部塞C的手上来。写一个程序只想用C个库文g包含的某个图形效果,因个,你不得不把这个库文g携带的所有的囑Ş效果都加入程序,留着它们当花瓶摆设,q倒没什么重要,可是q些q却把道\都阻塞了—?/SPAN>静态链接技术让最l的E序成了大块_(d)因ؓ(f)~译?/SPAN>把整个库文g也算q去了?/SPAN>

时代在发展,静态链接技术由于天生的弊端Q不能满程序员的愿望,Z开始寻找一U更好的Ҏ(gu)来解决代码重复的N。后来,Windowspȝ出现了,时代的分水岭l于出现?/SPAN>Windowspȝ使用一U新的链接技术,q种被称?/SPAN>?/SPAN>动态链?/SPAN>?/SPAN>Q?/SPAN>Dynamic LinkQ的新技术同样也是用库文gQ?/SPAN>微YU它们ؓ(f)?B>动态链接库
”——Dynamic Link LibraryQ?/SPAN>DLL的名字就是这h的。动态链接本w和静态链接没什么区别,也是把通用代码写进一些独立文仉Q但是在~译斚wQ?/SPAN>微Yl了个圈子,q没有采取把库文件加q程序的Ҏ(gu)Q而是把库文g做成已经~译好的E序文gQ给它们开个交换数据的接口Q程序员写程序的时候,一旦要使用某个库文件的一个功能函敎ͼpȝ把q个库文件调入内存,q接上这个程序占有的dq程Q然后执行程序要用的功能函数Qƈ把结果返回给E序昄出来Q在我们看来Q就像是E序自己带有的功能一栗完成需要的功能后,q个DLL停止q行Q整个调用过E结束?/SPAN>微Y让这些库文g能被多个E序调用Q实C比较完美的共享,E序员无写什么程序,只要在代码里加入对相?/SPAN>DLL的调用声明就能用它的全部功能。最重要的是Q?/SPAN>DLLl对不会(x)让你多拿一个花Ӟ你要什么它?yu)q你什么,你不要的东西它才不会(x)l你。这P写出来的E序׃能再携带一大堆垃圾?/SPAN>—?/SPAN>l对不会(x)让你把吃剩的东西带回Ӟ否则|款Q这是自助餐?/SPAN>

DLL
技术的诞生Qɾ~写E序变成一件简单的事情Q?/SPAN>Windows为我们提供了几千个函数接口,以满大多数程序员的需要。而且Q?/SPAN>Windowspȝ自n是由几千个DLL文gl成Q这?/SPAN>DLL怺扶持Q组成了强大?/SPAN>Windowspȝ。如?/SPAN>Windows使用静态链接技术,它的体积?x)有多大Q我不敢惟?/SPAN>

二、应用程序接?/SPAN>API

上面我们?/SPAN>DLL技术做了个大概分析Q在里面我提C?/SPAN>接口?/SPAN>Q这又是什么呢Q因?/SPAN>DLL不能像静态库文g那样塞进E序里,所以,如何让程序知道实现功能的代码和文件成了问题,微Y׃ؓ(f)DLL技术做了标准规范,让一?/SPAN>DLL文g像奶酪一样开了许多小z,每个z口都注明里面存攄功能的名字,E序只要Ҏ(gu)标准规范扑ֈ相关z口可以取得它要的味了,q个z口是?/SPAN>应用E序接口?/SPAN>Q?/SPAN>Application Programming InterfaceQ,每个DLL带的接口都不相同Q尽最大可能的减少了代码的重复。用Steven的一句话Q?/SPAN>API是一个工L(fng)Q你Ҏ(gu)需要取丝刀、扳手,用完后再把它们放回原处。在Windows里,最基本?/SPAN>3?/SPAN>DLL文g?/SPAN>kernel32.dll?/SPAN>user32.dll?/SPAN>gdi32.dll。它们共同构成了基本的系l框架?/SPAN>



Ben 2006-02-17 11:25 发表评论
]]>Google的技?特辑)http://m.tkk7.com/Ben/archive/2006/02/15/30816.htmlBenBenWed, 15 Feb 2006 07:22:00 GMThttp://m.tkk7.com/Ben/archive/2006/02/15/30816.htmlhttp://m.tkk7.com/Ben/comments/30816.htmlhttp://m.tkk7.com/Ben/archive/2006/02/15/30816.html#Feedback0http://m.tkk7.com/Ben/comments/commentRss/30816.htmlhttp://m.tkk7.com/Ben/services/trackbacks/30816.html1Q网l摄像头

在Google中输入“inurl:"ViewerFrame?Mode="”或者“inurl:"MultiCameraFrame?Mode="”、“inurl:"view/index.shtml"?输入时不带外面的双引P在英文状态下输入)Q你?x)获得无C未经加密的网l摄像机监视到的画面。无聊的时候玩玩,可以满一下我们的好奇心。此外,打开q个站点Qwww.opentopia.com/hiddencam.phpQ在“from”中选择“China”,你还可以看到国内的某处网l摄像机画面?BR>
*******************

2Q中英文字典

  Google提供了一个中英文字典Q很方便使用。用户可以按照下列方法查找词义查找英文的中文词义则输?BR>fy computer
查找中文的英文词义则输入 译 计算?BR>
3Q条形码查询

  用户输入一个商品的条Ş码就可以扑ֈ有关该品的说明?BR>
4Q汉语拼韌入检?
  Z方便使用中文的用户在|上搜烦(ch)QGoogle允许用户直接在键盘上输入汉语拼音来检索相关事物,例如Q?
  输入 shanghaishikebiao
  (g)索结果提C:(x)(zhn)是不是要找Q 上v时刻表 
  q正是我们需要查扄关键词,用户可以据此览相关l果Q这包括上v地区的各U交通工L(fng)时刻表。如果需要查找更详细的资?上v飞机航班时刻表 "Q则只要在原来的(g)索结?上v时刻?中间输入feijihangban Q例如:(x)
  上vfeijihangban时刻?
  Google的这Ҏ(gu)功能Q可以免除用户在中文和拼韌入方面的互相转换。用户在输入拼音Ӟ不要留有I格Q否则Google?x)误认?f)英文。Google把拼音与常用的字或者词l一一对应Q因此,q于生僻的字或词l不适合于用q个Ҏ(gu)查找
 
5。 汉语拼音输入(g)?
  Z方便使用中文的用户在|上搜烦(ch)QGoogle允许用户直接在键盘上输入汉语拼音来检索相关事物,例如Q?
  输入 shanghaishikebiao
  (g)索结果提C:(x)(zhn)是不是要找Q 上v时刻表 
  q正是我们需要查扄关键词,用户可以据此览相关l果Q这包括上v地区的各U交通工L(fng)时刻表。如果需要查找更详细的资?上v飞机航班时刻表 "Q则只要在原来的(g)索结?上v时刻?中间输入feijihangban Q例如:(x)
  上vfeijihangban时刻?
  Google的这Ҏ(gu)功能Q可以免除用户在中文和拼韌入方面的互相转换。用户在输入拼音Ӟ不要留有I格Q否则Google?x)误认?f)英文。Google把拼音与常用的字或者词l一一对应Q因此,q于生僻的字或词l不适合于用q个Ҏ(gu)查找?

  6。 中英文字?
  l常使用计算机的用户手头上自然会(x)有一、两个字典YӞ用于查找和翻译中英文的词义。作ZU用频率较高的工具QGoogle也提供了一个中英文字典Q很方便使用。用户可以按照下列方法查找词义查找英文的中文词义则输入  fy  computer 查找中文的英文词义则输入  译  计算?

  7。 天气查询
  天气情况也是Zl常要查询的信息之一QGoogle 提供的天气查询来自于一个更新及(qing)时的中文气象|站Q适合中国Z用。用戯入中文和英文都可以查询,例如要了解奥q会(x)期间雅典的天气情况,可以按照下列Ҏ(gu)输入Q?
  雅典 天气  athens tq q回的查询结果中?x)在W一条出C个 "雅典天气预报"Q用L(fng)d可以看到当天雅典的天气情况。如果地名相同者,用户q需要进行一ơ选择?

  8。 股票查询
  查询股票的网站已l很多了QGoogle提供的股查询只是更方便一些而已Q用户可以按照股名U、股代码或者股名U的声母字母查询Q下列ؓ(f)查询"中国联?股票行情的D例?
  中国联通 股票 zglt gp
  gp 600050

  9。 邮政~码和区h?
  Z时常需要查询邮政编码和?sh)话区号QGoogle提供了这样一个实用的功能Q用h此能够获得所要查询的省市名称Q邮政编码及(qing)镉K电(sh)话区P下面为查询D例:(x)
  邮编 杭州       
  区号 l兴       
  yb  杭州 
  qh  l兴
  需要注意的是用户只能查询到城市U别的邮政编码和区号Q而无法进一步查询区县的具体信息?

  10。 手机归属地查?
  用户在输入手机号码后可以获得L(fng)Dc(din)归属地、卡cd、邮政编码和?sh)话区号的信息,但是从实用的角度看,其中只有手机归属地的信息较?f)有用?

  11。 计算器?
  Google有计器的功能,例如在google(g)索框中输?5*86+35/7Q就?x)得到结果?x)
  (45 * 86) + (35 / 7) = 3 875
  有兴的用户Q或者经常在计算Zq行q算的用户不妨可以试一试?

  12。 购物(g)?
  Google新开讄购物(g)索称之ؓ(f)FroogleQ网址为httpQ?/froogle。google。com/
  用户只要输入商品的名Uͼ可以看到该商品的图片和hQ用戯可以限定一U商品的hq行(g)索,q且检索结果按需要从高h(hun)Ch序列出,许多商品可以直接在网上订购,q种图文q茂的检索购物方式较受用户青睐?

  13。 国实用生活信息查询
  如果用户生活在美国或者短期去国出差和学?fn),下面的查询功能或许能对他们又帮助Q因些检索服务目前仅限于国?
  14 地区代码查询
  用户输入国的地Z码,在返回的(g)索结果中的第一就是该地区的地图,用户可以通过不断的点?yn)L扑ֈ一条具体的大街?nbsp;

   15 飞机航班查询
  用户输入一家航I公司的名称和航班号Q即可获得该航班的出发地和目的地Qv飞和到达旉Q以?qing)实际航行情况,目前是否开始检,抵达目的地候机大楼的舱门号?
  16 车牌h?
  用户输入车牌P可以获得一辆R的名U、型受出厂年份,车n和发动机情况?
  17 邮g查询
  用户输入一个邮件的L(fng)Q可以获(zhn)该邮g目前的状况,譬如邮g已经抵达或者正在\途上{?

  18。 (g)索工h
  Google的检索工h功能强大Q有拖放和右?yn)L索功能,新闻阅读Q广告拦截,|站排名昄和搜索字词标明等Q工h可以附在览器下Q用更加方ѝ用户可以首先在Google|站下蝲q安装一个检索工hQ然后根据需要在工具栏的选项中进行设|,我们推荐用户使用q个(g)索工hQ它?yu)给用户带来许多意想不到的方ѝ?

  10.1 Google 新闻
  Google 的新L源于4500家报刊杂志和通讯C,在精选以后持l播Z界各国的新闻Q每条新闻都有更新的旉Qƈ联接相关的新闅R用户可以用免费的新闻通知服务Q通过?sh)子邮g收到自己感兴的新闻?
  10.2 |站排名
  Google 通过寏VWeb 链接l构和许多其它变量自动计,对网늚重要E度q行评定。网站排名根据这个评定能够显C用h在访问的|站的重要程度,用一根绿色线条显C,直观而明?
  10.3 搜烦(ch)字词标明
  搜烦(ch)字词标明通过鲜艳的色彩标明用h(g)索的字词在每个网上的位|,便于用户查阅Q单?搜烦(ch)字词标明"按钮可以打开和关闭标明状态?
  10.4 拖放和右?yn)L?
  拖放(g)索功能ɋ(g)索更为方便,用户可以把在|页上所选取的字词直接拖攑ֈ(g)索框中,Google?x)自动进行检索。对于与 Web览器同时运行的许多文字处理应用E序中的文字Q也可以使用此功能。右?yn)L索是指用户可以在|页上选取文字后,叛_鼠标Q然后从弹出式菜单中选择"Google 搜烦(ch)"便可以自动检索?

  Google搜烦(ch)引擎为我们提供了搜烦(ch)的方便,Ҏ(gu)在不断推出新的服务功能,例如为移动电(sh)话特别设计的无线搜寻{,怿随着技术的不断发展Q我们会(x)从中享受更多的搜索乐?

 


Ben 2006-02-15 15:22 发表评论
]]>
[转]TCP/IP协议介绍http://m.tkk7.com/Ben/archive/2006/02/15/30770.htmlBenBenWed, 15 Feb 2006 03:13:00 GMThttp://m.tkk7.com/Ben/archive/2006/02/15/30770.htmlhttp://m.tkk7.com/Ben/comments/30770.htmlhttp://m.tkk7.com/Ben/archive/2006/02/15/30770.html#Feedback0http://m.tkk7.com/Ben/comments/commentRss/30770.htmlhttp://m.tkk7.com/Ben/services/trackbacks/30770.html [以太|接口(毕业设计Q]TCP/IP协议介绍
yzy1102 发表?2006-1-16 19:33:00

    TCP/IP协议Q或UCؓ(f)TCP/IP协议?/B>Q或互联|协议系列?/P>

TCP/IP协议?/B>
(?I>TCP/IP参考模?/I>划分)

应用?/TD> FTP SMTP HTTP ...
传输?/TD> TCP UDP
|络?/TD> IP ICMP ARP
链\?/TD> 以太|?/TD> 令牌?/TD> FDDI ...

    包含了一pd构成互联|基的网l协议。这些协议最早发源于国国防部的DARPA互联|项目。TCP/IP字面上代表了两个协议:TCP传输控制协议和IP互联|协议?/P>

    旉回放?983q??日,在这天,互联|的前nArpanet中,TCP/IP协议取代了旧的网l核心协议NCP(Network Core Protocol)Q从而成Z天的互联|的基石。最早的的TCP/IP由Vinton Cerf和Robert Kahn两位开发,慢慢地通过竞争战胜了其它一些网l协议的Ҏ(gu)Q比如国际标准化l织ISO的OSI模型。TCP/IP的蓬勃发展发生在上世U的90q代中期。当时一些重要而可靠的工具的出世,例如面描述语言HTML和浏览器MosaicQ导致了互联|应用的飞束发展?/P>

    随着互联|的发展Q目前流行的IPv4协议(IP Version 4QIP版本?已经接近它的功能上限。IPv4最致命的两个缺陷在?

  • 地址只有32位,IP地址I间有限;
  • 不支持服务等U?Quality of Service, Qos)的想法,无法理带宽和优先Q故而不能很好的支持C来多的实时的语音和视频应用。因此IPv6 (IP Version 6, IP版本? 出面Q用以取代IPv4?

    TCP/IP成功的另一个因素在与对为数众多的低层协议的支持。这些低层协议对应与OSI模型 中的W一?物理?和第二层(数据链\?。每层的所有协议几乎都有一半数量的支持TCP/IPQ例? 以太|?Ethernet)Qo(h)牌环(Token Ring)Q光U数据分布接?FDDI)Q端对端协议( PPP)QX.25Q中(Frame Relay)QATMQSonet, SDH{?/P>

目录
1 TCP/IP协议栈组?BR>
2 必须协议
3 推荐协议
4 可选协?BR>
5 范例: 不同计算行的不同协议
6 参考文?BR>

   

 

 

 

    TCP/IP协议栈组?/H2>

    整个通信|络的Q务,可以划分成不同的功能块,x象成所谓的 ?层?。用于互联网的协议可以比照TCP/IP参考模型进行分cRTCP/IP协议栈v始于W三层协议IP(互联|协? 。所有这些协议都在相应的RFC文档中讨论及(qing)标准化。重要的协议在相应的RFC文档中均标记了状? “必Z?(required) Q“推荐?(recommended) Q“可选?(elective) 。其它的协议q可能有?试验?experimental) 或?历史?historic) 的状态?/P>

    必须协议

    所有的TCP/IP应用都必d现IP和ICMP。对于一个\由器(router) 而言Q有q两个协议就可以q作了,虽然从应用的角度来看Q这样一个\由器 意义不大。实际的路由器一般还需要运行许多“推荐“用的协议Q以?qing)一些其它的协议?/P>

    在几乎所有连接到互联|上的计机上都存在的IPv4 协议出生?981q_(d)今天的版本和最早的版本q没有多改变。升U版IPv6 的工作始?995q_(d)目的在与取代IPv4。ICMP 协议主要用于攉有关|络的信息查N误等工作?/P>

    推荐协议

    每一个应用层(TCP/IP参考模?的最高层) 一般都?x)用到两个传输层协议之一: 面向q接的TCP传输控制协议和无q接的包传输的UDP用户数据报文协议 ?其它的一些推荐协议有:

  • TELNET (Teletype over the Network, |络?sh)? Q通过一个终?terminal)登陆到网l?q行在TCP协议??
  • FTP (File Transfer Protocol, 文g传输协议) Q由名知?q行在TCP协议? ?
  • SMTP (Simple Mail Transfer ProtocolQ简单邮件传输协? Q用来发送电(sh)子邮?q行在TCP协议? ?
  • DNS (Domain Name ServiceQ域名服? Q用于完成地址查找Q邮件{发等工作(q行在TCP和UDP协议? ?
  • ECHO (Echo Protocol, 回绕协议) Q用于查错及(qing)量应答旉(q行在TCP和UDP协议? ?
  • NTP (Network Time ProtocolQ网l时间协? Q用于网l同?q行在UDP协议? ?
  • SNMP (Simple Network Management Protocol, 单网l管理协? Q用于网l信息的攉和网l管理?
  • BOOTP (Boot ProtocolQ启动协? Q应用于无盘讑֤(q行在UDP协议??

    可选协?/H2>

    最常用的一些有

  • 支撑万维|WWW的超文本传输协议HTTPQ?
  • 动态配|IP地址的DHCP(Dynamic Host Configuration Protocol,动态主机配|协?Q?
  • 攉件用的POP3 (Post Office Protocol, version 3, 邮局协议) Q?
  • 用于加密安全登陆用的SSH (Secure ShellQ用于替代安全性差的TELNET) Q?
  • 用于动态解析以太网g地址的ARP (Address Resolution ProtocolQ地址解析协议) ?

    范例: 不同计算行的不同协议

  • 一个简单的路由器上可能?x)实现ARP, IP, ICMP, UDP, SNMP, RIP?
  • WWW用户端用ARP, IP, ICMP, UDP, TCP, DNS, HTTP, FTP?
  • 一台用L(fng)(sh)脑上q会(x)q行如TELNET, SMTP, POP3, SNMP, ECHO, DHCP, SSH, NTP?
  • 无盘讑֤可能?x)在Zg比如ROM中实CARP, IP, ICMP, UDP, BOOT, TFTP (均ؓ(f)面向数据报的协议Q实现v来相对简??/LI>

TCP/IP基础讲-1Q?层,2层,3层?

    读过关于|络的课E的Q都知道ISO-OSI 7层协议这个名词,许多书籍都会(x)具体的画出那q图Q然后标注上物理层,数据链\层,|络层等{?背的大家要死.但是却又不知道具体这些层ơ干吗用的勒Q?

    其实在互联网中,׃实际使用的是TCP/IP模型Q也是DOD模型(现在不知道没关系Q后面会(x)?.所?层模型在现实|络环境中只是一个理ZQ学I派的东?q个模型中,我们真正兛_的是下面??

1.物理?.?是的.q个名词q算Ҏ(gu)了解.|卡q有那些|线构成了这一?那些在网U中传播的二q制数据是q层的具体表?也就是说Q这一层上面没有什么协?不是很精的说法Q但是你可以q么理解).有的都是甉|而已.我们把两台机器用|线qv?或者用HUB把机器都qv来,q些工作是物理层的工作.

    ?个设备属于物理层的,一个是中器,一个是HUB.大家知道.物理上面的连U距M长就?x)生?sh)信号的衰?Z重新加强q个信号Q我们就需要在一定距M后加上一个信h大器Q这是中?repeater)

    ?..q个比较Ҏ(gu)理解.repeater是q接?根网U之间的?没有做Q何处?所以只是一个物理设?属于1层的.

    那么集线?HUB) 呢?q个怎么?x)是?层?Q?g非常难以理解.

    当我说出HUB的本质,大家p够清楚了解了

    HUB的本质其实只是一个多口中l器(MULTI PORT REPEATER) .?..q样大家能够理解?HUB不叫多口中器其实只是ؓ(f)了销售上面的{略.他的本质是q接多根|线的一个物理设?也是不对l过的电(sh)信号做Q何逻辑处理?

2.数据链\?/STRONG>

    Ƨ~q个名词有些别扭?DATA LINK?英文g更加Ҏ(gu)理解.

    q个层面上面的东西不再是?sh)信号?而是DATA?对,既然是DATA有了逻辑关系?q个层面上面的基本单位是?Frame) .q层和物理层的接触是最紧密?他是把从|线上面传输的电(sh){换成0?的组?

    物理层只是网卡对|线发出或者接受各U电(sh)q信P那就是说物理层是无法判别甉|的来源和目标?那么把电(sh)打??的之后.里面有逻辑数据?有了数据Q就可以判别数据从何而来Q到何处?所以也可以真正的形成LINK.

    既然可以判别地址Q那么地址是按照什么来判别的呢Q?

    那就是最重要的概念之一:MAC地址

    大家肯定都听说过我们的网卡都有MAC地址

    有些人可能也知道MAC地址都是唯一?

    ?MAC地址是全球唯一?也就是说你的|卡虽然便宜.但是他也是世界上独一无二?

    有些他可以改MAC.那就不是唯一??虽然可以更改Q那只是ƺ骗上层对封包里面的MAC地址q行改写.你网卡真正的MAC地址是固化的.无法修改?

    我们有了MAC地址?q样可以有针对性对所有连接在一L(fng)计算行通讯?是的.我们l于可以在一个局域网内通讯?

    但是有个问题我们前面没有提到.是既然物理层传输的是电(sh)信号.那么如果我有2台机器一起发?sh)信P信号岂不是؜׃么?

    非常正确.q个问题在网l里面成?撞"Q所以协议里面规定了如果你需要往外发数据Q一定需要先看看늼里面有没有别的信?如果没有Q那可以发.如果2者同时发送,(g)到撞之后2者分别等待一个随机时_(d)然后重发.q个是重要?撞(g)?".

    ?看来问题解决?不是?现在整个|络可以正常q行?

    实如此.但是如果q接在网l上的计机来多Q那么碰撞的现象?x)越来越频?q样效率一定很低了.?q里q有一个重要概?冲突?".在同一个物理上q接的网l上的所有设备是属于同一个冲H域?

    接着需要引入我们的2层设备来分割冲突域了.

    |桥(Bridge) 是q接2个不同的物理|络?主要功能是在2个网l之间{发Frame.因ؓ(f)从实际中我们可以知道.其实很多时候ƈ非整个网l都在相互通讯.最多相互通讯的一l计机我们可以分在一个小的冲H域?q样分割以后可以减少冲突域,也就相对的减了冲突的机?而之间用网桥来桥接Q由于网桥两边的通讯不是非常频繁Q所以用网桥来?边作?代言?.q样L一个小|络里面产生冲突的机?x)就?

    交换?Switch)是我们最熟?zhn)的设备了Q交换机的本质其实就是一个多口网?Multi port Bridge) .同理可得.交换机的每个口后面都是一个冲H域.我们都说交换机比HUB快,是因ؓ(f)交换机分割了所有的冲突?

    ׃现在交换机非怾?所以一般我们都是直接在交换机的口上接计机.q样每台计算机都是一个独立的冲突?q样撞的问题就没有?所以速度是比HUB?

    而前面说q?2层设备主要是个{发的功能.交换机的主要功能是转发?而不是让所有的冲突域直接物理连?所以交换机有CPUQ有内存Q可以对frameq行处理{等.q些也是交换机和HUB的区?


3.|络?

    我们前面的一些技术就可以构徏出局域网?有了|络层以?数据才能够真正的在整个世界间传?

    ׃伦纳?博萨?Leonard Bosack)和姗?L(fng)(Sandy Lerner)Z解决他们之间的通信问题(关于路由器发明的版本有很?你听到的别的说法可能比这个说法更准确Q但是谁知道?呵呵).路由器被发明用来解决"信息孤岛"问题.而且如果是由SWITCH来构建整个网l,那么整个|络会(x)?中心节点"Q这样也不符合ARPANET的初?所以我们有了这一?(q样说可能会(x)感觉本末倒置Q但是先q么理解?)

    q一层的基本单元是包(Packet) .所有的包都有一个IP??听v来很熟?zhn)不是?IP是用来在这层上面标识包的来源和目的地址?

    q层的一个主要概念就?路由 "Q也是和switch一P把包转发到其他的地方.不过有个不同的地方,switch只有知道具体的MAC在哪里的情况下才能够发送给指定的计机Q而\由则不需要知道最lIP所在的计算机在哪个位置Q只要知道那个途径可以q去可以工?

    q?层构Z整个|络的基.׃TCP/IP模型最下面2层合q成Z层,所以在TCP/IP里面dq?层也是整个构架最基础的内?而网l方面要做的工作也都是针对于q?层做?


2: TCP/IP.真实世界的模?/STRONG>

    上一讲里面我们说qOSI 7层模型只是一个理论模?而实际中只需要保?层的功能能够实现,实际分层无需按照7层来?而且如果真的??那么数据处理的速度便要慢许?

    在实际应用中.使用最多的便是DoD模型.也成为TCP/IP协议?

    DoD模型(Department Of Defanse Model 国国防部模? ֐思义,是美国国防部设计的一个网l模?最早用于ARPANET.q些话可能在许多教材的第一章就?x)讲?但是一般教材对于DoD模型与OSI模型对应关系都没有讲?或者很多是模糊或者错误的.

    在这里我p描述一?者对应关p?OSI模型?层我们已l知道了,而DoD模型则只??下面是对应关p?

    OSI                                  DoD

    7.Application     ?nbsp;    

    6.Presentation   |->       4. Application/Process

    5.Session         ?nbsp;    

    4.Transport       --->       3. Host to Host

    3.Network        --->       2. Internet

    2.Data Link      ?>       1. Network Access

    1.Physical        ?


    ׃我不?x)制表?所以图有些隄.其实是OSI?.2层对应DoD的第1?

OSI?.6.7对应DoD的第4?

    其实q个q是比较Ҏ(gu)记忆?

    ׃物理层和数据链\层非常密?所以分Z?然后上面依次对应,最上面的一大块成ؓ(f)应用?处理?

现在我们有了一个可用的实际模型?不过一般我们在描述某个讑֤或者协议的时?q是?x)用OSI的模?比如我们在讨论SWITCH的时?׃(x)说他是一?层的讑֤.而\由器是一?层的讑֤,q会(x)有一些特D的讑֤,比如3层交换机,4层交换机.q些都是使用OSI模型q行分类?q点大家不要搞؜淆了.


    我们一直听说TCP或者UDP.q有什么SMTP.POP3.q些协议到底是在哪一层定义的?接下来的一张图?x)给大家一个非常清晰的概念?不能是图拉 :D ).


    4. APPLICATION

    HTTP,FTP,telnet,SNMP,SMTP,POP3,DNS {等


    3.Host to Host

    TCP,UDP


    2.internet

    ICMP,ARP,RARP,IP


    1.Network Access

    Ethernet,FastEthernet,Token Ring {等

    ?..q下清楚?让我们从下至上来看看

    首先是最下层?包括了以太网,快速以太网,q有现在的千M以太|等{的协议,q些协议规定了线~的l数.q接方式{等物理层的东西.q有底层使用MAC通讯的方式等{?


    接下来是IP.ARPq些.IP在OSI模型的时候也说过.通过IP地址.我们在{发包的时候无需知道具体目标机的位置.而\由器自然?x)根据\p来{?最后一站一站的慢慢传?辑ֈ最l目?而ARP协议是在IP和MAC之间转换用的.

 我在上一章提q?׃有了路由?IP,整个|络才真正能够覆盖全?所以这一层叫做internet大家也应该容易记忆了.


    WOW.TCP,UDP是我们听说最多的?他是属于控制|络q接?在OSIUCؓ(f)Transport.传输?在DoD内是Host to Host 端对?意思其实是一L(fng).是在在2台计机之间构徏Z个虚拟的通讯通道?


    最上面一层就无穷无尽?所有的最l应用层的东襉K在这?你甚臛_以定义你自己的协议类?q些都是完全可以?因ؓ(f)本nq一层就是提供给开发h员自行发挥的.只是上面列D的都l过标准化了.


    TCP包头l构

    源端?16?

    目标端口  16?

    序列?nbsp; 32?

    回应序号  32?

    TCP头长?nbsp; 4?

    reserved 6?

    控制代码 6?

    H口大小 16?

    偏移?16?

    校验?16?

    选项   32?可?

    q样我们得出了TCP包头的最大?是20字节.


    UDP包头l构

    源端?16?

    目的端口 16?

    长度  16?

    校验?nbsp; 16?

    ?..UDP的包很?实如此.因ؓ(f)UDP是非可靠q接.设计初衷是可能快的将数据包发送出?所以UDP协议昑־非常_.

    有一个问?gq些头里面怎么没有IP地址?没有IP地址q些包往哪里发送那?

    ?你观察的很仔l?TCP和UDP的头里面实没有MIP信息.我们回头想一下TCP和UDP是属于DoD的哪一层的? 对了!是第3? 而IP则位于模型的W二?也就是他们两者虽然有联系.但是不属于同一?

    模型的一个重要规则就?当发送端发送一个数?上一层将数据传往下一层的时?上一层的包就成ؓ(f)了下一层包的数据部?

    而到接受端接受到数据.下一层将本层的头部信息去掉后交给上一层去处理.

那么我们来看看实际例?/STRONG>:

    假我们通过SMTP协议发送数据AAA到另外一D?那么数据先会(x)被加上SMTP的头.成ؓ(f)[SMTP]AAA.往下发送到TCP?成ؓ(f)[TCP][SMTP]AAA.再往下送到internet层[IP][TCP][SMTP]AAA.然后成ؓ(f)[MAC][IP][TCP][SMTP]AAA

    q样通过enternet或者FastEnternet发送到路由?路由器得到后替换自己的MAC地址上去.传到下一U的路由?q样l过镉K跋?最l这个数据流到达目标?


    目标机先从下面一层开?LMAC,成ؓ(f)[IP][TCP][SMTP]AAA往上到IP??比对后是发送给我这个IP?L,成ؓ(f)[TCP][SMTP]AAA.TCP接到了查看校验和,没错.往上[SMTP]AAA.最后SMTP协议去解?得到了AAA.


    万里长征l于l束.我们也将AAA发送到了目标机.大家也应该明白了ZTCP包头和UDP包头里面没有IP地址?因ؓ(f)IP位于他们下面一?TCP和UDP的包头信息是作ؓ(f)IP包的数据D|传送的.


    IP层可不管那许?他只他那层的协?也就是管把从上面层来的数据加上自q?传到下面一?把从下面一层来的数据去掉头.传到上面一?


    每层都是q么q的.完美的契合完成了数据包的最l旅E?

TCP/IP的通讯协议

  q部分简要介l一下TCP/IP的内部结构。TCP/IP协议l之所以流行,部分原因是因为它可以用在各种各样的信道和底层协议Q例如T1和X.25、以太网以及(qing)RS-232串行接口Q之上。确切地_(d)TCP/IP协议是一l包括TCP协议和IP协议QUDPQUser Datagram ProtocolQ协议、ICMPQInternet Control Message ProtocolQ协议和其他一些协议的协议l?

TCP/IP整体构架概述

  TCP/IP协议q不完全W合OSI的七层参考模型。传l的开攑ּpȝ互连参考模型,是一U通信协议?层抽象的参考模?其中每一层执行某一特定d。该模型的目的是使各U硬件在相同的层ơ上怺通信。这7层是:物理层、数据链路层、网路层、传输层、话路层、表C层和应用层。而TCP/IP通讯协议采用?层的层l构Q每一层都呼叫它的下一层所提供的网l来完成自己的需求。这4层分别ؓ(f)Q?

  应用层:(x)应用E序间沟通的层,如简单电(sh)子邮件传输(SMTPQ、文件传输协议(F(tun)TPQ、网l远E访问协议(TelnetQ等?

  传输层:(x)在此层中Q它提供了节炚w的数据传送服务,如传输控制协议(TCPQ、用h据报协议QUDPQ等QTCP和UDPl数据包加入传输数据q把它传输到下一层中Q这一层负责传送数据,q且定数据已被送达q接收?

  互连|络层:(x)负责提供基本的数据封包传送功能,让每一块数据包都能够到辄的主机(但不(g)查是否被正确接收Q,如网际协议(IPQ?

  |络接口层:(x)对实际的|络媒体的管理,定义如何使用实际|络Q如Ethernet、Serial Line{)来传送数据?/P>

TCP/IP中的协议

  以下单介lTCP/IP中的协议都具备什么样的功能,都是如何工作的:(x)

  1Q?IP

  |际协议IP是TCP/IP的心脏,也是|络层中最重要的协议?

  IP层接收由更低层(|络接口层例如以太网讑֤驱动E序Q发来的数据包,q把该数据包发送到更高?--TCP或UDP层;相反QIP层也把从TCP或UDP层接收来的数据包传送到更低层。IP数据包是不可靠的Q因为IPq没有做M事情来确认数据包是按序发送的或者没有被破坏。IP数据包中含有发送它的主机的地址Q源地址Q和接收它的L的地址Q目的地址Q?

  高层的TCP和UDP服务在接收数据包Ӟ通常假设包中的源地址是有效的。也可以q样_(d)IP地址形成了许多服务的认证基础Q这些服务相信数据包是从一个有效的L发送来的。IP认包含一个选项Q叫作IP source routingQ可以用来指定一条源地址和目的地址之间的直接\径。对于一些TCP和UDP的服务来_(d)使用了该选项的IP包好象是从\径上的最后一个系l传递过来的Q而不是来自于它的真实地点。这个选项是ؓ(f)了测试而存在的Q说明了它可以被用来ƺ骗pȝ来进行^常是被禁止的q接。那么,许多依靠IP源地址做确认的服务生问题ƈ且会(x)被非法入c(din)?

  2. TCP

  如果IP数据包中有已l封好的TCP数据包,那么IP把它们向‘上’传送到TCP层。TCP包排序q进行错误检查,同时实现虚电(sh)路间的连接。TCP数据包中包括序号和确认,所以未按照序收到的包可以被排序,而损坏的包可以被重传?

  TCP它的信息送到更高层的应用E序Q例如Telnet的服务程序和客户E序。应用程序轮将信息送回TCP层,TCP层便它们向下传送到IP层,讑֤驱动E序和物理介质,最后到接收斏V?

  面向q接的服务(例如Telnet、FTP、rlogin、X Windows和SMTPQ需要高度的可靠性,所以它们用了TCP。DNS在某些情况下使用TCPQ发送和接收域名数据库)Q但使用UDP传送有兛_个主机的信息?

  3.UDP

  UDP与TCP位于同一层,但对于数据包的顺序错误或重发。因此,UDP不被应用于那些用虚?sh)\的面向连接的服务QUDP主要用于那些面向查询---应答的服务,例如NFS。相对于FTP或TelnetQ这些服务需要交换的信息量较?yu)。用UDP的服务包括NTPQ网落时间协议)和DNSQDNS也用TCPQ?

  ƺ骗UDP包比ƺ骗TCP包更Ҏ(gu)Q因为UDP没有建立初始化连接(也可以称为握手)Q因为在两个pȝ间没有虚?sh)\Q,也就是说Q与UDP相关的服务面临着更大的危险?

  4.ICMP

  ICMP与IP位于同一层,它被用来传送IP的的控制信息。它主要是用来提供有关通向目的地址的\径信息。ICMP的‘Redirect’信息通知L通向其他pȝ的更准确的\径,而‘Unreachable’信息则指出路径有问题。另外,如果路径不可用了QICMP可以使TCPq接‘体面地’终止。PING是最常用的基于ICMP的服务?

  5. TCP和UDP的端口结?

  TCP和UDP服务通常有一个客?服务器的关系Q例如,一个Telnet服务q程开始在pȝ上处于空闲状态,{待着q接。用户用Telnet客户E序与服务进E徏立一个连接。客L(fng)序向服务q程写入信息Q服务进E读Z息ƈ发出响应Q客L(fng)序读出响应ƈ向用h告。因而,q个q接是双工的Q可以用来进行读写?

  两个pȝ间的多重Telnetq接是如何相互确认ƈ协调一致呢QTCP或UDPq接唯一C用每个信息中的如下四进行确认:(x)

  源IP地址  发送包的IP地址?

  目的IP地址 接收包的IP地址?

  源端口   源系l上的连接的端口?

  目的端口  目的pȝ上的q接的端口?

  端口是一个Y件结构,被客L(fng)序或服务q程用来发送和接收信息。一个端口对应一?6比特的数。服务进E通常使用一个固定的端口Q例如,SMTP使用25、Xwindows使用6000。这些端口号是‘广Zh知’的Q因为在建立与特定的L或服务的q接Ӟ需要这些地址和目的地址q行通讯?/P>




Ben 2006-02-15 11:13 发表评论
]]>
վ֩ģ壺 һ| һƵǿŮ| 337Pձŷ޴󵨾Ʒ| ҳվ߹ۿ| һƵ| ۺۺͼ| պƷ侫| þAV鶹| ޾߹ۿ| ޾ƷľþĻ| AV뾫Ʒҹ.| þþƷAVɫ| þþƷAV| ձһ| ƵѲ| ĻƵ| ˾ƷƵҳȫ| 97ԭѹۿ| vaƷѹۿ| ŷaѹۿ| AV| ѿaɫƬ| þù޾ƷӰԺ | һAVѲ| ҹҹˬ| ޸һӰ| һѵӰ| 99ƵƷȫѹۿ| aëƬȫ| һëƬѿ| Ƶһ| 12345Ƶ| þþþ?V| ձþþþĻ| ɫɫBwwW| ŮˬˬˬƵ| 999þþѾƷ| ģ߹ۿ| ҹӰѹۿ| ëƬƵ| һɫƵ|