Asp.net核心技术思想
1、概述反射和序列化
反射:程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性
序列化:序列化是将对象转换为容易传输的格式的过程。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间
传输该对象。在另一端,反序列化将从该流重新构造对象。
2.如何把一个array复制到arrayList里
方法一、使用foreach循环,将array数组中的数据逐步放入ArrayList的对象中;
方法二、使用Copy方法,进行数据的复制;
方法三、使用ArrayList的adpater的方法 ,将整个Array对象封装到ArrayList对象中。
// author:renfuming
public static void Main(string[] renargs)
{
int[] arrayInt=new int[]{1,2,3,4};
ArrayList arrlistInt=new ArrayList();
//方法一
foreach(int a in arrayInt)
{
arrlistInt.Add(a);
}
Console.WriteLine(arrlistInt[2].ToString());//输出3
//方法二:
ArrayList arrlistInt2=new ArrayList();
arrlistInt2=ArrayList.Adapter(arrayInt);
Console.WriteLine(arrlistInt2[2].ToString());//输出3
//逆向转换
Array resultArr=(int[])arrlistInt2.ToArray(typeof(int));
Console.WriteLine(resultArr.GetValue(2));//输出3
}
3.datagrid.datasouse可以连接什么数据源
[dataset,datatable,dataview,IList]等接口类型的对象
4. new有几种用法
第一种:new Class(),新建一个类的对象,但是此类必须的又可访问的构造函数
第二种:显式覆盖基类的方法:public new Menthod(){}
5.概述o/r mapping 的原理
利用反射,配置 将类于数据库表映射
O/RMapping(有学习曲线,没有工具支持会相当大):存在的时间已经很长,我认为它的最主要的作用是关系型数据库的反设计——关系型数据库的设计就是要把现实中的对象和对象间关系设计成实体和实体间的关系映射。而O/RMapping恰好相反,它是把实体和实体间的关系映射还原回对象和对象间的关系。
6.类成员有( )种可访问形式
可访问性:public ,protected ,private,internal
可能还有其他的访问形式,具体的情况视编码需要而定
7.用sealed修饰的类有什么特点
sealed 修饰符用于防止从所修饰的类派生出其它类。如果一个密封类被指定为其他类的基类,则会发生编译时错误。
密封类不能同时为抽象类。
sealed 修饰符主要用于防止非有意的派生,但是它还能促使某些运行时优化。具体说来,由于密封类永远不会有任何派生类,所以对密封类的
实例的虚拟函数成员的调用可以转换为非虚拟调用来处理。
8.列举ADO.NET中的五个主要对象,并简单描述
connection,command,dataReader,transaction,dataset ...
其上对于各种对象,连接不同的数据库将会有不同的对象变体
Connection: 数据库的连接需要此对象
Command:执行数据表变化的命令
dataReader和dataset主要是对数据库的表信息进行两种不同方式的读取,具体的读取得区别,后面将会有讲解
9.执行下面代码后:
String strTemp ="yyaccpx 某某某";
Int i System.Text.Encoding.Default.GetBytes(strTemp).Length;
Int j = strTemp.Length;
结果:i=(14 ) ;j=(11 )
i=(14 ) ;j=(11 ) 中文在内存中占两个字节
但是只算是一个字符
10.C#中,string str = null 与 string str ="",请尽量用文字说明区别。(要点:说明详细的内存空间分配)
string str ="" 在栈中存取地址,在堆中存放对象的值
而String str=null;仅仅在内存栈中分配了空间
11.详述.NET里class和struct的异同!
class:放在属于引用类型,故其存放于内存的堆中
Struct属于值类型,其存放于栈中,作为参数传递的时候属于值传递
类与结构有很多相似之处:结构可以实现接口,并且可以具有与类相同的成员类型。然而,结构在几个重要方面不同于类:结构为值类型而不
是引用类型,并且结构不支持继承。结构的值存储在“在堆栈上”或“内联”。细心的程序员有时可以通过聪明地使用结构来增强性能。
12.概述.NET里对 remoting 和 webservice 两项技术的理解和实际中的应用。
其实现的原理并没有本质的区别,在应用开发层面上有以下区别:
1、Remoting可以灵活的定义其所基于的协议,如果定义为HTTP,则与Web Service就没有什么区别了,一般都喜欢定义为TCP,这样
比Web Service稍为高效一些
2、Remoting不是标准,而Web Service是标准;
3、Remoting一般需要通过一个WinForm或是Windows服务进行启动,而Web Service则需要IIS进行启动。
4、在VS.net开发环境中,专门对Web Service的调用进行了封装,用起来比Remoting方便
我建议还是采用Web Service好些,对于开发来说更容易控制
Remoting一般用在C/S的系统中,Web Service是用在B/S系统中
后者还是各语言的通用接口
相同之处就是都基于XML
为了能清楚地描述Web Service 和Remoting之间得区别,我打算从他们的体系结构上来说起:
Web Service大体上分为5个层次:
1. Http传输信道
2. XML的数据格式
3. SOAP封装格式
4. WSDL的描述方式
5. UDDI
总体上来讲,.NET 下的 Web Service结构比较简单,也比较容易理解和应用:
一般来讲在.NET结构下的WebService应用都是基于.net framework以及IIS的架构之下,所以部署(Dispose)起来相对比较容易点.
从实现的角度来讲,
首先WebService必须把暴露给客户端的方法所在的类继承于:System.Web.Services.WebService这个基类
其次所暴露的方法前面必须有[WebMethod]或者[WebMethodAttribute]
WebService的运行机理
首先客户端从服务器的到WebService的WSDL,同时在客户端声称一个代理类(Proxy Class)
这个代理类负责与WebService服务器进行Request 和Response
当一个数据(XML格式的)被封装成SOAP格式的数据流发送到服务器端的时候,就会生成一个进程对象并且把接收到这个Request的
SOAP包进行解析,然后对事物进行处理,处理结束以后再对这个计算结果进行SOAP包装,然后把这个包作为一个Response发送给客户
端的代理类(Proxy Class),同样地,这个代理类也对这个SOAP包进行解析处理,继而进行后续操作。
这就是WebService的一个运行过程。
下面对.net Remoting进行概括的阐述:
.net Remoting 是在DCOM等基础上发展起来的一种技术,它的主要目的是实现跨平台、跨语言、穿透企业防火墙,这也是他的基本特
点,与WebService有所不同的是,它支持HTTP以及TCP信道,而且它不仅能传输XML格式的SOAP包,也可以传输传统意义上的二进制流
,这使得它变得效率更高也更加灵活。而且它不依赖于IIS,用户可以自己开发(Development)并部署(Dispose)自己喜欢的宿主服务
器,所以从这些方面上来讲WebService其实上是.net Remoting的一种特例。
ASP.NET Web 服务基础结构通过将 SOAP 消息映射到方法调用,为 Web 服务提供了简单的 API。通过提供一种非常简单的编程模型(基于将 SOAP 消息交换映射到方法调用),它实现了此机制。ASP.NET Web 服务的客户端不需要了解用于创建它们的平台、对象模型或编程语言。而服务也不需要了解向它们发送消息的客户端。唯一的要求是:双方都要认可正在创建和使用的 SOAP 消息的格式,该格式是由使用 WSDL 和 XML 架构 (XSD) 表示的 Web 服务合约定义来定义的。
. NET Remoting 为分布式对象提供了一个基础结构。它使用既灵活又可扩展的管线向远程进程提供 .NET 的完全对象语义。ASP.NET Web 服务基于消息传递提供非常简单的编程模型,而 .NET Remoting 提供较为复杂的功能,包括支持通过值或引用传递对象、回调,以及多对象激活和生命周期管理策略等。要使用 .NET Remoting,客户端需要了解所有这些详细信息,简而言之,需要使用 .NET 建立客户端。.NET Remoting 管线还支持 SOAP 消息,但必须注意这并没有改变其对客户端的要求。如果 Remoting 端点提供 .NET 专用的对象语义,不管是否通过 SOAP,客户端必须理解它们。
13.什么是code-behind技术
对于每一个Aspx文件可以相对应一个CS文件类,aspx继承自对应的CodeBehind类,在编译时,CodeBhind类编译到webui工程对应的dll中,而aspx页面中的内含代码和aspx一起编译到temporary.dll中,被客户端浏览器访问。
14.概述三层结构体系
webUI层:封装基本的页面布局形式,即表示层
DataAccess(DAO)层:数据访问层,利用各种相关的技术,与底层数据库进行交互
Business层:业务逻辑层,封装整个程序的业务逻辑代码,主要与DAO层相关联
Model 层: 封装程序领域对象,该层可以在上面的三层之间进行很好的交互
这只是基本的三层架构设计,如果利用设计模式,则可以在此基础上进行灵活的变化
15.asp.net如何实现MVC模式,举例说明!
在Asp.net 中实现MVC模式,相对于 JAVA没有那么快捷,但是仍是可以实现的
且由于代码隐藏和事件驱动得引入,意义不时很大,具体的实现,可以利用HttpHandler,如此,则应在Web.config文件中配置相关的节点
//Author:renfuming
<httpHandlers>
<add verb="*" path="SendTopic.aspx" type="wyzBBS.Servers.SendRootHandler"/>
<add verb="*" path="SelectTopic.aspx" type="wyzBBS.Servers.SelectTopicHandler"/>
<add verb="*" path="Question.aspx" type="wyzBBS.Servers.QuestionHandler"/>
<add verb="POST,GET" path="ajaxpro
public partial class _Default : System.Web.UI.Page
{
private SqlConnection conn;
private SqlCommand comm;
private string connstring = ConfigurationManager.ConnectionStrings[1].ConnectionString;
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
bind();
}
}
//数据邦定
private void bind()
{
string sqlstr = "select * from teacher";
this.conn = new SqlConnection(connstring);
SqlDataAdapter adapter = new SqlDataAdapter(sqlstr, conn);
DataSet ds = new DataSet();
adapter.Fill(ds,"teacher");
this.GridView1.DataSource = ds;
GridView1.DataKeyNames = new string[] { "teaid" };//主建
this.GridView1.DataBind();
conn.Close();
}
//编辑数据信息
protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
{
this.GridView1.EditIndex = e.NewEditIndex;
bind();
}
//更新数据信息
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
try
{
this.conn = new SqlConnection(connstring);
string col1 = ((TextBox)(GridView1.Rows[e.RowIndex].Cells[2].Controls[0])).Text.ToString().Trim();//cell索引从1开始,这是从第二列开
始修改数据信息,主建不能修改
int col2 = int.Parse(((TextBox)(GridView1.Rows[e.RowIndex].Cells[3].Controls[0])).Text.ToString().Trim());
int id = int.Parse(this.GridView1.DataKeys[e.RowIndex].Value.ToString());
string sqlstr = "update teacher set teaname='" + col1 + "',teaage=" + col2 + " where teaid=" + id + "";
this.comm = new SqlCommand(sqlstr, conn);
conn.Open();
comm.ExecuteNonQuery();
conn.Close();
this.GridView1.EditIndex = -1;
bind();
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
}
//删除信息
protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
string sql = "delete from teacher where teaid='"+this.GridView1.DataKeys[e.RowIndex].Value.ToString()+"'";
this.conn = new SqlConnection(connstring);
this.comm = new SqlCommand(sql,conn);
this.conn.Open();
response.write("<script language='javascript'>return confirm('您真的要删除此纪录吗?');</script>");
this.comm.ExecuteNonQuery();
this.conn.Close();
bind();s
}
protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
{
this.GridView1.EditIndex = -1;
bind();
}
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
//如果是绑定数据行
if (e.Row.RowType == DataControlRowType.DataRow)
{
//鼠标经过时,行背景色变
e.Row.Attributes.Add("onmouseover", "this.style.backgroundColor='#E6F5FA'");
//鼠标移出时,行背景色变
e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor='#FFFFFF'");
}
}
protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
this.GridView1.PageIndex = e.NewPageIndex;
}
protected void GridView1_PageIndexChanged(object sender, EventArgs e)
{
bind();
}
//通过存储过程插入数据信息
protected void btnInsert_Click(object sender, EventArgs e)
{
SqlParameter[] para = new SqlParameter[] {
new SqlParameter("@name",TypeCode.String),new SqlParameter("@age",TypeCode.Int32)};
this.conn = new SqlConnection(connstring);
conn.Open();
this.comm = new SqlCommand("Myproc",conn);
this.comm.CommandType = CommandType.StoredProcedure;
para[0].Value = this.txtname.Text;
para[1].Value = int.Parse(this.txtage.Text.Trim());
this.comm.Parameters.AddRange(para);
this.comm.ExecuteNonQuery();
this.conn.Close();
bind();
}
}
111、请举例说明ref的基本用法
//Author:renfuming
//相当于传引用
public static void Userref(ref int i)
{
i += 100;
Console.WriteLine("使用ref后的结果是:"+i);
}
static void Main()
{
int i = 10;
Console.WriteLine("先前的值是:"+i);
Userref(ref i);
Console.WriteLine("使用函数后的值是:"+i);//如果不是用的ref,则此处的打印结果是10
}
112、请问在Asp.net中xml文件与xsl文件如何进行整合
//Author:renfuming
System.Xml.XmlDocument xmldoc = new System.Xml.XmlDocument();
xmldoc.Load(Server.MapPath("user.xml"));
System.Xml.Xsl.XslTransform xmltrans = new System.Xml.Xsl.XslTransform();
xmltrans.Load(Server.MapPath("user.xsl"));
Xml1.Document = xmldoc;
Xml1.Transform = xmltrans;
113、请用C#语言调用Oracle的存储过程
//Author:renfuming
Function GetList(keywords In varchar2
,p_info_list_Cursor out get_data_cur_type)
Return Number
As
Begin
open p_info_list_Cursor For
Select * from Test where Key=keywords;
Return 0;
End;
----------------
OracleConnection OracleConn = new OracleConnection(连接字符串);
OracleCommand cmd = new OracleCommand("GetList", OracleConn);
cmd.Parameters.AddRange(new OracleParameter[]
{
new OracleParameter("keyWords", OracleType.VarChar),
new OracleParameter("ReturnValue", OracleType.Number, 0, ParameterDirection.ReturnValue, true, 0, 0, "",DataRowVersion.Default, Convert.DBNull),
new OracleParameter("p_info_list_Cursor", OracleType.Cursor, 2000, ParameterDirection.Output, true, 0, 0, "",DataRowVersion.Default, Convert.DBNull)
});
cmd.Parameters[0].Value = 't07美女';
cmd.Parameters[0].Direction = ParameterDirection.Input;
cmd.CommandType = CommandType.StoredProcedure;
OracleConn.Open()
OracleDataReader rdr=cmd.ExecuteReader();
//其他代码
OracleConn.Close();
C#执行Oracle的参数过程,Sql 语句中使用":" 表示参数。
在Sql Server 中我们可以按以下方式使用SQL 语句: "Insert into Table (Field1,field2) values(@Value1,@Value2) ", 然后我们再New 几个Paramter: new SqlParameter("@Value1",value)...
在查询字符串中使用@+字符 来描述参数,在SqlParameter中的参数名也要使用"@"符号。
而在Oracle中Sql 语句不能使用@符号, 以冒号":"代替. 如:
------string Sql = "Insert into SEARCH_HISTORY(KEYWORDS,PHONE,RESULT_ID,SEARCH_TIME) values(:KEYWORDS,:PHONE,:RESULT_ID,:SEARCH_TIME)";
OracleCommand cmd = new OracleCommand(Sql, OracleConn);
cmd.Parameters.AddRange(new OracleParameter[]{
new OracleParameter("KEYWORDS",OracleType.VarChar),
new OracleParameter("PHONE",OracleType.VarChar),
new OracleParameter("RESULT_ID",OracleType.Number),
new OracleParameter("SEARCH_TIME",OracleType.DateTime)
});
cmd.Parameters[0].Value = Keywords;
cmd.Parameters[1].Value = Phone;
cmd.Parameters[2].Value=2;
cmd.Parameters[3].Value = DateTime.Now;
114、请简单介绍依赖注入在asp.net中的基本体现
所谓“依赖注入”,就是将应用程序所依赖的组件在运行的时候动态的加载到应用程序中间。依赖注入的目标并非为、应用程序添加更多的功能,而是提升了组件的重用性,并为应用程序搭建一个具有较强灵活性和扩展性的平台。在Asp.net中,程序的实现是如此实现的:Assembly.Load(AssemblyName).CreateInstance(TypeName(类名等)),如此可以在程序中得到一个要求的对象实例。在程序的实现过程中间,可以配合反射技术,达到更加灵活的变化。
115、任复明整理经典sql语句集:
(qq)、说明:删除数据库
drop database dbname
(qq)、说明:备份sql server
--- 创建 备份数据的 device
USE master
EXEC sp_addumpdevice 'disk', 'testBack', 'c:/mssql7backup/MyNwind_1.dat'
--- 开始 备份
BACKUP DATABASE pubs TO testBack
(qq)、说明:创建新表
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
根据已有的表创建新表:
A:create table tab_new like tab_old (使用旧表创建新表)
B:create table tab_new as select col1,col2… from tab_old definition only
(qq)、说明:删除新表
drop table tabname
(qq)、说明:增加一个列
Alter table tabname add column col type
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
(qq)、说明:添加主键: Alter table tabname add primary key(col)
(qq)、说明:删除主键: Alter table tabname drop primary key(col)
(qq)、说明:创建索引:create [unique] index idxname on tabname(col….)
删除索引:drop index idxname
注:索引是不可更改的,想更改必须删除重新建。
(qq)、说明:创建视图:create view viewname as select statement
删除视图:drop view viewname
(qq)、说明:几个高级查询运算词
A: UNION 运算符
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当
ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是
来自 TABLE2。
B: EXCEPT 运算符
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL
随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。
C: INTERSECT 运算符
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随
INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。
注:使用运算词的几个查询结果行必须是一致的。
(qq)、说明:使用外连接
A、left outer join:
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
B:right outer join:
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。
C:full outer join:
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。
(qq)、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)
法一:select * into b from a where 1<>1
法二:select top 0 * into b from a
说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)
insert into b(a, b, c) select d,e,f from b;
(qq)、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)
insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件
例子:..from b in '"&Server.MapPath(".")&"/data.mdb" &"' where..
(qq)、说明:子查询(表名1:a 表名2:b)
select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)
(qq)、说明:外连接查询(表名1:a 表名2:b)
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
(qq)、说明:在线视图查询(表名1:a )
select * from (SELECT a,b,c FROM a) T where t.a > 1;
(qq)、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括
select * from table1 where time between time1 and time2
select a,b,c, from table1 where a not between 数值1 and 数值2
(qq)、说明:in 的使用方法
select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)
(qq)、说明:两张关联表,删除主表中已经在副表中没有的信息
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )
(qq)、说明:四表联查问题:
select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d
where .....
(qq)、说明:日程安排提前五分钟提醒
SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5
(qq)、说明:一条sql 语句搞定数据库分页
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b
where b.主键字段 = a.主键字段 order by a.排序字段
(qq)、说明:前10条记录
select top 10 * form table1 where 范围
(qq)、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行
榜,每月热销产品分析,按科目成绩排名,等等.)
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)
(qq)、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表
(select a from tableA ) except (select a from tableB) except (select a from tableC)
(qq)、说明:随机取出10条数据
select top 10 * from tablename order by newid()
(qq)、说明:随机选择记录
select newid()
(qq)、说明:删除重复记录
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)
(qq)、说明:列出数据库里所有的表名
(qq)、select name from sysobjects where type='U'
(qq)、说明:列出表里的所有的
select name from syscolumns where id=object_id('TableName')
(qq)、22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中
的case
select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0
end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type
显示结果:
type vender pcs
电脑 A 1
电脑 A 1
光盘 B 2
光盘 A 2
手机 B 3
手机 C 3
(qq)、说明:初始化表table1
TRUNCATE TABLE table1
(qq)、说明:选择从10到15的记录
select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc
技巧
(qq)、1=1,1=2的使用,在SQL语句组合时用的较多
“where 1=1” 是表示选择全部 “where 1=2”全部不选,
如:
if @strWhere !=''
begin
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere
end
else
begin
set @strSQL = 'select count(*) as Total from [' + @tblName + ']'
end
我们可以直接写成
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere
(qq)、收缩数据库
--重建索引
DBCC REINDEX
DBCC INDEXDEFRAG
--收缩数据和日志
DBCC SHRINKDB
DBCC SHRINKFILE
(qq)、压缩数据库
dbcc shrinkdatabase(dbname)
(qq)、转移数据库给新用户以已存在用户权限
exec sp_change_users_login 'update_one','newname','oldname'
go
(qq)、检查备份集
RESTORE VERIFYONLY from disk='E:/dvbbs.bak'
(qq)、修复数据库
ALTER DATABASE [dvbbs] SET SINGLE_USER
GO
DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK
GO
ALTER DATABASE [dvbbs] SET MULTI_USER
GO
(qq)、说明:更改某个表
exec sp_changeobjectowner 'tablename','dbo'