C# 菜鸟今天去博彦面试了

昨天收到博彦HR的电话,说在前程无忧上面看到我简历有更新,他们有一职位,我就抱着体验的态度去了

职位名叫开发测试  我现在理解工作的内容是开发的人设计了数据库,我应该写C#代码,智能去测试看看设计的对不对,属于测试的一种,个人青睐于开发,哪一天也能成为C#高手。故对此不敢兴趣。

面试中问了好多数据库的东西。记录下来,并从网上查阅相关资料

1、视图的作用?

以往当我们查询数据时,一定要很认真的地从设计select语句开始,将需要查询的每个字段写在sql语句里,每次你要以同样的条件来查询数据时,那么每次都要重复输入相同的查询语句,效率很低。若将这个经常要重复使用的查询语句创建成视图,就不用那么麻烦了!直接用select * from 视图名 就行了,其实将查询语句创建成视图,不仅仅是简化查询的动作;更重要的是,视图具备数据表的特性,还可以衍生出更多的应用。 

        所谓视图(View)其实是执行查询语句后得到的结果,但这个查询结果可以仿真成数据表来使用,所以有人也称它为“虚拟数据表”,视图在操作上和数据表没有什么区别,但两者的差异是其本质是不同的:数据表是实际存储记录的地方,然而视图并不保存任何记录,它存储的实际上是查询语句,其所呈现出来的记录实际来自于数据表,可以为多张数据表,大家由此可以预见到视图应用的弹性!我们可以依据各种查询需要创建不同视图,但不会因此而增加数据库的数据量。

 下面总结视图的几大优点:1.增强可读性 2.数据安全及保密:针对不同用户,可以创建不同视图,限制其所能浏览和编辑的数据内容。3.降低查询复杂度 4.方便维护。

       总之,善于运用视图可以让数据库的设计、管理及使用都更加有效率、更加方便。

视图可以被看成是虚拟表或存储查询。可通过视图访问的数据不作为独特的对象存储在数据库内。数据库内存储的是 SELECT 语句。SELECT 语句的结果集构成视图所返回的虚拟表

2、如何删除有主外键关联的数据

两种方法,第一种很简单,  www.dedecms.com  当在创建主外键时,
 把删除规则设为层叠(SQL2005),在SQL2008中又叫做级联了!类别表和新闻表,新闻表和评论表都要设为层叠。一般很少用!不安全!!

第二种就是写触发器了!这是类别表的触发器

3、触发器用过没,怎么用的,作用?

数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完整地执行,要么完全地不执行。
事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、隔离性和持久性)属性。

相关属性

原子性

(atomic)(atomicity)
事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。通常,与某个事务关联的操作具有共同的目标,并且是相互依赖的。如果系统只执行这些操作的一个子集,则可能会破坏事务的总体目标。原子性消除了系统处理操作子集的可能性。

一致性

(consistent)(consistency)
事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构(如 B 树索引或双向链表)都必须是正确的。某些维护一致性的责任由应用程序开发人员承担,他们必须确保应用程序已强制所有已知的完整性约束。例如,当开发用于转帐的应用程序时,应避免在转帐过程中任意移动小数点。

隔离性

(insulation)(isolation)
由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。这称为隔离性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同。当事务可序列化时将获得最高的隔离级别。在此级别上,从一组可并行执行的事务获得的结果与通过连续运行每个事务所获得的结果相同。由于高度隔离会限制可并行执行的事务数,所以一些应用程序降低隔离级别以换取更大的吞吐量。防止数据丢失

 持久性

(Duration)(durability)
事务完成之后,它对于系统的影响是永久性的。该修改即使出现致命的系统故障也将一直保持。

下面将为您介绍如何执行多条SQL语句,实现数据库事务的方法,供您参考,如果您对SQL语句和事务感兴趣的话,不妨一看,详细对您学习SQL大有帮助。

/// <summary>  

/// 执行多条SQL语句,实现数据库事务。    

/// </summary>    

/// <param name="SQLStringList">多条SQL语句</param>           

public static void ExecuteSqlTran(IList<string> SQLStringList)    

