仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 700|回复: 8
打印 上一主题 下一主题

[学习教程] MSSQL编程:ADO.NET最好理论(上)

[复制链接]
萌萌妈妈 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:28:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
mysql使用内部操作字符集gbk来进行操作,即执行"SELECT*FROMtestWHEREname=xxxor1=1/*LIMIT1";从而注入成功ado
概述:

本文在微软站点资本的基本上加工致理而成,意在先容在你的ADO.NET使用程序中实行和完成功能优化、不乱性和功效性方面供应最好的办理计划;同时也包括在ADO.NET中使用已有的数据工具举行开辟的最好理论和匡助你如何计划ADO.NET使用程序供应倡议。

本文包括以下内容:

1..NET框架中的dataproviders;

2.对比DataSet和DataReader,分离先容他们的最好用处;

3.怎样利用DataSet、Commands和Connections;

4.分离XML;

5.假如你是ADO程序员,也无妨看看ADO.NET与ADO的区分和接洽;

6.分离一些FAQ,更深一步会商ADO.NET概念和利用技能。

先容:

A..NET框架中的dataproviders

Dataproviders在使用程序和数据库之间饰演一个桥梁的脚色,它使得你能够从一个数据库前往查询了局、实行命令和对数据集的更新等。

B.几种dataprovider的先容

上面表格中数据标明各类dataprovider和最好合用数据库工具

供应者

形貌

SQLServer.NETDataProvider

在.NET框架中利用System.Data.SqlClient定名空间;

倡议在两头层使用程序中利用SQLServer7.0或今后版本;

倡议在自力的使用程序中利用MSDE或SQLServer7.0或更高版本;

SQLServer6.5或更早版本,必需利用OLEDB.NETDataProvider中的OLEDBProviderForSQLServer。

OLEDB.NETDataProvider

在.NET框架中利用System.Data.OleDb定名空间;

倡议在两头层使用程序中利用SQLServer6.5或之前版本,大概任安在.NET框架SDK中指出的撑持OLEDB接口清单的OLEDBProvider,OLEDB接口清单将在前面列出;

倡议在自力的使用程序中利用Access,两头层使用程序不倡议利用Access;

不再撑持为ODBC的OLEDBProvider,要会见ODBC,利用ODBC.NETDataProvider。

ODBC.NETDataProvider

在.NET框架中利用System.Data.Odbc定名空间;

供应对利用ODBC驱动毗连的数据库的会见;

.NETDataProviderForOracle

在.NET框架中利用System.Data.OracleClient定名空间;

供应对Oracle数据库的会见。

Custom.NETDataProvider

供应一套接口,让你能够自界说一个DataProvider;

SQLXMLManagedClasses

包括SQLXMLManagedClasses的最新版SQLXML3.0,使得你能够会见SQLServer2000或今后版本的XML功效性扩大,好比实行XML模板文件、实行XPath查询和利用Updategrams或Diffgrams更新数据等;在SQLXML3.0中存储历程和XML模板将会经由过程SOAP作为一种WEB服务。

表格中提到的OLEDB接口清单,在这里把它列出

OLEDB工具

接口

OLEDBServices

IdataInitilize

DataSource

IDBInitialize
IDBCreateSession
IDBProperties
IPersist
IDBInfo*

Session

ISessionProperties
IOpenRowset
IDBSchemaRowset*
ITransactionLocal*
IDBCreateCommand*

Command

IcommandText
ICommandProperties
ICommandWithParameters*
IAccessor(onlyrequiredifICommandWithParametersissupported)
ICommandPrepare*

MultipleResults

ImultipleResults

RowSet

Irowset
IAccessor
IColumnsInfo
IColumnsRowset*
IRowsetInfo(onlyrequiredifDBTYPE_HCHAPTERissupported)

Row

IRow*

Error

IerrorInfo
IErrorRecords
ISQLErrorInfo*

C.毗连SQLServer7.0或更高版本

利用SQLServer.NETDataProvider毗连SQLServer7.0或更高版本是最好的体例,在于它创建与SQLServer的间接毗连而两头不必要任何的手艺层跟尾。以下图一展现了各类会见SQLServer7.0或更高版本的手艺对照:



图一(毗连会见SQLServer7.0或更高版本的各类手艺对照)

以下例子演示如何创立和翻开一个到SQLServer7.0或更高版本数据库的毗连:

‘VisualBasic

DimnwindConnAsSqlConnection=NewSqlConnection("DataSource=localhost;IntegratedSecurity=SSPI;"&_"InitialCatalog=northwind")

nwindConn.Open()

‘C#

