|
|
用户名:smallmousel 笔名:smallmousel 地区: 北京-北京 行业:其他 |
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
等待木木的日子.......
SQLSERVER主外键的关联
http://hi.baidu.com/lyt1724/blog/item/c1488b02a304e20a4afb510d.html
在编写数据库相关程序时,对主外键的注意.
原先总认为主外键麻烦,没有去领会.
现在突然认识到库中键的重要性.
想在网上找一些有关文档说明,.可不多,(暂时没有想要的)
那就先看看SQL的技术帮助里的吧:
FOREIGN KEY 约束
publishers 表的 title_id 列中放置一个外键约束,以保证这一列中的输入值与 titles 表 title_id 列中的现有值匹配。
在数据库关系图中,当创建从一个附加了主键约束或唯一约束的表到另一个表之间的关系时,外键约束将自动添加到指定的列上
外键 (FK) 是用于建立和加强两个表数据之间的链接的一列或多列。通过将保存表中主键值的一列或多列添加到另一个表中,可创建两个表之间的链接。这个列就成为第二个表的外键。
当创建或更改表时可通过定义 FOREIGN KEY 约束来创建外键。
例如,数据库 pubs 中的 titles 表与 publishers 表有链接,因为在书名和出版商之间存在逻辑联系。titles 表中的 pub_id 列与 publishers 表中的主键列相对应。titles 表中的 pub_id 列是到 publishers 表的外键。

