|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
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)操作之前的数据状态原文。 |
|