sql注入
什么是sql注入?如何防止sql注入?
就是把sql语句插入到查询字符串中,以达到欺骗服务器来执行恶意的命令
防止sql注入的方法:sql参数化查询
获取最新的sql插入:
/*对于马上使用的刚才插入的新记录ID用SCOPE_IDENTITY()是最合适的*/
INSERT INTO table(field1,field2,) VALUES("field1Value","field2Value",) SELECT SCOPE_IDENTITY() as newIDValue
/* 对于想要得到一个表中的最后一个插入操作所产生的ID的最好用IDENT_CURRENT(‘TBName‘)*/
INSERT INTO table(field1,field2,) VALUES("field1Value","field2Value",) SELECT IDENT_CURRENT(‘recordID‘) as newIDValue
编程题:
1 1 2 3 5 8。。
int [] array=new int[30]; for(int i=0;i<=array.length;i++) { if(i-2<0) return 0; else array[i]=array[i-1]+array[i-2]; }
将100个100以内的随机数插入到空的数组中
List<int> list = new List<int>(); Random ran = new Random(); while(true) { if (list.Count >= 100) { break; } int s = ran.Next(1, 101); //生成100以内的随机整数 if (!list.Contains(s)) { list.Add(s); } //如果list<>里面不存在s,就把s加到list中去 } list.Sort(); //排序 foreach (int i in list) { Console.Write(i + " "); } Console.ReadKey();
C#冒泡排序
static List<int> list = new List<int>(); int temp=0; for(int i=0;i<list.count;i++) { for(int j=0;j<i-1;j++) { temp=list[i]; list[i]=list[i+1]; list[i+1]=temp; } }
进程和线程
进程是包含某些一些资源的内存
线程是进程的一个实体,CPU调度的最小单位
一个线程可以撤销和创建另一个线程,多个线程可以并发执行
区别:一个进程可以有多个线程
线程不能单独执行,必须依赖应用程序来进行执行
TCP/IP
TCP/IP协议是一组完整的网络协议,TCP传输层IP网络层
TCP和UDP的区别
TCP提供的是面向连接的、可靠的数据流传输,而UDP提供的是非面向连接的、不可靠的数据流传输。
简单的说,TCP注重数据安全,而UDP数据传输快点,但安全性一般
数据库的一些面试题
什么是数据库事物
单个逻辑事物的操作
ACID(原子性,一致性,隔离性,持久性)
存储过程
存储过程是一组予编译的SQL语句
它的优点:1.允许模块化程序设计,就是说只需要创建一次过程,以后在程序中就可以调用该过程任意次。
2.允许更快执行,如果某操作需要执行大量SQL语句或重复执行,存储过程比SQL语句执行的要快。
3.减少网络流量,例如一个需要数百行的SQL代码的操作有一条执行语句完成,不需要在网络中发送数百行代码。
列举ADO.NET中的五个主要对象
Connection连接对象
Command执行命令和存储过程
DataReader向前只读的数据流
DataAdapter适配器,支持增删查询
DataSet数据级对象,相当与内存里的一张或多张表。
三层架构:表现层,业务逻辑层,数据访问层
WebService服务可以描述为可以在web上部署并可以被任何应用程序或其他服务调用的功能
final :不能派生新的子类
finally:异常处理
finalize:GC处理
垃圾回收器跟踪并回收托管内存中分配的对象,定期执行垃圾回收以回收分配给没有有效引用的对象的内存。当使用可用内存不能满足内存请求时,GC会自动进行。
在进行垃圾回收时,垃圾回收器会首先搜索内存中的托管对象,然后从托管代码中搜索被引用的对象并标记为有效,接着释放没有被标记为有效的对象并收回内存,最后整理内存将有效对象挪动到一起
struct和class的区别
结构与类共享几乎所有相同的语法,但结构比类受到的限制更多:尽管结构的静态字段可以初始化,结构实例字段声明还是不能使用初始值设定项。
结构不能声明默认构造函数(没有参数的构造函数)或析构函数。
结构的副本由编译器自动创建和销毁,因此不需要使用默认构造函数和析构函数。实际上,编译器通过为所有字段赋予默认值(参见默认值表)来实现默认构造函数。
结构不能从类或其他结构继承。
结构是值类型 -- 如果从结构创建一个对象并将该对象赋给某个变量,变量则包含结构的全部值。复制包含结构的变量时,将复制所有数据,对新副本所做的任何修改都不会改变旧副本的数据。
由于结构不使用引用,因此结构没有标识 -- 具有相同数据的两个值类型实例是无法区分的。C# 中的所有值类型本质上都继承自ValueType,后者继承自 Object。编译器可以在一个称为装箱的过程中将值类型转换为引用类型。
结构具有以下特点:
结构是值类型,而类是引用类型。
向方法传递结构时,结构是通过传值方式传递的,而不是作为引用传递的。
与类不同,结构的实例化可以不使用 new 运算符。
结构可以声明构造函数,但它们必须带参数。
一个结构不能从另一个结构或类继承,而且不能作为一个类的基。所有结构都直接继承自 System.ValueType,后者继承自 System.Object。
结构可以实现接口。
在结构中初始化实例字段是错误的。
Override是重写的意思,它表示重写基类的方法,而且方法的名称,返回类型,参数类型,参数个数要与基类相同。
Overload是重载是意思,它也表示重写基类的方法,但是只要方法名相同,别的可以不同。
声明方法的存在而不去实现它的类被叫做抽像类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽像类,并让它指向具体子类的一个实例。不能有抽像构造函数或抽像静态方法。Abstract 类的子类为它们父类中的所有抽像方法提供实现,否则它们也是抽像类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。
接口(interface)是抽像类的变体。在接口中,所有方法都是抽像的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽像的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对像上调用接口的方法。由于有抽像类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。
ASP.net的页面传值
session简单,但易丢失
application 全局
cookie 简单,但可能不支持,可能被伪造
input type="hidden" 简单,可能被伪造
url参数简单,显示于地址栏,长度有限
数据库稳定,安全,但性能相对弱