FOREIGN KEY 约束并不仅仅只可以与另一表的 PRIMARY KEY 约束相链接,它还可以定义为引用另一表的 UNIQUE 约束。FOREIGN KEY 约束不允许空值,但是,如果任何组合 FOREIGN KEY 约束的列包含空值,则将跳过 FOREIGN KEY 约束的校验。
说明 FOREIGN KEY 约束可引用同一数据库中的表或同一表(自引用表)内的列,例如,一个包含下面三列的雇员表:employee_number、employee_name 和 manager_ employee_number。由于经理本身也是雇员,所以从 manager_employee_number 列到 employee_number 列存在外键关系。
尽管 FOREIGN KEY 约束的主要目的是控制存储在外键表中的数据,但它还可以控制对主键表中数据的修改。例如,如果在 publishers 表中删除一个出版商,而这个出版商的 ID 在 titles 表中记录书的信息时使用了,则这两个表之间关联的完整性将被破坏,titles 表中该出版商的书籍因为与 publishers 表 中的数据没有链接而变得孤立了。FOREIGN KEY 约束防止这种情况的发生。如果主键表中数据的更改使之与外键表中数据的链接失效,则这种更改是不能实现的,从而确保了引用完整性。如果试图删除主键表中的 行或更改主键值,而该主键值与另一个表的 FOREIGN KEY 约束值相关,则该操作不可实现。若要成功更改或删除 FOREIGN KEY 约束的行,可以先在外键表中删除外键数据或更改外键数据,然后将外键链接到不同的主键数据上去。
FOREIGN KEY 约束是索引的候选约束,其原因有以下两点:
以下是网上的一个小例子,
-- 创建表author :
CREATE TABLE [dbo].[author] (
[ID] [bigint] NOT NULL ,
[AuthorName] [char] (10) NULL ,
[address] [char] (480) NULL ,
[introduction] [ntext] NULL
)
-- 创建表myBBS:
REATE TABLE [dbo].[myBBS] (
[ID] [bigint] IDENTITY (1, 1) NOT NULL ,
[authorId] [bigint] NOT NULL ,
[Title] [char] (40) NULL ,
[Date_of_Created] [datetime] NULL ,
[Abstract] [char] (480) NULL ,
[Content] [ntext] NULL
)
设置表myBBS中的authorId为外键,参照author表的Id字段,直接使用transact sql语句,过程如下:
--增加表mybbs(authorId)的外键约束FK_mybbs_author,表myBBS中的authorId受表author中的主键ID约束:
BEGIN TRANSACTION
alter table dbo.mybbs add constraint FK_mybbs_author
foreign key (authorId)
references dbo.author([id]) ON UPDATE CASCADE ON DELETE CASCADE
--删除外键约束FK_mybbs_author:
--alter table dbo.mybbs drop constraint FK_mybbs_author
--rollback
commit transaction
上 面ON UPDATE CASCADE,ON DELETE CASCADE两个选项,指明以后author表的id字段有delete,update操作时,myBBS表中的id也会被级联删除或更新。如果没有选 中,是不可以对author表中已被myBBS表关联的id进行update或者delete操作的。
- 作者: smallmousel 2009年04月10日, 星期五 14:30 回复(0) | 引用(0) 加入博采
SQL--循环语句总结
使用游标方法:
declare @userid int
declare a1_cursor Cursor for
select usn from tbl_user where userid in(1,2,3,4,5,6,7) --查询条件语句
open a1_cursor
fetch next from a1_cursor into @userid
while @@fetch_status=0
begin
select @userid --在此可以调用存储过程来执行操作等
&nbp; fetch next from a1_cursor into @userid
end
close a1_Cursor
deallocate a1_Cursor
- 作者: smallmousel 2009年04月3日, 星期五 09:58 回复(0) | 引用(0) 加入博采
更改 Sql Server 2005 默认端口方法
http://www.yongfa365.com/Item/Sql-Server-2005-Change-Port.html
使用php等程序访问的时候:*.*.*.*:1500;
使用查询分析器或企业管理器连接:*.*.*.*,1500
- 作者: smallmousel 2009年04月1日, 星期三 15:00 回复(0) | 引用(0) 加入博采
windows xp远程桌面没有反应
今天发现windows xp远程桌面连接没有反应,看了3389端口都打开了。
- 作者: smallmousel 2009年03月26日, 星期四 12:27 回复(0) | 引用(0) 加入博采
QTP 10 破解
破解方法和前版本相同:
破解工具:mgn-mqt82 点击下载
1.下载、安装。
2.在C:\Program Files\Common Files\Mercury Interactive下创建文件夹:License Manager
3.将破解工具mgn-mqt82.exe复制到C:\Program Files\HP\QuickTest Professional\bin下。
4.运行mgn-mqt82.exe,ok,关闭。
5.用记事本打开License Manager下的lservrc文件,将第一行 # 前的代码Copy。
6.将代码paste到license向导中的license输入的地方,就可以了
http://bbs.51testing.com/viewthread.php?tid=140556&highlight=qtp%2B10%2Blicense
我在使用远程安装License的时候出现:
安装许可证密钥失败。
Error[19]:Failed to add license code "UNKNOWN" to the license server on host "no-net".
使用本地计算机登陆即可。
http://www.sqaforums.com/showflat.php?Cat=0&Number=497753&page=0&fpart=1&vc=1I had the same problem.
It is because you are trying to install a Seat License while being connected using Remote Desktop (Terminal Client). You need to be behind the actual screen (or console), otherwise it only will let you install a concurrent license.
(Actually when you start QTP it explains exactly this, but I didn't notice the first, like, 300 times I tried).
- 作者: smallmousel 2009年03月18日, 星期三 15:45 回复(0) | 引用(0) 加入博采
中文UNICODE范围
4e00~9fbb
有的说4e00~9fa5
- 作者: smallmousel 2009年03月11日, 星期三 17:58 回复(0) | 引用(0) 加入博采
Windows常见性能计数器(较好的说明)
http://blog.csdn.net/oobibigo/archive/2008/11/20/3341591.aspx
性能计数器(counter)是描述服务器或操作系统性能的一些数据指标。计数器在性能测试中发挥着“监控和分析”的关键作用,尤其是在分析系统的可扩展性、进行性能瓶颈的定位时,对计数器的取值的分析非常关键。但必须说明的是,单一的性能计数器只能体现系统性能的某一个方面,对性能测试结果的分析必须基于多个不同的计数器。
与性能计数器相关的另一个术语是“资源利用率”。该术语指的是系统各种资源的使用状况。为了方便比较,一般用“资源的实际使用/总的资源可用量”形成资源利用率的数据,用以进行各种资源使用的比较。
性能测试之内存篇(windows)
要监视内存不足的状况,请从以下的对象计数器开始:
·
·
Available Bytes剩余的可用物理内存,单位是兆字节(参考值:>=10%)。表明进程当前可使用的内存字节数。Pages/sec 表明由于硬件页面错误而从磁盘取出的页面数,或由于页面错误而写入磁盘以释放工作集空间的页面数。
如果 Available Bytes 的值很小(4 MB 或更小),则说明计算机上总的内存可能不足,或某程序没有释放内存。如果 Pages/sec 的值为 20 或更大,那么您应该进一步研究页交换活动。Pages/sec 的值很大不一定表明内存有问题,而可能是运行使用内存映射文件的程序所致。
操作系统经常会利用磁盘交换的方式提高系统可用的内存量或是提高内存的使用效率。下列四个
指标直接反映了操作系统进行磁盘交换的频度。
Page Faults/sec
当处理器在内存中读取某一页出现错误时,就会产生缺页中断,也就是 page Fault。如果这个页
位于内存的其他位置,这种错误称为软错误,用Transition Fault/sec 来衡量;如果这个页位于硬盘上,必须从硬盘重新读取,这个错误成为硬错误。硬错误会使系统的运行效率很快将下来。Page Faults/sec这个计数器就表示每秒钟处理的错误页数,包括硬错误和软错误。
必须同时监视 Available Bytes、Pages/sec 和 Paging File % Usage,以便确定是否发生这种情况。如果正在读取非缓存内存映射文件,还应该查看缓存活动是否正常。
Cathe Bytes
文件系统的缓存(默认为50%的可用物理内存)
内存泄露
·
·
如果您怀疑有内存泄露,请监视 Memory\Available Bytes 和 Memory\ Committed Bytes,以观察内存行为,并监视你认为可能在泄露内存的进程的 Process\ Private Bytes、Process\ Working Set 和Process\ Handle Count。如果您怀疑是内核模式进程导致了泄露,则还应该监视 Memory\ Pool Nonpaged Bytes、Memory\ Pool Nonpaged Allocs 和 Process(process_name)\ Pool Nonpaged Bytes。
private Bytes
进程无法与其他进程共享的字节数量。该计数器的值较大时,有可能是内存泄露的信号
检查过于频繁的页交换
由于过多的页交换要使用大量的硬盘空间,因此有可能将导致将页交换内存不足,这容易与导致页交换的磁盘瓶颈混淆。因此,在研究内存不足不太明显的页交换的原因时,您必须跟踪如下的磁盘使用情况计数器和内存计数器:
·
·
例如,包括 Page Reads/sec 和 % Disk Time 及 Avg.Disk Queue Length。如果页面读取操作速率很低,同时 % Disk Time 和 Avg.Disk Queue Length的值很高,则可能有磁盘瓶径。但是,如果队列长度增加的同时页面读取速率并未降低,则内存不足。
要确定过多的页交换对磁盘活动的影响,请将 Physical Disk\ Avg.Disk sec/Transfer 和 Memory\ Pages/sec 计数器的值增大数倍。如果这些计数器的计数结果超过了 0.1,那么页交换将花费百分之十以上的磁盘访问时间。如果长时间发生这种情况,那么您可能需要更多的内存。
研究程序的活动
接下来,检查正在运行的程序导致的过多的页交换。如果可能,请停止具有最高工作集值的程序,然后查看页交换速率是否有显著变化。如果您怀疑存在过多的页交换,请检查 Memory\ Pages/sec 计数器。该计数器显示由于页面不在物理内存中而需要从磁盘读取的页面数。(注意该计数器与 Page Faults/sec 的区别,后者只表明数据不能在内存的指定工作集中立即使用。)
性能测试之处理器篇(windows)
监视“处理器”和“系统”对象计数器可以提供关于处理器使用的有价值的信息,帮助您决定是否存在瓶颈。需要包含下列内容:
该计数值用于体现服务器整体的处理器利用率,对多处理器的系统而言,该计数值体现的是所有CPU的平均利用率。如果该值的数值持续超过90%,则说明整个系统面临着处理器方面的瓶颈,需要通过增加处理器来提高性能。
要注意的是,由于操作系统本身的特性,在某些多CPU系统中,该数据本身并不大,但此时CPU之间的负载状况极不均衡,此时也应该视作系统产生了处理器方面的瓶颈。
Processor\ % User Time是指系统的非核心操作消耗的CPU时间,如果该值较大,可以考虑是否通过优化算法等方法降低这个值。如果该服务器是数据库服务器,Processor\ % User Time大的原因很可能是数据库的排序或是函数操作消耗了过多的CPU时间,此时可以考虑对数据库系统进行优化。
%Total Processor Time
系统中所有处理器都处于繁忙状态的时间百分比,对于多处理器系统来说,该值可以反映所有处理器的平均繁忙状态,该值为100%,如果有一半的处理器为繁忙状态,该值为50%
File Data Operations/sec
计算机对文件系统进行读取和写入操作的频率,但是不包括文件控制操作
Process Queue Length
线程在等待分配CPU资源所排队列的长度,此长度不包括正在占有CPU资源的线程。如果该队列的长度大于处理器个数+1,就表示处理器有可能处于阻塞状态(参考值:<=处理器个数+1)
%Processor Time
CPU利用率,该计数器最为常用,可以查看处理器是否处于饱和状态,如果该值持续超过 95%,就表示当前系统的瓶颈为CPU,可以考虑增加一个处理器或更换一个性能更好的处理器。(参考值:<80%)
%Priviliaged Time
CPU在特权模式下处理线程所花的时间百分比。一般的系统服务,进城管理,内存管理等一些由操作系统自行启动的进程属于这类
%User Time
与%Privileged Time计数器正好相反,指的是在用户状态模式下(即非特权模式)的操作所花的时间百分比。如果该值较大,可以考虑是否通过算法优化等方法降低这个值。如果该服务器是数据库服务器,导致此值较大的原因很可能是数据库的排序或是函数操作消耗了过多的CPU时间,此时可以考虑对数据库系统进行优化。
%DPC Time
处理器在网络处理上消耗的时间,该值越低越好。在多处理器系统中,如果这个值大于50%并且%Processor Time非常高,加入一个网卡可能会提高性能。
观察处理器使用情况的值
要测量处理器的活动,请查看 Processor\ % Processor Time 计数器。该计数器显示处理器忙于执行非空闲线程所耗时间的百分比。
检查处理器使用时,请考虑计算机的角色和所完成工作的类型。根据计算机进行的工作,较高的处理器值意味着系统正有效地处理较重的工作负载或正在努力维持。例如,如果正在监视用户的计算机,并且该计算机用于计算,计算程序可能容易使用 100% 的处理器时间。即使这会造成该计算机中其他应用程序的性能受到影响,但可以通过改变负载来解决。
另一方面,在处理许多客户请求的服务器计算机中,100% 左右的值表示这些过程在队列中,正在等待处理器时间,并且造成瓶颈。如此持续高层次的处理器使用对服务器而言是无法接受的。
考察处理器瓶颈
进程的线程所需要的处理器周期超出可用周期时,处理器瓶颈将逐步显示出来。可以建立较长的处理器队列,并且系统响应会受到影响。处理器瓶颈两种常见的原因是 CPU 限制程序和产生过多中断的驱动程序或子系统组件。
要决定是否由于对处理器时间的要求较高而存在处理器瓶颈,请查看 System\ Processor Queue Length 计数器。队列中包含两个或更多的项目则表明存在瓶颈。如果多个程序进程竞争大多数处理器时间,安装更快速的处理器会提高吞吐量。如果正在运行多线程的进程,附加处理器会有所帮助,但是请注意,附加处理器可能只有有限的益处。
此外,跟踪计算机的服务器工作队列当前长度的 Server Work Queues\ Queue Length 计数器会显示出处理器瓶颈。队列长度持续大于 4 则表示可能出现处理器拥塞。此计数器是特定时间的值,而不是一段时间的平均值。
要决定中断活动是否造成瓶颈,请观察 Processor\ Interrupts/sec 计数器的值,该计数器测量来自输入/输出 (I/O) 设备的服务请求的速度。如果此计数器的值明显增加,而系统活动没有相应增加,则表明存在硬件问题。
也可以对生成中断的磁盘驱动器、网卡和其他设备活动的间接指示器监视 Processor\ % Interrupt Time 时间。
注意
要检测可能影响处理器性能的硬件问题,例如 IRQ 冲突,请观察 System\ File Control Bytes/second 的值。
监视多处理器系统
要观察多处理器计算机的效率,请使用下列附加计数器。
计数器 | 说明 |
Process\ % Processor Time | 过程的所有线程在每个处理器上的处理器时间总和。 |
Processor(_Total)\ % Processor Time | 计算机中所有处理器的处理器活动的度量。 |
Thread\ % Processor Time | 线程的处理器时间数 |
性能测试之磁盘篇(windows)
监测对象:PhysicalDisk
如果分析的计数器指标来自于数据库服务器、文件服务器或是流媒体服务器,磁盘I/O对这些系统来说更容易成为瓶颈。
每磁盘的I/O数可用来与磁盘的I/O能力进行对比,如果经过计算得到的每磁盘I/O数超过了磁盘标称的I/O能力,则说明确实存在磁盘的性能瓶颈。
RAID | 计算方法 |
RAID0 | (Reads+Writes)/Number of Disks |
RAID1 | (Reads+2*Writes)/2 |
RAID5 | [Reads+(4*Writes)]/Number of Disks |
RAID10 | [Reads+(2*Writes)]/Number of Disks |
%Disk Time
表示磁盘驱动器为读取或写入请求提供服务所用的时间百分比,如果只有%Disk Time比较大,硬盘有可能是瓶颈
Average Disk Queue Length
表示磁盘读取和写入请求提供服务所用的时间百分比,可以通过增加磁盘构造磁盘阵列来提高性能(<=磁盘数的2倍)
Average Disk Read Queue Length
表示磁盘读取请求的平均数
Average Disk write Queue Length
表示磁盘写入请求的平均数
Average Disk sec/Read
磁盘中读取数据的平均时间,单位是s
Disk Bytes/sec 提供磁盘系统的吞吐率。
决定工作负载的平衡
要平衡网络服务器上的负载,需要了解服务器磁盘驱动器的繁忙程度。使用 Physical Disk\ % Disk Time 计数器,该计数器显示驱动器活动时间的百分比。如果 % Disk Time 较高(超过 90%),请检查 Physical Disk\ Current Disk Queue Length 计数器以查看正在等待磁盘访问的系统请求数量。等待 I/O 请求的数量应当保持在不大于组成物理磁盘的主轴数的 1.5 到 2 倍。
Average Disk sec/Transfer
磁盘中写入数据的平均时间,单位是s
计数器反映磁盘完成请求所用的时间。较高的值表明磁盘控制器由于失败而不断重试该磁盘。这些故障会增加平均磁盘传送时间。一般来说,定义该值小于15ms最为优异,介于15-30ms之间为良好,30-60ms之间为可以接受,超过60ms则需要考虑更换硬盘或硬盘的RAID方式了
Average Disk Bytes/Transfer
值大于 20 KB 表示该磁盘驱动器通常运行良好;如果应用程序正在访问磁盘,则会产生较低的值。例如,随机访问磁盘的应用程序会增加平均 Disk sec/Transfer 时间,因为随机传送需要增加搜索时间。
性能测试之网络篇(windows)
监测对象:Network Interface
网络分析是一件技术含量很高的工作,在一般的组织中都有专门的网络管理人员进行网络分析,对测试工程师来说,如果怀疑网络是系统的瓶颈,可以要求网络仍有来写真进行网络方面的检测。
Network Interface\Bytes Total/sec为发送和接收字节的速率(包括帧字符在内)。可以通过该计数器的值判断网络连接速度是否是瓶颈,具体操作方法是用该计数器的值与目前的网络带宽进行比较。
Byte Total/sec
表示网络中接受和发送字节的速度,可以用该计数器来判断网络是否存在瓶颈(参考值:该计数器和网络带宽相除,<50%)
性能测试之进程篇(windows)
查看进程的%Processor Time值
每个进程的%Processor Time反映进程所消耗的处理器时间。用不同进程所消耗的处理器时间进行对比,可以很容易的看出具体是哪个进程在性能测试过程中消耗了最多的处理器时间,从而可以据此针对应用进行优化。
查看每个进程产生的页面失效
可以用每个进程产生的页面失效(通过Process\Page Failures/sec计数器获得)和系统的页面失效(可通过Memory\Page Failures/sec计数器获得)的比值,来判断哪个进程产生了最多的失效页面,这个进程要么是需要大量内存的进程,要么是非常活跃的进程,可以对其进行中的分析。
了解进程的Process\Private Bytes
Process\Private Bytes是指进程所分配的无法与其他进程共享的当前字节数量。该计数器主要用拉判断进程在性能测试过程中有无内存泄漏。
(备注:进程分析方法用到的计数器主要有:Process\%Processor Time、Page Failures/sec、Page Failures/sec、Private Bytes)
相关链接:
① 内存映射文件机制
内存映射文件是利用虚拟内存把文件映射到进程的地址空间中去,在此之后进程操作文件,就像操作进程空间里的地址一样了,省去了读和写I/O的时间。
比如使用memcpy等内存操作的函数。这种方法能够很好的应用在需要频繁处理一个文件或者是一个大文件的场合,这种方式处理IO效率比普通IO效率要高。
利用内存映射文件您可以认为操作系统已经为您把文件全部装入了内存,然后您只要移动文件指针进行读写即可了。这样您甚至不需要调用那些分配、释放内存块和文件输入/输出的API函数,另外您可以把这用作不同的进程之间共享数据的一种办法。运用内存映射文件实际上没有涉及实际的文件操作,它更象为每个进程保留一个看得见的内存空间。至于把内存映射文件当成进程间共享数据的办法来用,则要加倍小心,因为您不得不处理数据的同步问题,否则您的应用程序也许很可能得到过时或错误的数据甚至崩溃。
内存映射文件本身还是有一些局限性的,譬如一旦您生成了一个内存映射文件,那么您在那个会话期间是不能够改变它的大小的。所以内存映射文件对于只读文件和不会影响其大小的文件操作是非常有用的。当然这并不意味着对于会引起改变其大小的文件操作就一定不能用内存影射文件的方法,您可以事先估计操作后的文件的可能大小,然后生成这么大小一块的内存映射文件,然后文件的长度就可以增长到这么一个大小。我们的解释够多的了,接下来我们就看看实现的细节:
- 作者: smallmousel 2009年01月9日, 星期五 12:04 回复(0) | 引用(0) 加入博采
Windows XP SP2 TCP/IP连接数的查看与修改
Windows XP SP2 TCP/IP连接数的查看与修改
http://blog.csdn.net/tsingmei/archive/2008/09/02/2867021.aspx
这几天使用机器人对公司的一款游戏进行压力测试,发现需要的机器台数太多,想提高每台机器的TCP数量,结果发现了EvID4226Patch.exe(http://www.lvllord.de/download.php?url=en/EvID4226Patch211a-en.zip),结果不错,特此总结。
- 作者: smallmousel 2008年12月22日, 星期一 10:38 回复(0) | 引用(0) 加入博采
C#--获取客户端MAC地址
http://www.cnblogs.com/kingboy/archive/2008/10/31/1025399.html
为了CRM系统的安全性,今天领导要求员工登录时候都要验证他们电脑的信息,匹配之后才允许登录。我左思右想还是验证网卡的MAC吧。首先在Commond层加个获取网卡信息的类GetNetCardMAC
using System;
using System.Collections.Generic;
using System.Text;
using System.Management;
namespace JL.CRM.Common

{
public class GetNetCardMAC
{
private ManagementClass mc;
private ManagementObjectCollection moc;
public GetNetCardMAC()
{ }
/**//// <summary>
/// 取得设备网卡的MAC地址
/// </summary>
public string GetNetCardMacAddress()
{
mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
moc = mc.GetInstances();
string str = "";
foreachin moc)
{
if ((bool)mo["IPEnabled"] == true)
str = mo["MacAddress"].ToString();
}
return str;
}
}
}
切记要引用命名空间:using System.Management。
心中窃喜,呵呵还是比较简单的。测试,晕 ! 这么做获取的是服务器的MAC。
要获取客户端的MAC用C#做就比较复杂了。网上也有很多类似的例子,不过获取客户端的信息最好还是用客户端脚本比较好。下面是个JavaScript的获取MAC的例子(转):
<HTML><HEAD><TITLE>WMI Scripting HTML</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<SCRIPT language=JScript event="OnCompleted(hResult,pErrorObject, pAsyncContext)" for=foo>
document.forms[0].txtMACAddr.value=unescape(MACAddr);
document.forms[0].txtIPAddr.value=unescape(IPAddr);
document.forms[0].txtDNSName.value=unescape(sDNSName);
//document.formbar.submit();
</SCRIPT>


<SCRIPT language=JScript event=OnObjectReady(objObject,objAsyncContext) for=foo>
if(objObject.IPEnabled != null && objObject.IPEnabled != "undefined" && objObject.IPEnabled == true)
{
if(objObject.MACAddress != null && objObject.MACAddress != "undefined")
MACAddr = objObject.MACAddress;
if(objObject.IPEnabled && objObject.IPAddress(0) != null && objObject.IPAddress(0) != "undefined")
IPAddr = objObject.IPAddress(0);
if(objObject.DNSHostName != null && objObject.DNSHostName != "undefined")
sDNSName = objObject.DNSHostName;
}
</SCRIPT>

<META content="MSHTML 6.00.2800.1106" name=GENERATOR></HEAD>
<BODY>
<OBJECT id=locator classid=CLSID:76A64158-CB41-11D1-8B02-00600806D9B6 VIEWASTEXT></OBJECT>
<OBJECT id=foo classid=CLSID:75718C9A-F029-11d1-A1AC-00C04FB6C223></OBJECT>
<SCRIPT language=JScript>
var service = locator.ConnectServer();
var MACAddr ;
var IPAddr ;
var DomainAddr;
var sDNSName;
service.Security_.ImpersonationLevel=3;
service.InstancesOfAsync(foo, 'Win32_NetworkAdapterConfiguration');
</SCRIPT>

<FORM id=formfoo name=formbar action=NICPost.asp method=post><INPUT value=00:05:5D:0E:C7:FA name=txtMACAddr> <INPUT value=192.168.0.2 name=txtIPAddr> <INPUT value=typ name=txtDNSName> </FORM></BODY></HTML>- 作者: smallmousel 2008年11月19日, 星期三 17:01 回复(0) | 引用(0) 加入博采
ASP.NET(C#)获取客户端的网卡MAC代码
ASP.NET(C#)获取客户端的网卡MAC代码
http://www.cnblogs.com/winner/archive/2007/05/12/743605.html
这两天在网上找关于获取客户端网卡的资料,网上差不多都是千篇一律的~试了好多代码,都不行~,昨天整理了一下,把代码发上来,希望对大家有所帮助吧~
1,首先要添加引用:
“项目”--“添加引用”---“using System.Runtime.InteropServices; ”
2,代码:
[DllImport("Iphlpapi.dll")]
private static extern int SendARP(Int32 dest,Int32 host,ref Int64 mac,ref Int32 length);
[DllImport("Ws2_32.dll")]
private static extern Int32 inet_addr(string ip);
private void Page_Load(object sender, System.EventArgs e)
{
try
{
string userip=Request.UserHostAddress;
string strClientIP = Request.UserHostAddress.ToString().Trim();
Int32 ldest = inet_addr(strClientIP); //目的地的ip
Int32 lhost = inet_addr(""); //本地服务器的ip
Int64 macinfo = new Int64();
Int32 len = 6;
int res = SendARP(ldest,0, ref macinfo, ref len);
string mac_src=macinfo.ToString("X");
if(mac_src == "0")
{
if(userip=="127.0.0.1")
Response.Write ("正在访问Localhost!");
else
Response.Write ("欢迎来自IP为" + userip + "的朋友!" + "<br>");
return;
}
while(mac_src.Length<12)
{
mac_src = mac_src.Insert(0,"0");
}
string mac_dest="";
for(int i=0;i<11;i++)
{
if (0 == (i % 2))
{
if ( i == 10 )
{
mc_dest = mac_dest.Insert(0,mac_src.Substring(i,2));
}
else
{
mac_dest ="-" + mac_dest.Insert(0,mac_src.Substring(i,2));
}
}
}
Response.Write ("欢迎来自IP为"+userip+ "<br>" + ",MAC地址为"+mac_dest+"的朋友!"
+ "<br>");
}
catch(Exception err)
{
Response.Write(err.Message);
}
}
- 作者: smallmousel 2008年11月19日, 星期三 17:00 回复(0) | 引用(0) 加入博采