SqlConnectionnwindConn=newSqlConnection("DataSource=localhost;IntegratedSecurity=SSPI;"+

"InitialCatalog=northwind");

nwindConn.Open();

D.毗连ODBC数据源

ODBC.NETDataProvider,利用System.Data.Odbc定名空间,具有为SQLServer和OLEDB的.NETDataPorvider一样的布局,利用ODBC前缀(好比OdbcConnetion)和尺度的ODBC毗连字符。上面例子演示如何创立和翻开一个到ODBC数据源的毗连:

‘VisualBasic

DimnwindConnAsOdbcConnection=NewOdbcConnection("Driver={SQLServer};Server=localhost;"&_"Trusted_Connection=yes;Database=northwind")

nwindConn.Open()

‘C#

OdbcConnectionnwindConn=newOdbcConnection("Driver={SQLServer};Server=localhost;"+

"Trusted_Connection=yes;Database=northwind");

nwindConn.Open();

E.利用DataReaders、DataSets、DataAdapters和DataViews

ADO.NET利用DataSet和DataReader工具读取数据并存储。DataSet就比如是数据库的直系支属,具有数据库的一切表、按次和数据库的束缚(好比表间干系)。DataReader则从数据库读取疾速的、只进的的和只读的数据流。利用DataSet,你将会常常利用DataAdapter(大概CommandBuilder)与你的数据库打交道,同时,你大概会利用DataView往排序和过滤数据,DataSet还同意你能够创立一个承继于DataSet的子工具来体现数据中的表、行和列。上面图二显现DataSet工具模子:



图二(DataSet工具模子)

上面将要先容在甚么时分利用DataSet或DataReader最得当,同时也将申明怎样利用DataAdapter(包含CommandBuilder)和DataView最优化对数据的会见。

F.DataSet和DataReader的对照

在计划你的使用程序时决意事实利用DataSet仍是利用DataReader,次要看在你的使用程序中要完成的功效性级别。

利用DataSet能够在你的使用程序中做以下事变:

I.在多个团圆的了局表之间导航;

一个DataSet能够包括多个了局表,这些了局表是不一连的。你能够分隔处置这些表,也能够把这些表看成父子干系举行处置。

II.操纵多个数据源(好比从XML文件和电子数据表等不但一个数据库失掉的夹杂数据);

上面的例子演示从SQLServer2000的Northwind数据库读取一个customers表的清单和从Access2000的Northwind数据库读取一个orders表的清单,然后利用DataRelation在两个表之间创建一个对应干系:

‘VisualBasic

DimcustConnAsSqlConnection=NewSqlConnection("DataSource=localhost;IntegratedSecurity=SSPI;"&_

"InitialCatalog=northwind;")

DimcustDAAsSqlDataAdapter=NewSqlDataAdapter("SELECT*FROMCustomers",custConn)

DimorderConnAsOleDbConnection=NewOleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;"&_"DataSource=c:ProgramFilesMicrosoftOffice"&_"Officeamples
orthwind.mdb;")

DimorderDAAsOleDbDataAdapter=NewOleDbDataAdapter("SELECT*FROMOrders",orderConn)

custConn.Open()

orderConn.Open()

DimcustDSAsDataSet=NewDataSet()

custDA.Fill(custDS,"Customers")

orderDA.Fill(custDS,"Orders")

custConn.Close()

orderConn.Close()

DimcustOrderRelAsDataRelation=custDS.Relations.Add("CustOrders",_custDS.Tables("Customers").Columns("CustomerID"),_custDS.Tables("Orders").Columns("CustomerID"))

DimpRow,cRowAsDataRow

ForEachpRowIncustDS.Tables("Customers").Rows

Console.WriteLine(pRow("CustomerID").ToString())

ForEachcRowInpRow.GetChildRows(custOrderRel)

Console.WriteLine(vbTab&cRow("OrderID").ToString())

Next

Next

‘C#

SqlConnectioncustConn=newSqlConnection("DataSource=localhost;IntegratedSecurity=SSPI;InitialCatalog=northwind;");

SqlDataAdaptercustDA=newSqlDataAdapter("SELECT*FROMCustomers",custConn);

OleDbConnectionorderConn=newOleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;"+"DataSource=c:ProgramFilesMicrosoftOfficeOfficeamples
orthwind.mdb;");

OleDbDataAdapterorderDA=newOleDbDataAdapter("SELECT*FROMOrders",orderConn);

custConn.Open();

orderConn.Open();

DataSetcustDS=newDataSet();

custDA.Fill(custDS,"Customers");

orderDA.Fill(custDS,"Orders");

custConn.Close();

orderConn.Close();