{        

         using (SqlConnection conn = new SqlConnection(connectionString))        

        {            

                 conn.Open();            

                 SqlCommand cmd = new SqlCommand();

                 cmd.Connection = conn;

                 SqlTransaction tx = conn.BeginTransaction();

                 cmd.Transaction = tx;

                try            

                {

                    for (int n = 0; n < SQLStringList.Count; n++)

                    {

                              string strsql = SQLStringList[n].ToString();

                              if (strsql.Trim().Length > 1)

                              {

                                  cmd.CommandText = strsql;

                                  cmd.ExecuteNonQuery();

                             }

                    }

                tx.Commit();

            }

            catch (System.Data.SqlClient.SqlException E)

            {

                tx.Rollback();

                throw new Exception(E.Message);

            }

        }

    }

5、存储过程异常处理

编程的异常处理很重要,当然Sql语句中存储过程的异常处理也很重要,明确的异常提示能够快速的找到问题的根源,节省很多时间。

C#中可以用try。。catch不惑异常,看看数据库存储过程如何捕捉异常的

下面,我就以一个插入数据为例来说明Sql Server中的存储过程怎么捕获异常的 。

1、环境

  (1)数据库为Sql Server2008。

  (2)表(Course)结构为:

    No char(10)  primary key

    Name varchar(20)

    Comment varchar(50)

2、存储过程

  就以插入数据为例,其他的可以照着写就行了。  

  编程语言都有异常的捕获与处理, 在 SqlServer2008 中也是这样子的。

对会出现异常的语句加上 begin try……end try ,然后进行异常捕捉:begin catch……end catch即可。

   错误代码详解 很容易就能找到。

  代码如下:

复制代码
 1 Createproc sp_Insert_Course
 2 @Nochar(10),
 3 @Namevarchar(20),
 4 @Commentvarchar(50),
 5 @rtnint output
 6 as 7 begin try
 8 insertinto Course values(@No,@Name,@Comment)
 9 set@rtn=110 end try
11 begin catch
12 set@rtn=@@ERROR13 14 --辅助信息15 --select ERROR_LINE() as Line,16 --    ERROR_MESSAGE() as message1,17 --    ERROR_NUMBER() as number,18 --    ERROR_PROCEDURE() as proc1,19 --    ERROR_SEVERITY() as severity,20 --    ERROR_STATE() as state121 end catch
复制代码

 3、存储过程执行

  相关代码如下:

1 declare2 @rtnint3 exec sp_Insert_Course '114','语文','',@rtn output 4 print@rtn

 执行结果:

  正常的情况下,返回值为1,

  如果已经存在编号为“114”的数据,就会返回 ERROR_CODE:2627,

  其他的异常情况会返回相应的代码

4、说明

  如果程序有异常,把异常代码返回,然后再进行相关的处理即可。

   SQL Server中的异常处理和别的数据库(如Oracle)的有点差异,但是基本思想差不多, 在最后捕获都可以得到异常。 

     

6、char 、varchar有什么区别?

  在建立数据库表结构的时候,为了给一个String类型的数据定义一个数据库的数据库类型,一般参考的都是char或者varchar,这两种选择有时候让人很纠结,今天想总结一下它们两者的区别,明确一下选择塔门的理由。

      首先明确的是,char的长度是不可变的,而varchar的长度是可变的,也就是说,定义一个char[10]和varchar[10],如果存进去的是‘csdn’,那么char所占的长度依然为10,除了字符‘csdn’外,后面跟六个空格,而varchar就立马把长度变为4了,取数据的时候,char类型的要用trim()去掉多余的空格,而varchar是不需要的,尽管如此,char的存取数度还是要比varchar要快得多,因为其长度固定,方便程序的存储与查找;但是char也为此付出的是空间的代价,因为其长度固定,所以难免会有多余的空格占位符占据空间,可谓是以空间换取时间效率,而varchar是以空间效率为首位的。再者,char的存储方式是,对英文字符(ASCII)占用1个字节,对一个汉字占用两个字节;而varchar的存储方式是,对每个英文字符占用2个字节,汉字也占用2个字节,两者的存储数据都非unicode的字符数据。

posted @ 2013-10-12 17:25  超可爱的小蜜蜂  阅读(229)  评论(0编辑  收藏  举报