C#/ASP.NET/Javascript/SQL面试题
以下题目为真实的面试题目,答案中部分由网络搜索转载
----------------C#
1.C#如何显示pdf[有项目经验才知道]
一:使用Adobe reader提供的COM组件 1.添加引用 工具箱---右键---选择项--COM组件--Adobe PDF Reader 2.使用方法 OpenFileDialog openFile=new OpenFileDialog(); open..Filter = "PDF文件|*.pdf"; openFile.ShowDialog(); axAcroPDF1.src = openFile.FileName; //axAcroPDF1.LoadFile(of.FileName); //使用方法二 二:不使用Adobe reader提供的COM组件 http://www.codeproject.com/KB/silverlight/BlendPDFwithSilverlight.aspx http://www.codeproject.com/KB/applications/PDFViewerControl.aspx 或者其它开源方案
2.如下三个函数之间有什么不同[基础]
1 void test(string s) test(ss) 2 void test(ref string s) test(ref ss) 3 void test(out string s) test(out ss)
答案:
test(string s) 调用前传入的参数s必须初始化(包括null),如果test函数内部修改了s的值,传入的参数不会改变
test(ref string s) 调用前传入的参数s必须初始化(包括null),如果test函数内部修改了s的值,传入的参数也会改变
test(out string s) 调用前传入的参数s不需要初始化,如果test函数内部修改了s的值,传入的参数也会改变
3.运行时异常和普通异常异同
普通异常:可捕捉的,可恢复异常,比如IO异常 运行时异常:不可捕捉,由系统进行处理的,无法恢复的错误 http://www.cnblogs.com/air5/archive/2011/11/07/2239399.html
4.请描述链式委托是什么
即 委托链,委托内部通过链表的方式将注册的方法进行保存,然后依次调用
5.C#实现了那几种可访问性级别
1 public 访问不受限制。 2 protected 访问仅限于包含类或从包含类派生的类型。 3 internal 访问仅限于当前程序集。 4 protected internal 访问仅限于从包含类派生的当前程序集或类型。 5 private 访问仅限于包含类型。
6.如何设置线程池并发线程的最大最小数量[这个题目脑残,除非记得很清楚,不然即使用过也很容易忘记]
1 System.Threading.ThreadPool.SetMaxThreads(50, 2000); 2 System.Threading.ThreadPool.SetMinThreads(50, 2000);
7.同步块和同步快索引的机制[线程]
http://www.cnblogs.com/yuyijq/archive/2009/03/13/1410071.html http://genwoxuedotnet.blog.51cto.com/1852748/504107
8.根据线程安全的相关知识,分析以下代码,当调用test方法时i>10时是否会引起死锁?并简要说明理由。[线程]
1 public void test(int i) 2 { 3 lock(this) 4 { 5 if (i > 10) 6 { 7 i--; 8 test(i); 9 } 10 } 11 }
答案:根据网上的资料,大都回答如下:
1)不会发生死锁,(但有一点int是按值传递的,所以每次改变的都只是一个副本,因此不会出现死锁。但如果把int换做一个object,那么死锁会发生)
经过实际程序验证和这种说法的结果是一致的,但是也另外一种说法,参看2)
以下是测试程序:
1 public class Printer 2 { 3 public void test(int i) 4 { 5 lock(this) 6 { 7 if (i > 10) 8 { 9 10 i--; 11 test(i); 12 Console.WriteLine(i); 13 } 14 } 15 } 16 public void test(object aa) 17 { 18 int i=20; 19 lock(this) 20 { 21 if (i > 10) 22 { 23 i--; 24 Console.WriteLine("{0}\t{1}",i,aa);//去掉此句会产生异常StackOverflowException 25 test(aa); 26 } 27 } 28 } 29 } 30 31 //调用 32 public static void Main() 33 { 34 Printer p = new Printer(); 35 p.test(25);//不死锁 36 37 try{ 38 p.test("aaaaa"); 39 } 40 catch( Exception e) 41 { 42 Console.WriteLine(e); 43 } 44 }
2)《CLR via C#》第二版(中文版,清华大学出版社出版)的第530页中第7行找到了这样的描述:“同样需要引起注意的是线程可以递归拥有同步块”。即同一线程可以递归调用lock语句。
来源于:http://www.cnblogs.com/myshell/archive/2010/07/18/1780386.html
参考
http://www.cnblogs.com/csharp4/archive/2010/06/11/1756276.html
http://blog.csdn.net/xuexiaodong2009/article/details/6336696
http://msdn.microsoft.com/zh-cn/library/c5kehkcz.aspx
9.有三个线程ID分别是A、B、C,请有多线编程实现,在屏幕上循环打印10次ABCABC…[线程]
1 public void PrintABC() 2 { 3 int count=0; 4 string name=System.Threading.Thread.CurrentThread.Name; 5 while (count<10) 6 { 7 if (ppp=="c" && name=="a" || ppp=="a" && name=="b" || ppp=="b" && name=="c" ) 8 { 9 //System.Console.Write("{0}{1}",count,name); 10 System.Console.Write("{0}",name); 11 ppp=name; 12 count++; 13 } 14 } 15 } 16 17 18 //调用 19 for (char c='a';c<'d';c++) 20 { 21 Thread tt=new Thread(new ThreadStart(t.PrintABC)); 22 tt.Name=c.ToString(); 23 tt.Start(); 24 } 25
10.假如有字符串“6sabcsssfsfs33” ,用最快速的方法去掉字符“ab3”,不能用内置字符串方法(indeOf,substring,replaceAll等)?
[老实说不知道要考什么]
最快的不知道,随便写一个
1 public string RemoveAB3(string s,string rs) 2 { 3 string tmp=""; 4 for(int i=0;i<s.Length;i++) 5 { 6 bool bExist=false; 7 //here,use hashset for rs 8 for(int j=0;j<rs.Length;j++) 9 { 10 if (s[i]==rs[j]) 11 { 12 bExist=true; 13 } 14 } 15 if (!bExist) tmp+=s[i]; 16 } 17 return tmp; 18 } 19 //调用 20 string s="6sabcsssfsfs33"; 21 string s1="ab3"; 22 System.Console.WriteLine("{0}\n{1}",s,t.RemoveAB3(s,s1));
----------------ADO.NET
1.ADO.NET常用5个类的名称[一般用过的大概都知道,悲惨是如果一开始就是用orm的,就不一定知道了]
DataSet
Connection
Command
DataReader
DataAdapter
2.下面四个方法,哪些可以返回数据[同上]
ExecuteNonQuery :执行 Transact-SQL INSERT、DELETE、UPDATE 及 SET 语句等命令。 ExecuteScalar :从数据库中检索单个值(例如一个聚合值)。 ExecuteReader :执行返回行的命令。
还有一个忘记
----------------ASP.NET
1.Asp.Net部署有哪几种方法
方法1:---直接复制到IIS目录发布目录中(C:\Inetpub\wwwroot) 方法2:---使用Vs2008的IDE自带的发布功能, 进行发布操作. 方法3: ---使用虚拟目录发布网站. http://www.cnblogs.com/mishchael/articles/1897131.html
2.简单描述<%# eval("xxx") %>机制
Eval最终是调用DataBinder.Eval方法,DataBinder.Eval是采用反射来获取数据的,进行数据绑定
http://www.cnblogs.com/oec2003/archive/2009/01/14/1375868.html
http://www.cnblogs.com/mr_jinrui/archive/2010/07/06/1772129.html
3.写出Asp.net页面生命周期中的事件
参考http://msdn.microsoft.com/zh-cn/library/ms178472.aspx
----------------SQL
1.SQL行转列(具体题目忘记,以如下例子代替)[case when ,sum,group by]
表格数据: name,paytype,money,datatime 小李 支付宝 20 2012-01-03 00:00:00.000 小陈 工行 40 2012-01-06 00:00:00.000 小赵 交行 60 2012-01-06 00:00:00.000 小陈 支付宝 80 2012-01-06 00:00:00.000 小赵 工行 100 2012-01-16 00:00:00.000 小张 中行 120 2012-01-16 00:00:00.000 小李 支付宝 140 2012-01-16 00:00:00.000
请按照如下格式显示(银行的顺序不限制),每一个人在各银行的消费总和
name,支付宝,工行,交行,中行 小陈 80 40 0 0 小李 160 0 0 0 小张 0 0 0 120 小赵 0 100 60 0
答案:主要使用case when、sum、和group by
测试表格和数据
1 --------创建行转列测试表格 2 create table PayPhoneMoney 3 ( 4 id int identity(1,1), 5 userName nvarchar(20), 6 payType nvarchar(20), 7 money decimal, 8 payTime datetime, 9 constraint pk_id primary key(id) 10 ) 11 12 go 13 14 --------插入行转列测试数据 15 delete from PayPhoneMoney 16 insert into PayPhoneMoney values('小李','支付宝',20,'2012-01-03') 17 insert into PayPhoneMoney values('小陈','工行',40,'2012-01-06') 18 insert into PayPhoneMoney values('小赵','交行',60,'2012-01-06') 19 insert into PayPhoneMoney values('小陈','支付宝',80,'2012-01-06') 20 insert into PayPhoneMoney values('小赵','工行',100,'2012-01-16') 21 insert into PayPhoneMoney values('小张','中行',120,'2012-01-16') 22 insert into PayPhoneMoney values('小李','支付宝',140,'2012-01-16') 23 24 --------显示所有测试行数据 25 select * from PayPhoneMoney username
方法1:
1 --------如果行转列中的列式有限且已知的几个,可以使用它case when语句 2 select username , 3 sum(case payType when '支付宝' then money else 0 end) as '支付宝', 4 sum(case payType when '工行' then money else 0 end) as '工行', 5 sum(case payType when '交行' then money else 0 end) as '交行', 6 sum(case payType when '中行' then money else 0 end) as '中行' 7 from PayPhoneMoney 8 group by username
方法2:
1 --------如果行转列中的列,是动态的且未知个数,使用如下方式 2 --------原理就是根据通过select Distinct产生获取动态列对应的行,然后通过这些行以case when语句产生对应的列 3 declare @cmdText varchar(8000) 4 set @cmdText='select userName, ' 5 select @cmdText=@cmdText+' sum(case payType when '''+payType+''' then money else 0 end) as '''+payType 6 +''','+char(10) from (select Distinct payType from PayPhoneMoney) T 7 print @cmdText--发现最后多一个逗号下面把逗号去掉 8 set @cmdText=left(@cmdText,len(@cmdText)-2)--去掉逗号 9 set @cmdText=@cmdText+' from PayPhoneMoney group by userName' 10 print @cmdText 11 exec(@cmdText)
2.内连接、左连接、右连接、全连接、交叉连接[前三个常用]
概念不解释,请自行搜索
例子:
部门表:id,name
雇员表:id,name,salary,title,manager,dept_id
测试数据:
1 create table department 2 ( 3 id int identity(1,1), 4 name nvarchar(30), 5 ) 6 go 7 8 create table employee 9 ( 10 id int identity(1,1), 11 name nvarchar(30) not null, 12 salary money, 13 title nvarchar(30), 14 manager int, 15 dept_id int, 16 17 ) 18 go 19 20 insert into department values('人力资源'); 21 insert into department values('开发中心'); 22 insert into department values('总裁室'); 23 24 insert into employee values('赵六',19000,'项目经理',null,2); 25 insert into employee values('王五',17000,'项目组长',4,2); 26 insert into employee values('张三',16000,'程序员',3,2); 27 insert into employee values('李四',17000,'HR',4,1);
1 --内连接:是最常用的链接,也叫等值链接 2 --不管限制条件在on中还是在where中,内连接都得到笛卡尔积中满足所有条件的记录。对于inner join, on和where的效果是一样的。 3 --1)当没有限制条件,此时为笛卡尔积: 4 select * from employee,department 5 select * from employee inner join department on 1=1 6 --2)此时如果加上where限制条件,则对上面笛卡尔积的每一条记录看它是否满足限制条件,如果满足,则它在结果集中。 7 select * from employee emp,department dept where emp.dept_id=dept.id 8 select * from employee emp inner join department dept on emp.dept_id=dept.id 9 select * from employee emp cross join department dept where emp.dept_id=dept.id 10 --左连接(left join): 11 --1)当没加限制条件时,得到笛卡尔积,同内连接没加限制条件一样 [ 12 select * from employee left join department on 1=1 13 --当添加特定条件时: 14 select * from department 15 select * from employee 16 select * from employee emp left join department dept on emp.dept_id=dept.id 17 --右连接(right join): 18 select * from employee emp right join department dept on emp.dept_id=dept.id 19 --全连接: 20 --会从左表 (employee) 和右表 (department) 那里返回所有的行。如果 "employee" 中的行在表 "department" 中没有匹配,或者如果 "department" 中的行在表 "employee" 中没有匹配,这些行同样会列出 21 select * from employee emp full join department dept on 1=1
3.Union
合并两个数据表格,要求两个表列数相同,且对应列的类型是相似的
4.数据库有几种锁[]
独占锁
共享锁
更新锁
...
5.数据库分页[常用,但是一般都是调用写好的存储过程]
方法很多,请自行搜索,这里写一个简单的,但是效率不高的
1 select top @PageSize * from tb where id not in 2 ( 3 select top (@PageIndex-1)*@PageSize id from tb order by id asc 4 )order by id asc;
6.怎么防止sql注入
使用参数化查询方式(禁止拼凑字符串)
7.索引[提高效率的好方法]
好多个,请自行搜索
8.数据库优化
加索引 ,分布式数据库,横向切割表等等
9.如下两表
--订单 create table [Order] ( OrderID int identity(1,1), CreateTime datetime, ) --订单行 create table OrderLine ( OrderLineID int identity(1,1), money decimal, Price decimal, count int, OrderID int, -->Order.OrderID )
1)请写出当天所有Order的OrderLine
select * from OrderLine where orderid in (select orderid from [Order] where CreateTime between '2010-12-11 00:00:00' and '2010-12-11 23:59:59') --or select OrderLine.* from OrderLine right join [Order] on OrderLine.orderid=[Order].orderid where [Order].CreateTime between '2010-12-11 00:00:00' and '2010-12-11 23:59:59'
2)请列出每一笔总金额超过200的Order[考察对having和sum的运用]
select * from [Order] where orderid in (select orderid from OrderLine group by orderid having sum(money*count) >200) --or select [Order].* from [Order] left join (select orderid from OrderLine group by orderid having sum(money*count) >200) b on b.orderid=[Order].orderid
3)忘记了
10.请说出Cast和Convert的区别
http://hi.baidu.com/s_s_o_o/item/843c6d0c4e5d8d2ea1312deb
----------------Javascript
1.javascript/jquery实现字符串判断函数,长度在5-15之间,首字符必须是字母,其它字符可以是字母数字和下划线
[考察对正则表达式的运用]
1 function test(str) 2 { 3 var aa=/^[a-zA-Z]{1,1}[a-zA-Z0-9_]*$/gi; 4 return (str.length>=5 && str.length<=15) && aa.test(str) ; 5 } 6 //调用 7 var s="q1q_sdsdddddddd"; 8 alert(test(s));
2.Ajax的工作原理
http://blog.csdn.net/yakihappy/article/details/3976960
3.Ajax的中文或者英文全称[莫名其妙的题目]
Asynchronous JavaScript and XML(非同步的JavaScript与XML)
----------------CSS
1.如何使容器(假设为DIV)水平和垂直同时居中
1 .mainbar { 2 /*必须设定高度和宽度*/ 3 width:500px; 4 height:400px; 5 /*设定绝对定位*/ 6 position: absolute; 7 /*将其左上顶点的位置放置于父容器的正中间*/ 8 top: 50%; 9 left:50%; 10 /*向上平移自身高度的一半,向左移动自身宽度的一半*/ 11 margin-top: -200px; 12 margin-left:-250px; 13 14 background:green; 15 }
1 <div class="mainbar"></div>
注意要点:
1)高度和宽度必须指定值 2)使用绝对定位 3)top和left必须设定为50% 4)margin-top和margin-left必须设定为自身高度和宽度的一半,且都为负值
2.三列div结构的实现方法
1 //CSS 2 <style type="text/css"> 3 * { 4 margin:0; 5 padding:0 6 } 7 .l-sidebar { 8 width:200px;//必须设置 9 height:500px; 10 position:absolute;//必须固定 11 top:0; 12 left:0; 13 background:blue; 14 } 15 .mainbar { 16 margin-left:200px;//左边容器宽度 17 margin-right:300px;//右边容器宽度 18 height:500px; 19 background:green; 20 } 21 .r-sidebar { 22 width:300px;//必须设定 23 height:500px; 24 position:absolute;//必须固定 25 top:0px; 26 right:0px; 27 background:blue; 28 } 29 </style>
1 //HTML 2 <div class="l-sidebar"></div> 3 <div class="mainbar"></div> 4 <div class="r-sidebar"></div>
简言之:左右容器固定位置,且都设定宽度,中间容器margin左右容器的宽度
还有其它方式,请自行搜索
3)左右两列div实现
1 <style type="text/css"> 2 * { 3 margin:0; 4 padding:0 5 } 6 .l-sidebar { 7 width:200px; 8 height:500px; 9 position:absolute; 10 top:0; 11 left:0; 12 background:blue; 13 } 14 .mainbar { 15 margin-left:200px;//此宽度就是左边容器宽度 16 17 height:500px; 18 background:green; 19 } 20 21 </style>
1 <div class="l-sidebar"></div> 2 <div class="mainbar"></div>
----------------XML
1.
1 <?xml version="1.0" encoding="UTF-8" ?> 2 3 <?xml-stylesheet type="text/xsl" href="./employee.xsl"?> 4 5 <root> 6 <manager id="1001"/> 7 <emplyee id="1001" > 8 <name>韦小宝</name> 9 <age>32</age> 10 <sex>male</sex> 11 </emplyee> 12 <emplyee id="1002" > 13 <name>张夏宏</name> 14 <age>26</age> 15 <sex>male</sex> 16 </emplyee> 17 <emplyee id="1003" > 18 <name>刘德华</name> 19 <age>27</age> 20 <sex>male</sex> 21 </emplyee> 22 <emplyee id="1004" > 23 <name>翁虹</name> 24 <age>25</age> 25 <sex>female</sex> 26 </emplyee> 27 <emplyee id="1005" > 28 <name>车晓</name> 29 <age>35</age> 30 <sex>female</sex> 31 </emplyee> 32 </root>
1)请用xpath表示出唯一的经理的名字
1 <xsl:value-of select="/root/emplyee[@id=/root/manager[1]/@id]/name/text()"/> 2 //or 3 <xsl:value-of select="/root/emplyee[@id='1001']/name/text()"/>
2)统计年龄在26岁以上员工的数量
1 <xsl:value-of select="count(/root/emplyee[age>26])"/>
3)显示所有女性员工名称
<xsl:for-each select="/root/emplyee[sex/text()='female']"> <xsl:value-of select="./name/text()"/> </xsl:for-each>
4)剩下的几个忘记了
----------------算法题----[这种题目适合刚毕业的,老鸟们一般都不太记得]
1)用非递归和递归算法分别实现 斐波拉契序列:1,1,2,3,5,8,13
1 public class Fibonacci 2 { 3 //非递归 4 public uint Calc(uint n) 5 { 6 uint nCur,nF,nL; 7 nCur=nF=nL=1; 8 if (n==1 ||n==2) 9 { 10 return nCur; 11 } 12 for(uint i=3;i<=n;i++) 13 { 14 nCur=nF+nL; 15 nF=nL; 16 nL=nCur; 17 } 18 return nCur; 19 } 20 //递归 21 public uint Calc1(uint n) 22 { 23 return (n==1 ||n==2)?1:Calc1(n-1)+Calc1(n-2); 24 } 25 }
2.已知0!=1,1!=1,2!=2*1!,3!=3*2!........n!=n*(n-1)!
请给定x,计算下面序列,1!,3!,5!.......(2x+1)!
----------------其它
1.一个大矩形内部剪掉一个小矩形,大矩形完全包含剪掉的掉矩形,请在大矩形中画一条直线,将大矩形剩余部分分成面积相等的区域