DataRelationcustOrderRel=custDS.Relations.Add("CustOrders",custDS.Tables["Customers"].Columns["CustomerID"],custDS.Tables["Orders"].Columns["CustomerID"]);

foreach(DataRowpRowincustDS.Tables["Customers"].Rows)

{

Console.WriteLine(pRow["CustomerID"]);

foreach(DataRowcRowinpRow.GetChildRows(custOrderRel))

Console.WriteLine("        "+cRow["OrderID"]);

}

III.层中互换数据大概利用一个XMLWEB服务,与DataReader纷歧样的是DataSet能够被传送给一个远程的客户端;

上面的例子演示怎样创立一个XMLWEB服务,个中利用GetCustomers取数据库中customers表数据,利用UpdateCustomers更新数据库中数据:

1.‘VisualBasic

2.<%@WebServiceLanguage="VB"Class="Sample"%>

3.ImportsSystem

4.ImportsSystem.Data

5.ImportsSystem.Data.SqlClient

6.ImportsSystem.Web.Services

7.<WebService(Namespace:="http://microsoft.com/webservices/")>_

8.PublicClassSample

9.PublicnwindConnAsSqlConnection=NewSqlConnection("DataSource=localhost;IntegratedSecurity=SSPI;InitialCatalog=northwind")

10.<WebMethod(Description:="ReturnsNorthwindCustomers",EnableSession:=False)>_

11.PublicFunctionGetCustomers()AsDataSet

12.DimcustDAAsSqlDataAdapter=NewSqlDataAdapter("SELECTCustomerID,CompanyNameFROMCustomers",nwindConn)

13.DimcustDSAsDataSet=NewDataSet()

14.custDA.MissingSchemaAction=MissingSchemaAction.AddWithKey

15.custDA.Fill(custDS,"Customers")

16.GetCustomers=custDS

17.EndFunction

18.<WebMethod(Description:="UpdatesNorthwindCustomers",EnableSession:=False)>_

19.PublicFunctionUpdateCustomers(custDSAsDataSet)AsDataSet

20.DimcustDAAsSqlDataAdapter=NewSqlDataAdapter()

21.custDA.InsertCommand=NewSqlCommand("INSERTINTOCustomers(CustomerID,CompanyName)"&_"Values(@CustomerID,@CompanyName)",nwindConn)

22.custDA.InsertCommand.Parameters.Add("@CustomerID",SqlDbType.NChar,5,"CustomerID")

23.custDA.InsertCommand.Parameters.Add("@CompanyName",SqlDbType.NChar,15,"CompanyName")

24.custDA.UpdateCommand=NewSqlCommand("UPDATECustomersSetCustomerID=@CustomerID,"&_

25."CompanyName=@CompanyNameWHERECustomerID=@OldCustomerID",nwindConn)

26.custDA.UpdateCommand.Parameters.Add("@CustomerID",SqlDbType.NChar,5,"CustomerID")

27.custDA.UpdateCommand.Parameters.Add("@CompanyName",SqlDbType.NChar,15,"CompanyName")

28.DimmyParmAsSqlParameter=custDA.UpdateCommand.Parameters.Add("@OldCustomerID",SqlDbType.NChar,5,"CustomerID")

29.myParm.SourceVersion=DataRowVersion.Original

30.custDA.DeleteCommand=NewSqlCommand("DELETEFROMCustomersWHERECustomerID=@CustomerID",nwindConn)

31.myParm=custDA.DeleteCommand.Parameters.Add("@CustomerID",SqlDbType.NChar,5,"CustomerID")

32.myParm.SourceVersion=DataRowVersion.Original

33.custDA.Update(custDS,"Customers")

34.UpdateCustomers=custDS

35.EndFunction

36.EndClass

37.

38.‘C#

39.<%@WebServiceLanguage="C#"Class="Sample"%>

40.usingSystem;

41.usingSystem.Data;

42.usingSystem.Data.SqlClient;

43.usingSystem.Web.Services;

44.[WebService(Namespace="http://microsoft.com/webservices/")]

45.publicclassSample

