ASP.NET教程之总结:ADO.NET在开辟中的部分利用办法和...
也许C#刚上市的时候有些抄袭Java吧,但自从C#2.0上市之后,整个局面就扭转乾坤了,不但Java在模仿C#,而且他从来都没能跟得上C#的脚步。ado|技能怎样利用SqlDataAdapter来检索多个行以下代码分析了怎样利用SqlDataAdapter工具收回可天生DataSet或DataTable的命令。它从SQLServerNorthwind数据库中检索一组产物种别。
usingSystem.Data;usingSystem.Data.SqlClient;publicDataTableRetrieveRowsWithDataTable(){using(SqlConnectionconn=newSqlConnection(connectionString)){conn.Open();SqlCommandcmd=newSqlCommand("DATRetrieveProducts",conn);cmd.CommandType=CommandType.StoredProcedure;SqlDataAdapteradapter=newSqlDataAdapter(cmd);DataTabledataTable=newDataTable("Products");adapter.Fill(dataTable);returndataTable;}}利用SqlAdapter天生DataSet或DataTable
1.
创立一个SqlCommand工具以挪用该存储历程,并将其与一个SqlConnection工具(显现)或毗连字符串(不显现)相干联。
2.
创立一个新的SqlDataAdapter工具并将其与SqlCommand工具相干联。
3.
创立一个DataTable(也能够创立一个DataSet)工具。利用机关函数参数来定名DataTable。
4.
挪用SqlDataAdapter工具的Fill办法,用检索到的行添补DataSet或DataTable。
怎样利用SqlDataReader来检索多个行
以下代码片断分析了可检索多个行的SqlDataReader办法。
usingSystem.IO;usingSystem.Data;usingSystem.Data.SqlClient;publicSqlDataReaderRetrieveRowsWithDataReader(){SqlConnectionconn=newSqlConnection("server=(local);IntegratedSecurity=SSPI;database=northwind");SqlCommandcmd=newSqlCommand("DATRetrieveProducts",conn);cmd.CommandType=CommandType.StoredProcedure;try{conn.Open();//Generatethereader.CommandBehavior.CloseConnectioncausesthe//theconnectiontobeclosedwhenthereaderobjectisclosedreturn(cmd.ExecuteReader(CommandBehavior.CloseConnection));}catch{conn.Close();throw;}}//DisplaytheproductlistusingtheconsoleprivatevoidDisplayProducts(){SqlDataReaderreader=RetrieveRowsWithDataReader();try{while(reader.Read()){Console.WriteLine("{0}{1}{2}",reader.GetInt32(0).ToString(),reader.GetString(1));}}finally{reader.Close();//Alsoclosestheconnectionduetothe//CommandBehaviorenumusedwhengeneratingthereader}}利用SqlDataReader检索行
1.
创立一个用来实行存储历程的SqlCommand工具,并将其与一个SqlConnection工具相干联。
2.
翻开毗连。
3.
经由过程挪用SqlCommand工具的ExecuteReader办法创立一个SqlDataReader工具。
4.
要从流中读取数据,请挪用SqlDataReader工具的Read办法来检索行,并利用范例化会见器办法(如GetInt32和GetString办法)来检索列值。
5.
利用完读取器后,请挪用其Close办法。
怎样利用XmlReader检索多个行
可使用SqlCommand工具来天生XmlReader工具,后者可供应对XML数据的基于流的只进会见。命令(一般为存储历程)必需发生基于XML的了局集,关于SQLServer2000而言,该了局集一般包括一个带有无效FORXML子句的SELECT语句。以下代码片断分析了该办法:
publicvoidRetrieveAndDisplayRowsWithXmlReader(){using(SqlConnectionconn=newSqlConnection(connectionString)){;SqlCommandcmd=newSqlCommand("DATRetrieveProductsXML",conn);cmd.CommandType=CommandType.StoredProcedure;try{conn.Open();XmlTextReaderxreader=(XmlTextReader)cmd.ExecuteXmlReader();while(xreader.Read()){if(xreader.Name=="PRODUCTS"){stringstrOutput=xreader.GetAttribute("ProductID");strOutput+="";strOutput+=xreader.GetAttribute("ProductName");Console.WriteLine(strOutput);}}xreader.Close();//XmlTextReaderdoesnotsupportIDisposablesoitcantbe//usedwithinausingkeyword}}上述代码利用了以下存储历程:
CREATEPROCEDUREDATRetrieveProductsXMLASSELECT*FROMPRODUCTSFORXMLAUTOGO利用XmlReader检索XML数据
1.
创立一个SqlCommand工具来挪用可天生XML了局集的存储历程(比方,在SELECT语句中利用FORXML子句)。将该SqlCommand工具与某个毗连相干联。
2.
挪用SqlCommand工具的ExecuteXmlReader办法,而且将了局分派给只进XmlTextReader工具。当您不必要对前往的数据举行任何基于XML的考证时,这是应当利用的最快范例的XmlReader工具。
3.
利用XmlTextReader工具的Read办法来读取数据。
怎样利用存储历程输入参数来检索单个行
借助于定名的输入参数,能够挪用在单个行内前往检索到的数据项的存储历程。以下代码片断利用存储历程来检索Northwind数据库的Products表中包括的特定产物的产物称号和单价。
voidGetProductDetails(intProductID,outstringProductName,outdecimalUnitPrice){using(SqlConnectionconn=newSqlConnection("server=(local);IntegratedSecurity=SSPI;database=Northwind")){//SetupthecommandobjectusedtoexecutethestoredprocSqlCommandcmd=newSqlCommand("DATGetProductDetailsSPOutput",conn)cmd.CommandType=CommandType.StoredProcedure;//Establishstoredprocparameters.//@ProductIDintINPUT//@ProductNamenvarchar(40)OUTPUT//@UnitPricemoneyOUTPUT//MustexplicitlysetthedirectionofoutputparametersSqlParameterparamProdID=cmd.Parameters.Add("@ProductID",ProductID);paramProdID.Direction=ParameterDirection.Input;SqlParameterparamProdName=cmd.Parameters.Add("@ProductName",SqlDbType.VarChar,40);paramProdName.Direction=ParameterDirection.Output;SqlParameterparamUnitPrice=cmd.Parameters.Add("@UnitPrice",SqlDbType.Money);paramUnitPrice.Direction=ParameterDirection.Output;conn.Open();//UseExecuteNonQuerytorunthecommand.//Althoughnorowsarereturnedanymappedoutputparameters//(andpotentiallyreturnvalues)arepopulatedcmd.ExecuteNonQuery();//ReturnoutputparametersfromstoredprocProductName=paramProdName.Value.ToString();UnitPrice=(decimal)paramUnitPrice.Value;}}利用存储历程输入参数来检索单个行
1.
创立一个SqlCommand工具并将其与一个SqlConnection工具相干联。
2.
经由过程挪用SqlCommand的Parameters汇合的Add办法来设置存储历程参数。默许情形下,参数都被假定为输出参数,因而必需显式设置任何输入参数的偏向。
注一种优秀的习气做法是显式设置一切参数(包含输出参数)的偏向。
3.
翻开毗连。
4.
挪用SqlCommand工具的ExecuteNonQuery办法。这将添补输入参数(并大概添补前往值)。
5.
经由过程利用Value属性,从得当的SqlParameter工具中检索输入参数。
6.
封闭毗连。
上述代码片断挪用了以下存储历程。
CREATEPROCEDUREDATGetProductDetailsSPOutput@ProductIDint,@ProductNamenvarchar(40)OUTPUT,@UnitPricemoneyOUTPUTASSELECT@ProductName=ProductName,@UnitPrice=UnitPriceFROMProductsWHEREProductID=@ProductIDGO怎样利用SqlDataReader来检索单个行
可使用SqlDataReader工具来检索单个行,特别是能够从前往的数据流中检索必要的列值。以下代码片断对此举行了申明。
voidGetProductDetailsUsingReader(intProductID,outstringProductName,outdecimalUnitPrice){using(SqlConnectionconn=newSqlConnection("server=(local);IntegratedSecurity=SSPI;database=Northwind")){//SetupthecommandobjectusedtoexecutethestoredprocSqlCommandcmd=newSqlCommand("DATGetProductDetailsReader",conn);cmd.CommandType=CommandType.StoredProcedure;//Establishstoredprocparameters.//@ProductIDintINPUTSqlParameterparamProdID=cmd.Parameters.Add("@ProductID",ProductID);paramProdID.Direction=ParameterDirection.Input;conn.Open();using(SqlDataReaderreader=cmd.ExecuteReader()){if(reader.Read())//Advancetotheoneandonlyrow{//ReturnoutputparametersfromreturneddatastreamProductName=reader.GetString(0);UnitPrice=reader.GetDecimal(1);}}}}利用SqlDataReader工具来前往单个行
1.
创建SqlCommand工具。
2.
翻开毗连。
3.
挪用SqlDataReader工具的ExecuteReader办法。
4.
经由过程SqlDataReader工具的范例化会见器办法(在这里,为GetString和GetDecimal)来检索输入参数。
上述代码片断挪用了以下存储历程。
CREATEPROCEDUREDATGetProductDetailsReader@ProductIDintASSELECTProductName,UnitPriceFROMProductsWHEREProductID=@ProductIDGO怎样利用ExecuteScalar来检索单个项
ExecuteScalar办法专门合用于仅前往单个值的查询。假如查询前往多个列和/或行,ExecuteScalar将只前往第一行的第一列。
以下代码申明了怎样查找与特定产物ID绝对应的产物称号:
voidGetProductNameExecuteScalar(intProductID,outstringProductName){using(SqlConnectionconn=newSqlConnection("server=(local);IntegratedSecurity=SSPI;database=northwind")){SqlCommandcmd=newSqlCommand("LookupProductNameScalar",conn);cmd.CommandType=CommandType.StoredProcedure;cmd.Parameters.Add("@ProductID",ProductID);conn.Open();ProductName=(string)cmd.ExecuteScalar();}}利用ExecuteScalar来检索单个项
1.
创建一个SqlCommand工具来挪用存储历程。
2.
翻开毗连。
3.
挪用ExecuteScalar办法。注重,该办法前往一个工具范例。它包括检索到的第一列的值,而且必需转化为得当的范例。
4.
封闭毗连。
上述代码利用了以下存储历程:
CREATEPROCEDURELookupProductNameScalar@ProductIDintASSELECTTOP1ProductNameFROMProductsWHEREProductID=@ProductIDGO怎样利用存储历程输入或前往参数来检索单个项
可使用存储历程输入或前往参数来查找单个值。以下代码分析了输入参数的用法:
voidGetProductNameUsingSPOutput(intProductID,outstringProductName){using(SqlConnectionconn=newSqlConnection("server=(local);IntegratedSecurity=SSPI;database=northwind")){SqlCommandcmd=newSqlCommand("LookupProductNameSPOutput",conn);cmd.CommandType=CommandType.StoredProcedure;SqlParameterparamProdID=cmd.Parameters.Add("@ProductID",ProductID);ParamProdID.Direction=ParameterDirection.Input;SqlParameterparamPN=cmd.Parameters.Add("@ProductName",SqlDbType.VarChar,40);paramPN.Direction=ParameterDirection.Output;conn.Open();cmd.ExecuteNonQuery();ProductName=paramPN.Value.ToString();}}利用存储历程输入参数来检索单个值
1.
创建一个SqlCommand工具来挪用存储历程。
2.
经由过程将SqlParameters增加到SqlCommand的Parameters汇合中,设置任何输出参数和单个输入参数。
3.
翻开毗连。
4.
挪用SqlCommand工具的ExecuteNonQuery办法。
5.
封闭毗连。
6.
经由过程利用输入SqlParameter的Value属性来检索输入值。
上述代码利用了以下存储历程。
CREATEPROCEDURELookupProductNameSPOutput@ProductIDint,@ProductNamenvarchar(40)OUTPUTASSELECT@ProductName=ProductNameFROMProductsWHEREProductID=@ProductIDGO以下代码分析了怎样利用前往值来指明是不是存在特定行。从编码角度来看,这相似于利用存储历程输入参数,分歧的地方在于必需将SqlParameter偏向显式设置为ParameterDirection.ReturnValue。
boolCheckProduct(intProductID){using(SqlConnectionconn=newSqlConnection("server=(local);IntegratedSecurity=SSPI;database=northwind")){SqlCommandcmd=newSqlCommand("CheckProductSP",conn);cmd.CommandType=CommandType.StoredProcedure;cmd.Parameters.Add("@ProductID",ProductID);SqlParameterparamRet=cmd.Parameters.Add("@ProductExists",SqlDbType.Int);paramRet.Direction=ParameterDirection.ReturnValue;conn.Open();cmd.ExecuteNonQuery();}return(int)paramRet.Value==1;}经由过程利用存储历程前往值来反省是不是存在特定行
1.
创建一个SqlCommand工具来挪用存储历程。
2.
设置一个输出参数,该参数含有要会见的行的主键值。
3.
设置单个前往值参数。将一个SqlParameter工具增加到SqlCommand的Parameters汇合中,并将其偏向设置为ParameterDirection.ReturnValue。
4.
翻开毗连。
5.
挪用SqlCommand工具的ExecuteNonQuery办法。
6.
封闭毗连。
7.
经由过程利用前往值SqlParameter的Value属性来检索前往值。
上述代码利用了以下存储历程。
CREATEPROCEDURECheckProductSP@ProductIDintASIFEXISTS(SELECTProductIDFROMProductsWHEREProductID=@ProductID)return1ELSEreturn0GO怎样利用SqlDataReader来检索单个项
可使用SqlDataReader工具并经由过程挪用命令工具的ExecuteReader办法来猎取单个输入值。这请求编写略微多一点的代码,由于必需挪用SqlDataReaderRead办法,然后经由过程该读取器的会见器办法之一来检索必要的值。以下代码分析了SqlDataReader工具的用法。
boolCheckProductWithReader(intProductID){using(SqlConnectionconn=newSqlConnection("server=(local);IntegratedSecurity=SSPI;database=northwind")){SqlCommandcmd=newSqlCommand("CheckProductExistsWithCount",conn);cmd.CommandType=CommandType.StoredProcedure;cmd.Parameters.Add("@ProductID",ProductID);cmd.Parameters["@ProductID"].Direction=ParameterDirection.Input;conn.Open();using(SqlDataReaderreader=cmd.ExecuteReader(CommandBehavior.SingleResult)){if(reader.Read()){return(reader.GetInt32(0)>0);}returnfalse;}}上述代码接纳了以下存储历程。
CREATEPROCEDURECheckProductExistsWithCount@ProductIDintASSELECTCOUNT(*)FROMProductsWHEREProductID=@ProductIDGO怎样编写ADO.NET手动事件处置代码
以下代码显现了怎样充实使用SQLServer.NET数据供应程序所供应的事件处置撑持,经由过程事件来回护资金转帐操纵。该操纵在统一数据库中的两个帐户之间转移资金。
publicvoidTransferMoney(stringtoAccount,stringfromAccount,decimalamount){using(SqlConnectionconn=newSqlConnection("server=(local);IntegratedSecurity=SSPI;database=SimpleBank")){SqlCommandcmdCredit=newSqlCommand("Credit",conn);cmdCredit.CommandType=CommandType.StoredProcedure;cmdCredit.Parameters.Add(newSqlParameter("@AccountNo",toAccount));cmdCredit.Parameters.Add(newSqlParameter("@Amount",amount));SqlCommandcmdDebit=newSqlCommand("Debit",conn);cmdDebit.CommandType=CommandType.StoredProcedure;cmdDebit.Parameters.Add(newSqlParameter("@AccountNo",fromAccount));cmdDebit.Parameters.Add(newSqlParameter("@Amount",amount));conn.Open();//Startanewtransactionusing(SqlTransactiontrans=conn.BeginTransaction()){//AssociatethetwocommandobjectswiththesametransactioncmdCredit.Transaction=trans;cmdDebit.Transaction=trans;try{cmdCredit.ExecuteNonQuery();cmdDebit.ExecuteNonQuery();//Bothcommands(creditanddebit)weresuccessfultrans.Commit();}catch(Exceptionex){//transactionfailedtrans.Rollback();//logexceptiondetails...throwex;}}}}怎样利用Transact-SQL实行事件处置
以下存储历程分析了怎样在Transact-SQL存储历程外部实行事件性资金转帐操纵。
CREATEPROCEDUREMoneyTransfer@FromAccountchar(20),@ToAccountchar(20),@AmountmoneyASBEGINTRANSACTION--PERFORMDEBITOPERATIONUPDATEAccountsSETBalance=Balance-@AmountWHEREAccountNumber=@FromAccountIF@@RowCount=0BEGINRAISERROR(InvalidFromAccountNumber,11,1)GOTOABORTENDDECLARE@BalancemoneySELECT@Balance=BalanceFROMACCOUNTSWHEREAccountNumber=@FromAccountIF@BALANCE<0BEGINRAISERROR(Insufficientfunds,11,1)GOTOABORTEND--PERFORMCREDITOPERATIONUPDATEAccountsSETBalance=Balance+@AmountWHEREAccountNumber=@ToAccountIF@@RowCount=0BEGINRAISERROR(InvalidToAccountNumber,11,1)GOTOABORTENDCOMMITTRANSACTIONRETURN0ABORT:ROLLBACKTRANSACTIONGO该存储历程利用BEGINTRANSACTION、COMMITTRANSACTION和ROLLBACKTRANSACTION语句来手动把持该事件。
怎样编写事件性.NET类
以下示例代码显现了三个服务性.NET托管类,这些类经由设置以实行主动事件处置。每一个类都利用Transaction属性举行了讲明,该属性的值断定是不是应当启动新的事件流,大概该工具是不是应当共享其间接挪用方的事件流。这些组件协同事情来实行银行资金转帐义务。Transfer类被利用RequiresNew事件属性举行了设置,而Debit和Credit被利用Required举行了设置。了局,一切这三个工具在运转时都将共享统一事件。
usingSystem;usingSystem.EnterpriseServices;publicclassTransfer:ServicedComponent{publicvoidTransfer(stringtoAccount,stringfromAccount,decimalamount){try{//PerformthedebitoperationDebitdebit=newDebit();debit.DebitAccount(fromAccount,amount);//PerformthecreditoperationCreditcredit=newCredit();credit.CreditAccount(toAccount,amount);}catch(SqlExceptionsqlex){//Handleandlogexceptiondetails//WrapandpropagatetheexceptionthrownewTransferException("TransferFailure",sqlex);}}}publicclassCredit:ServicedComponent{publicvoidCreditAccount(stringaccount,decimalamount){try{using(SqlConnectionconn=newSqlConnection("Server=(local);IntegratedSecurity=SSPI";database="SimpleBank")){SqlCommandcmd=newSqlCommand("Credit",conn);cmd.CommandType=CommandType.StoredProcedure;cmd.Parameters.Add(newSqlParameter("@AccountNo",account));cmd.Parameters.Add(newSqlParameter("@Amount",amount));conn.Open();cmd.ExecuteNonQuery();}}}catch(SqlExceptionsqlex){//Logexceptiondetailsherethrow;//Propagateexception}}publicclassDebit:ServicedComponent{publicvoidDebitAccount(stringaccount,decimalamount){try{using(SqlConnectionconn=newSqlConnection("Server=(local);IntegratedSecurity=SSPI";database="SimpleBank")){SqlCommandcmd=newSqlCommand("Debit",conn);cmd.CommandType=CommandType.StoredProcedure;cmd.Parameters.Add(newSqlParameter("@AccountNo",account));cmd.Parameters.Add(newSqlParameter("@Amount",amount));conn.Open();cmd.ExecuteNonQuery();}}catch(SqlExceptionsqlex){//Logexceptiondetailsherethrow;//Propagateexceptionbacktocaller}}}中间码是基于一个虚拟机器。源代码是最高层的,理论上从源代码开始直接编译成本地码能提供最大优化的。而中间码只能是转译成本地码,效率上难免受到损耗。根据虚拟机器所设定的体系结构的特点,和本地机器的差异的多少。 它可通过内置的组件实现更强大的功能,如使用A-DO可以轻松地访问数据库。 可以看作是VC和Java的混合体吧,尽管MS自己讲C#内核中更多的象VC,但实际上我还是认为它和Java更象一些吧。首先它是面向对象的编程语言,而不是一种脚本,所以它具有面向对象编程语言的一切特性。 Servlet却在响应第一个请求的时候被载入,一旦Servlet被载入,便处于已执行状态。对于以后其他用户的请求,它并不打开进程,而是打开一个线程(Thread),将结果发送给客户。由于线程与线程之间可以通过生成自己的父线程(ParentThread)来实现资源共享,这样就减轻了服务器的负担,所以,JavaServlet可以用来做大规模的应用服务。 Servlet的形式和前面讲的CGI差不多,它是HTML代码和后台程序分开的。它们的启动原理也差不多,都是服务器接到客户端的请求后,进行应答。不同的是,CGI对每个客户请求都打开一个进程(Process)。 ASP.net的服务器,要求安装一个.net环境,当然我这里指的是windows系统,顺便点一下,.net只能放在windows环境里来运行。Asp.net1.1的就装Framework1.1,Asp.net2.0的就装Framework2.0。 Servlet却在响应第一个请求的时候被载入,一旦Servlet被载入,便处于已执行状态。对于以后其他用户的请求,它并不打开进程,而是打开一个线程(Thread),将结果发送给客户。由于线程与线程之间可以通过生成自己的父线程(ParentThread)来实现资源共享,这样就减轻了服务器的负担,所以,JavaServlet可以用来做大规模的应用服务。 同时也感谢博客园给我们这个平台,也感谢博客园的编辑们做成专题引来这么多高人指点。 ASP是把代码交给VBScript解释器或Jscript解释器来解释,当然速度没有编译过的程序快了。
页:
[1]