46.{

47.publicSqlConnectionnwindConn=newSqlConnection("DataSource=localhost;IntegratedSecurity=SSPI;InitialCatalog=northwind");

48.[WebMethod(Description="ReturnsNorthwindCustomers",EnableSession=false)]

49.publicDataSetGetCustomers()

50.{

51.SqlDataAdaptercustDA=newSqlDataAdapter("SELECTCustomerID,CompanyNameFROMCustomers",nwindConn);

52.DataSetcustDS=newDataSet();

53.custDA.MissingSchemaAction=MissingSchemaAction.AddWithKey;

54.custDA.Fill(custDS,"Customers");

55.returncustDS;

56.}

57.[WebMethod(Description="UpdatesNorthwindCustomers",EnableSession=false)]

58.publicDataSetUpdateCustomers(DataSetcustDS)

59.{

60.SqlDataAdaptercustDA=newSqlDataAdapter();

61.custDA.InsertCommand=newSqlCommand("INSERTINTOCustomers(CustomerID,CompanyName)"+"Values(@CustomerID,@CompanyName)",nwindConn);

62.custDA.InsertCommand.Parameters.Add("@CustomerID",SqlDbType.NChar,5,"CustomerID");

63.custDA.InsertCommand.Parameters.Add("@CompanyName",SqlDbType.NChar,15,"CompanyName");

64.custDA.UpdateCommand=newSqlCommand("UPDATECustomersSetCustomerID=@CustomerID,"+"CompanyName=@CompanyNameWHERECustomerID=@OldCustomerID",nwindConn);

65.custDA.UpdateCommand.Parameters.Add("@CustomerID",SqlDbType.NChar,5,"CustomerID");

66.custDA.UpdateCommand.Parameters.Add("@CompanyName",SqlDbType.NChar,15,"CompanyName");

67.SqlParametermyParm=custDA.UpdateCommand.Parameters.Add("@OldCustomerID",SqlDbType.NChar,5,"CustomerID");

68.myParm.SourceVersion=DataRowVersion.Original;

69.custDA.DeleteCommand=newSqlCommand("DELETEFROMCustomersWHERECustomerID=@CustomerID",nwindConn);

70.myParm=custDA.DeleteCommand.Parameters.Add("@CustomerID",SqlDbType.NChar,5,"CustomerID");

71.myParm.SourceVersion=DataRowVersion.Original;

72.custDA.Update(custDS,"Customers");

73.returncustDS;

74.}

}

IV.数据的再利用(好比排序、搜刮或过滤数据);

V.实行每行的年夜容量数据处置,处置DataReader挂起的毗连服务已不再必要、影响功能的每行;

VI.利用诸如XSLT转换大概XPath查询等XML操纵的多重数据。

上面的例子先容怎样利用XmlDataDocument同步DataSet数据和怎样利用XSLT款式文件在HTML文件中包括DataSet数据,起首是XSLT款式文件:

<xsl:stylesheetxmlns:xsl="http://www.w3.org/1999/XSL/Transform"version="1.0">

<xsl:templatematch="CustomerOrders">

<HTML>

<STYLE>

BODY{font-family:verdana;font-size:9pt}

TD{font-size:8pt}

</STYLE>

<BODY>

<TABLEBORDER="1">

<xsl:apply-templatesselect="Customers"/>

</TABLE>

</BODY>

</HTML>

</xsl:template>

<xsl:templatematch="Customers">

<TR><TD>

<xsl:value-ofselect="ContactName"/>,<xsl:value-ofselect="Phone"/><BR/>

</TD></TR>

<xsl:apply-templatesselect="Orders"/>

</xsl:template>

<xsl:templatematch="Orders">

<TABLEBORDER="1">

<TR><TDvalign="top"><B>Order:</B></TD><TDvalign="top"><xsl:value-ofselect="OrderID"/></TD></TR>

<TR><TDvalign="top"><B>Date:</B></TD><TDvalign="top"><xsl:value-ofselect="OrderDate"/></TD></TR>

<TR><TDvalign="top"><B>ShipTo:</B></TD>

<TDvalign="top"><xsl:value-ofselect="ShipName"/><BR/>

<xsl:value-ofselect="ShipAddress"/><BR/>

<xsl:value-ofselect="ShipCity"/>,<xsl:value-ofselect="ShipRegion"/><xsl:value-ofselect="ShipPostalCode"/><BR/>

<xsl:value-ofselect="ShipCountry"/></TD></TR>

</TABLE>

</xsl:template>

</xsl:stylesheet>

接着上面的代码演示怎样添补DataSet的数据和使用XSLT款式:

‘VisualBasic

ImportsSystem

ImportsSystem.Data

ImportsSystem.Data.SqlClient

ImportsSystem.Xml

ImportsSystem.Xml.Xsl

PublicClassSample

PublicSharedSubMain()

DimnwindConnAsSqlConnection=NewSqlConnection("DataSource=localhost;InitialCatalog=northwind;IntegratedSecurity=SSPI")

nwindConn.Open()

DimmyDataSetAsDataSet=NewDataSet("CustomerOrders")

DimcustDAAsSqlDataAdapter=NewSqlDataAdapter("SELECT*FROMCustomers",nwindConn)

custDA.Fill(myDataSet,"Customers")

DimordersDAAsSqlDataAdapter=NewSqlDataAdapter("SELECT*FROMOrders",nwindConn)

ordersDA.Fill(myDataSet,"Orders")

nwindConn.Close()

myDataSet.Relations.Add("CustOrders",_myDataSet.Tables("Customers").Columns("CustomerID"),_myDataSet.Tables("Orders").Columns("CustomerID")).Nested=true

DimxmlDocAsXmlDataDocument=NewXmlDataDocument(myDataSet)

DimxslTranAsXslTransform=NewXslTransform

xslTran.Load("transform.xsl")

DimwriterAsXmlTextWriter=NewXmlTextWriter("xslt_output.html",System.Text.Encoding.UTF8)

xslTran.Transform(xmlDoc,Nothing,writer)

writer.Close()

EndSub

EndClass

‘C#

usingSystem;

usingSystem.Data;

usingSystem.Data.SqlClient;

usingSystem.Xml;

usingSystem.Xml.Xsl;

publicclassSample

{

publicstaticvoidMain()

{

SqlConnectionnwindConn=newSqlConnection("DataSource=localhost;InitialCatalog=northwind;IntegratedSecurity=SSPI;");

nwindConn.Open();

DataSetcustDS=newDataSet("CustomerDataSet");

SqlDataAdaptercustDA=newSqlDataAdapter("SELECT*FROMCustomers",nwindConn);

custDA.Fill(custDS,"Customers");

SqlDataAdapterordersDA=newSqlDataAdapter("SELECT*FROMOrders",nwindConn);

ordersDA.Fill(custDS,"Orders");

nwindConn.Close();

custDS.Relations.Add("CustOrders",

custDS.Tables["Customers"].Columns["CustomerID"],

custDS.Tables["Orders"].Columns["CustomerID"]).Nested=true;

XmlDataDocumentxmlDoc=newXmlDataDocument(custDS);

XslTransformxslTran=newXslTransform();

xslTran.Load("transform.xsl");

XmlTextWriterwriter=newXmlTextWriter("xslt_output.html",System.Text.Encoding.UTF8);

xslTran.Transform(xmlDoc,null,writer);

writer.Close();

}

}

ADO.NET最好理论(中)

http://www.csdn.net/Develop/read_article.asp?id=22663
恢复到之前的某个状态,是需要数据的。这数据可以是a)回滚步骤或者b)操作之前的数据状态原文。
小女巫 该用户已被删除
沙发
发表于 2015-1-19 13:52:29 来自手机 | 只看该作者
始终遗憾SQLServer的登陆无法分配CPU/内存占用等指标数。如果你的SQLServer给别人分配了一个只可以读几个表的权限,而这个家伙疯狂的死循环进行连接查询,会给你的系统带来很大的负担。
再见西城 该用户已被删除
板凳
发表于 2015-1-25 14:27:33 | 只看该作者
需要注意的一点,也是我使用过程中发现的一个问题。在建立function->schema->table后,如果在现有的分区表上建立没有显式声明的聚集索引时,分区表会自动变为非分区表。这一点很让我纳闷。
灵魂腐蚀 该用户已被删除
地板
发表于 2015-2-2 22:24:51 | 只看该作者
这是一个不错的新特性。虽然索引的附加字段没有索引键值效率高,但是相对映射到数据表中效率还是提高了很多。我做过试验,在我的实验环境中会比映射到表中提高30%左右的效率。
乐观 该用户已被删除
5#
发表于 2015-2-8 14:39:47 | 只看该作者
多走走一此相关论坛,多看一些实例开发,多交流0经验,没什么的,我也是刚学没多久!加油
莫相离 该用户已被删除
6#
发表于 2015-2-25 18:58:15 | 只看该作者
而SQLServer如果能像Oracle一样可以为登陆分配如:5%的cpu,10%的内存。就可以解决这个漏洞。
深爱那片海 该用户已被删除
7#
发表于 2015-3-8 01:54:49 | 只看该作者
having子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。
小魔女 该用户已被删除
8#
发表于 2015-3-15 20:25:15 | 只看该作者
这一点很好的加强了profiler的功能。但是提到profiler提醒大家注意一点。windows2003要安装sp1补丁才能启动profiler。否则点击没有反应。
飘飘悠悠 该用户已被删除
9#
发表于 2015-3-22 04:08:59 | 只看该作者
很多书籍啊,不过个人认为看书太慢,还不如自己学。多做实际的东西,就会遇到很多问题,网上搜下解决问题。不断重复这个过程,在配合sql的F1功能。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-22 23:25

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表