在 Visual Basic .NET 中使用存储过程(转载)

Billy Hollis 
2002年9月14日

从 MSDN Code Center 下载 StoredProcVB.NET.exe 示例文件(英文)。  

我们作者通常将软件分为两类 - 真实软件和演示软件。真实软件是在真实环境中使用的软件。演示软件用于阐释编程概念。

您在文章和书籍中看到的大部分代码都是演示软件。它必须比真实软件简单,否则读者将为那些与阐释的概念无关的细节而费神。但有时演示软件又过于极端。追求简单会忽略开发人员编写真实软件所需的细节。

最近我在数据访问方面就曾遇到这样一个问题。实际上,我见过的每个数据访问示例都使用 SQL 语句从关系数据库(例如,Microsoft SQL Server™)中读取或向其中写入。然而,在真实环境中,除了对有限的小型系统适用以外,这是很不可取的编程方法。结构合理的 n 层应用程序使用存储过程代替 SQL 语句进行数据访问。

存储过程在概念上类似于程序中的函数。它们获取输入参数,以黑盒模式运行并返回相应信息。与函数不同的是,存储过程由数据库引擎执行,而不是在程序中执行。也就是说,将信息输入到存储过程或从中输出信息都必须通过与数据库交互的技术来完成。在 Microsoft Visual Basic® 6.0 中,该技术就是传统的 ADO。在 Visual Basic .NET 中,我们可以使用 ADO.NET 完成该任务。

对于许多编程任务而言,Visual Basic .NET 使得通过存储过程访问数据比使用 Visual Basic 6.0 容易得多。其中有一些用来帮助该过程的向导,一旦您学会如何避免一些错误之后,即使使用 ADO.NET 从头编写这些逻辑也并不复杂。

本文介绍了一些在 ADO.NET 中使用存储过程的基本技巧,并从只读操作开始,一直到如何使用存储过程进行数据插入、删除和更新。

您无需精通存储过程的编写也可从本文受益。许多大型编程小组的开发人员需要使用他人编写的存储过程。我们的示例之一需要将存储过程插入到示例数据库中,但我们将逐步介绍这个任务。

ADO.NET 简介
本文假设您已经了解了 ADO.NET 的基础知识。如果您在工作中从未使用过 ADO.NET 中的 DataAdapter、DataSet 和 Command 对象,则应阅读一些介绍 ADO.NET 的文章,包括 Rocky 为本专栏撰写的名为  url.gif ADO.NET 与您 一文。

简而言之,DataSet 在 ADO.NET 中用作数据容器,并在与数据库断开连接时使用。DataSet 包含一个或多个 DataTable,每个 DataTable 都包含行集合。对于那些熟悉传统 ADO 环境的用户来说,DataTable 可被看作是断开连接的 Recordset。

DataAdapter 在连接到数据库时工作。单个 DataAdapter 的作用是使用数据库中的数据填充某个 DataTable,或将 DataTable 中的更改写回到数据库,或者二者兼而有之。

DataAdapter 要求 Command 对象执行各种数据库操作。Command 对象存放 SQL 语句或指定数据访问实现方法的存储过程名称。每个 DataAdapter 有四个属性,指定用于四种数据访问类型之一的命令对象。

SelectCommand:此 Command 对象用于从数据库中选择数据。 
UpdateCommand:此 Command 对象用于更新数据库中的现有记录。 
InsertCommand:此 Command 对象用于向数据库中插入新记录。 
DeleteCommand:此 Command 对象用于删除数据库中的现有记录。 
图 1 阐释了这些对象及其关系。

vbnet09102002-fig01.gif

图 1:用于访问存储过程的主要 ADO.NET 类以及它们之间的关系

到目前为止,您所看到的演示软件示例可能将其 Command 对象配置为使用 SQL 语句进行数据访问。实际上,某些示例可能完全跳过了 Command 对象的创建,这是因为 DataAdapter 的某个构造函数允许 Command 对象选择后台创建的数据。在使用存储过程之前,让我们运行这样一个示例进行比较。

本文中的所有示例都使用 SQL Server 附带的 Northwind 示例数据库。我们还使用专门为 SQL Server 创建的 ADO.NET 类,而不是普通的 OLE DB 类。为了便于访问这些 SQL Server 类,所有示例都需要在应用程序的代码顶部加上以下代码行:

Imports System.Data.SQLClient

现在,让我们看看不使用存储过程执行数据访问的第一个示例。在此示例中,我们将在 Northwind 数据库 Products 表中检索所有产品。创建一个新 Windows 应用程序,在出现的空白 Form1 上,放置一个按钮和一个 DataGrid。将 DataGrid 的 Anchor 属性设置为全部四个边,使之随表单的扩展而扩展。在按钮的 Click 事件中,放置以下代码:

Dim sConnectionString As String = _
    "server=localhost;uid=sa;pwd=;database=Northwind"
Dim sSQL As String = "SELECT * FROM Products"
Dim daGetProducts As New SqlDataAdapter(sSQL, sConnectionString)
Dim dsProducts As New DataSet()
daGetProducts.Fill(dsProducts, "Products")
DataGrid1.DataSource = dsProducts.Tables("Products")

根据计算机配置的不同,可能需要更改连接字符串。建立数据库连接后,其余代码应该可以正常运行。此演示软件说明了填入和使用 DataSet 的最简单方法。

请注意,代码并不创建 Connection 对象或 Command 对象。事实上,没有这些对象,ADO.NET 便无法工作,但它们是在后台创建并使用的。实例化 SqlDataAdapter 的代码行传入 SQL 字符串(用于配置后台 Command 对象)和连接字符串(用于配置后台 Connection 对象)。

我们可以将此代码更改为使用显式 Connection 和 Command 对象,以便稍稍远离演示软件。在表单上再放置一个按钮,并将以下代码放到 Click 事件中:

Dim sConnectionString As String = _
    "server=localhost;uid=sa;pwd=;database=Northwind"
Dim sSQL As String = "SELECT * FROM Products"

Dim cnNorthwind As New SqlConnection(sConnectionString)
Dim cmdProducts As New SqlCommand(sSQL, cnNorthwind)

Dim daGetProducts As New SqlDataAdapter(cmdProducts)
Dim dsProducts As New DataSet()
daGetProducts.Fill(dsProducts, "Products")
DataGrid1.DataSource = dsProducts.Tables("Products")

此代码通过显式创建 Connection 和 Command 对象,并将这些对象附加到 DataAdapter,说明了 DataAdapters 的常用性。通过在实例化 DataAdapter 时传入 cmdProducts,DataAdapter 的 SelectCommand 将自动设置。然后,可以立即使用 DataAdapter 访问数据库。

此代码的结果与前一示例中的结果相同。尽管它有点接近真实软件,但由于数据访问是通过 SQL 语句实现的,因此仍然属于演示软件。

使用简单存储过程获取数据
如何将此演示软件更改为使用存储过程?只需更改几行代码。在表单上再放置一个按钮,并将以下代码放到 Click 事件中:

Dim sConnectionString As String = _
    "server=localhost;uid=sa;pwd=;database=Northwind"
Dim cnNorthwind As New SqlConnection(sConnectionString)
Dim cmdProducts As New _
    SqlCommand("十件最贵的产品", cnNorthwind)
cmdProducts.CommandType = CommandType.StoredProcedure

Dim daGetProducts As New SqlDataAdapter(cmdProducts)
Dim dsProducts As New DataSet()
daGetProducts.Fill(dsProducts, "Products")
DataGrid1.DataSource = dsProducts.Tables("Products")

实例化 Command 对象时,此代码不使用 SQL 语句并替换为要使用的存储过程名称。此外,Command 对象的 CommandType 属性必须设置为 StoredProcedure。

此后的代码与上一个示例非常相似,但它返回不同的数据。存储过程查找十件最贵的产品,并只返回每个产品的名称和价格。

带输入参数的存储过程
此示例很简单,因为存储过程不需要任何输入参数。也就是说,查找十件最贵的产品不需要任何外部信息。无需外界帮助,存储过程即可完成此操作。然而,多数存储过程都需要输入参数来执行其功能。在下一个示例中,让我们看看如何向存储过程传递输入参数。我们将使用 CustomerID 来获取相关客户的所有订单,并使用名为 CustOrderHist 的存储过程(已存在于 Northwind 数据库中)。

在已使用的表单上再创建一个按钮,并将以下代码行放到按钮的 Click 事件后面:

Dim sConnectionString As String = _
    "server=localhost;uid=sa;pwd=;database=Northwind"
Dim cnNorthwind As New SqlConnection(sConnectionString)
Dim cmdOrders As New SqlCommand("CustOrderHist", cnNorthwind)
cmdOrders.CommandType = CommandType.StoredProcedure
' 为存储过程设置参数 
Dim prmCustomerID As New SqlParameter()
prmCustomerID.ParameterName = "@CustomerID"
prmCustomerID.SqlDbType = SqlDbType.VarChar
prmCustomerID.Size = 5
prmCustomerID.Value = "ALFKI"

cmdOrders.Parameters.Add(prmCustomerID)

Dim daGetOrders As New SqlDataAdapter(cmdOrders)
Dim dsOrders As New DataSet()
daGetOrders.Fill(dsOrders, "Orders")
DataGrid1.DataSource = dsOrders.Tables("Orders")

此代码与上一个示例中的代码非常相似,不同之处在于创建 Command 对象之后,为其配置了 Parameter 对象并将此对象添加到 Command 的参数集合中。在此示例中(更接近于演示软件)将对客户 ID 进行硬编码,参数的 Value 属性通常会设置为某些用户输入数据。但是,参数的其他属性可以完全象此示例中那样设置。

此示例中的所有参数设置都是显式设置。某些开发人员喜欢这种样式,因为它便于说明。但某些开发人员喜欢使用代码行较少的等价方法:

Dim sConnectionString As String = _
    "server=localhost;uid=sa;pwd=;database=Northwind"
Dim cnNorthwind As New SqlConnection(sConnectionString)
Dim cmdOrders As New SqlCommand("CustOrderHist", cnNorthwind)
cmdOrders.CommandType = CommandType.StoredProcedure

cmdOrders.Parameters.Add(New _ 
    SqlParameter("@CustomerID", SqlDbType.VarChar, 5))
cmdOrders.Parameters("@CustomerID").Value = "ALFKI"

Dim daGetOrders As New SqlDataAdapter(cmdOrders)
Dim dsOrders As New DataSet()
daGetOrders.Fill(dsOrders, "Orders")
DataGrid1.DataSource = dsOrders.Tables("Orders")

此代码与上一示例的作用完全相同。但每个参数只需要两行代码,而不是六行。如果存储过程包含大量参数(如后面某些示例所示),所需代码行的多少就会有明显区别,因此在后面部分,我们将使用此表单。

使用存储过程更新数据库
以上示例使用存储过程从数据库中提取信息。在复杂应用程序中使用存储过程更新、插入和删除记录也很常见。让我们看看如何使用 ADO.NET 完成该操作。

在第一个示例中,我们将使用 Visual Studio® .NET 中的向导编写一个存储过程集合,并创建使用这些过程的代码。尽管我们只需在此示例中编写最少量的代码,但检查向导创建的代码有助于我们理解除获取数据以外,有关与存储过程交互操作的过程。

在此示例中,我们将使用 Northwind 示例数据库中的 Customers 表。安装后的 Northwind 数据库中不包含用于更新、插入或删除客户的存储过程,但 Visual Studio .NET 中的 DataAdapter Configuration Wizard(数据适配器配置向导)可轻松地为我们编写一些存储过程。

启动新的 Windows Application(Windows 应用程序)项目。在空白的 Form1 上,放置一个 DataGrid 和两个按钮。和先前一样,更改 DataGrid 的 Anchor 属性使之锚定到全部四个边。将按钮命名为 btnFill 和 btnUpdate,并分别将其 Text 属性更改为 Fill 和 Update。

转到 Toolbox(工具箱)的 Data(数据)选项卡,将 SqlDataAdapter 控件拖动到窗体上,然后释放鼠标。这将启动 DataAdapter Configuration Wizard(数据适配器配置向导)。单击 Next(下一步)按钮开始向向导中输入信息。

首先,需要选择一个到 Northwind 数据库的连接;如果列表中未显示所需连接,则单击 New Connection(新建连接)按钮创建一个连接。然后单击 Next(下一步)按钮。

下一屏幕上将出现三种数据访问方法。其外观与图 2 类似。

vbnet09102002-fig02.gif

图 2:选择用于 DataAdapter 的数据访问类型

此时,多数演示软件示例选择第一个选项来使用 SQL 语句。但是,我们将使用第二个选项,并让向导为我们生成一些存储过程。选择 Create new stored procedures(创建新存储过程)选项,然后单击 Next(下一步)按钮。

下一屏幕将请求 SQL 语句,指示最初从数据库中提取的数据。但并不直接使用此 SQL 语句。SQL 语句中的信息将用于构造存储过程,以便执行实际数据访问。为使示例简单起见,请输入 SQL 语句 SELECT * FROM Customers,然后按 Next(下一步)按钮。

此时,向导会请求要创建的存储过程的名称。操作共有四种 - Select、Update、Insert 和 Delete 操作。按以下方法对其命名:

Select:MSDNSelectCustomers 
Update:MSDNUpdateCustomer 
Insert:MSDNInsertCustomer 
Delete:MSDNDeleteCustomer 
选择 Yes, create them in the database for me(是的,在数据库中创建它们。)选项。此时,向导屏幕应该如图 3 所示。


vbnet09102002-fig03.gif
图 3:命名要由 DataAdapter 向导创建的存储过程

单击 Next(下一步)按钮。向导将创建存储过程并在状态栏屏幕上指示其进度。完成后,可单击 Finish(完成)按钮退出向导。

向导创建了配置完整的 DataAdapter,但未创建 DataSet 来存放数据。这是我们下一步要做的。在 Toolbox(工具框)的 Data(数据)选项卡中,拖动 DataSet 控件。出现配置屏幕时,选择 Untyped dataset(无类型的数据集)。

现在我们准备使用 DataAdapter 填充数据集。在 btnFill 的 Click 事件中,放入以下两行代码:

SqlDataAdapter1.Fill(DataSet1, "Customers")
DataGrid1.DataSource = DataSet1.Tables("Customers")

在 btnUpdate 的 Click 事件中,放入以下代码行:

SqlDataAdapter1.Update(DataSet1, "Customers")

现在我们有了一段使用存储过程进行数据访问的有效演示软件。可以运行程序并单击 Fill 按钮获取网格中的客户列表。然后,可在窗格中编辑客户记录并选择 Update 按钮将更改放回到数据库中。

注意:编辑第一列(即 CustomerID)时将出现异常,因为在 SQL Server 中不能更新数据库记录中的主键。
查看由向导生成的代码会有所帮助,所有这些代码最初都隐藏在 Windows Form Designer generated code(Windows 窗体设计器生成的代码)区域中。单击该区域的加号可展开代码。注意以下代码,它对所需的 SQLDataAdapter 和四个命令对象进行了实例化:

Me.SqlDataAdapter1 = New System.Data.SqlClient.SqlDataAdapter()
Me.SqlSelectCommand1 = New System.Data.SqlClient.SqlCommand()
Me.SqlInsertCommand1 = New System.Data.SqlClient.SqlCommand()
Me.SqlUpdateCommand1 = New System.Data.SqlClient.SqlCommand()
Me.SqlDeleteCommand1 = New System.Data.SqlClient.SqlCommand()

此后的代码配置每个命令对象并为其创建参数集合。此代码与上一个示例相似,它们都使用带参数的存储过程。但向导生成的代码使用参数的某些附加属性,以使其与更改数据的存储过程协同工作。例如,用于创建 SQLInsertCommand1 的 CompanyName 参数的代码:

Me.SqlInsertCommand1.Parameters.Add(New _
    System.Data.SqlClient.SqlParameter("@CompanyName", _
    System.Data.SqlDbType.NVarChar, 40, "CompanyName"))

在上一个示例中,我们只为参数名称、数据类型和长度等设置了属性。此代码还会将参数的 SourceColumn 属性设置为值 CompanyName。该属性指示 DataSet 的 Customers DataTable 中与此参数对应的字段。这使 DataTable 中的值在插入操作期间自动插入到参数的 Value 属性中。让我们来详细介绍一下。

调用 SQLDataAdapter 的 Update 方法时,该方法将更新 DataSet 中的单个 DataTable。当逐行检查 DataTable 时,会查找需要更新、插入或删除的行。当找到需要插入到数据库中的行后,SQLDataAdapter 将使用由其 InsertCommand 属性设置的 Command 对象。这种情况下,Command 对象将访问 MSDNInsertCustomer 存储过程。

在该存储过程运行前,每个参数的 Value 属性都必须从插入的行中导入。配置 SQLDataAdapter1 的代码将存储过程的每个参数与 DataTable 中的相应字段相关联。这样,新 DataTable 行中的数据将自动传输到存储过程的参数。

其他存储过程参数的配置方法与此相似。但有一个不同之处值得注意。其他存储过程传入 DataTable 中数据的原始值,这些值用于检查数据是否在您不知情的情况下发生了更改。也就是说,如果您提取了某些数据,而其他人在您尝试更新前更改了该数据,您将收到并发异常。启动以上程序、提取客户,然后使用工具(例如 SQL Enterprise Manager)更改记录中的内容,便可以看到这种情况的发生。如果您在示例程序中更改同一记录并尝试进行更新,则会收到并发异常。

从存储过程返回值
以上示例有一个不足之处。Northwind Customers 表使用数字字母形式的主键,并且必须由插入数据的应用程序生成。也就是说,如果使用以上程序插入新记录,则必须为 CustomerID 自行创建由五个字符组成的值。

在真实软件中,为新记录自动生成主键更为常见。主键通常是按顺序分配的长整数。

为新记录设置主键有两种基本技术。应用程序可调用生成下一个可用 ID 的存储过程,然后将此 ID 直接放到 DataSet 的新行中。或者,用于插入记录的存储过程可以为记录派生新 ID,然后将其作为返回值传递回应用程序。

第一种技术需要一点额外的逻辑来获取新 ID 并将其放到新记录的相应位置。使用存储过程执行插入操作与以上示例类似。

但第二种技术要求在存储过程中使用一种新型参数。到目前为止我们见到的所有参数都是默认类型,即输入参数。实际上参数分四种类型:

Input 此参数只用于将信息从应用程序传输到存储过程。 
InputOutput 此参数可将信息从应用程序传输到存储过程,并将信息从存储过程传输回应用程序。 
Output 此参数只用于将信息从存储过程传输回应用程序。 
ReturnValue 此参数表示存储过程的返回值。SQL Server 的存储过程参数列表中不显示该参数。它只与存储过程的 RETURN 语句中的值相关联。 

存储过程为主键生成新值后,通常使用存储过程中的 RETURN 语句返回该值,因此用来访问该值的参数类型是 ReturnValue 参数。

ReturnValue 参数与其他类型的参数有一个重要的区别。通常,在 ADO.NET 中为 Command 对象配置的参数的顺序并不重要。参数名称只用来与存储过程中相应的参数相匹配。但是,对于 ReturnValue 参数,它必须是列表中的第一个参数。

也就是说,为 Command 对象配置 ReturnValue 参数时,必须首先在代码中配置该参数,这样它才能获取集合中的第一个数字索引。如果先配置任何其他参数,ReturnValue 参数将不能正常工作。

为了说明带返回值的存储过程的用法,我们编写一个在 Northwind Products 表中插入记录的示例。此表被设置为使用 Identity 列自动创建新产品 ID。遗憾的是,Northwind 示例数据库不包含执行所需操作的存储过程,所以在完成示例其余部分之前,我们需要向数据库插入一个这样的存储过程。

转到 Visual Studio .NET 中的 Server Explorer(服务器资源管理器)。打开 SQL Server 的节点,打开 SQL Server 实例的节点,然后打开 Northwind 数据库的节点。

右键单击 Stored Procedures(存储过程)节点,选择 New Stored Procedure(新建存储过程)。在出现的编辑窗口中,用以下文本替换其中的所有文本:

ALTER PROCEDURE dbo.MSDNInsertProduct
(
   @ProductName nvarchar(40),
   @SupplierID int,
   @CategoryID int,
   @QuantityPerUnit nvarchar(20),
   @UnitPrice money,
   @UnitsInStock smallint,
   @UnitsOnOrder smallint,
   @ReorderLevel smallint,
   @Discontinued bit
)
AS
   declare @ProductID int

   SET NOCOUNT OFF;
INSERT INTO Products(ProductName, SupplierID, CategoryID, QuantityPerUnit, 
UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued) VALUES 
(@ProductName, @SupplierID, @CategoryID, @QuantityPerUnit, @UnitPrice, 
@UnitsInStock, @UnitsOnOrder, @ReorderLevel, @Discontinued);
   SELECT @ProductID = @@IDENTITY

RETURN @ProductID

现在关闭编辑窗口,当系统询问您是否要保存更改时,单击 Yes(是)。现在存储过程就已保存到数据库中,并被命名为 MSDNInsertProduct。

现在便可以编写代码来使用此存储过程。新建 Windows 应用程序,在空白 Form1 上,放置锚定到所有四个边的 DataGrid,还需添加名为 btnFill 和 btnInsertProduct 的两个按钮。将 btnFill 的 Text 属性设置为 Fill,将 btnInsertProduct 的 Text 属性设置为 Insert Product。

在 btnFill 的 Click 事件中,放置以下代码:

Dim sConnectionString As String = _
    "server=localhost;uid=sa;pwd=;database=Northwind"
Dim sSQL As String = "SELECT * FROM Products"
Dim daGetProducts As New SqlDataAdapter(sSQL, sConnectionString)
Dim dsProducts As New DataSet()
daGetProducts.Fill(dsProducts, "Products")
DataGrid1.DataSource = dsProducts

它与本文前面所讲的代码大致相同,所以我们不再赘述。不要忘记必要时更改连接字符串,并在项目代码的顶部为 SQLClient 命名空间放置 Imports 语句。然后在 btnInsertProduct 的 Click 事件中放置以下代码:

Dim sConnectionString As String = _
    "server=localhost;uid=sa;pwd=;database=Northwind"
Dim cnNorthwind As New SqlConnection(sConnectionString)
Dim cmdInsertProduct As New SqlCommand("MSDNInsertProduct", cnNorthwind)
cmdInsertProduct.CommandType = CommandType.StoredProcedure
' 为存储过程设置参数 
cmdInsertProduct.Parameters.Add(New SqlParameter("@RETURN_VALUE", SqlDbType.Int, 4, "ProductID"))
cmdInsertProduct.Parameters("@RETURN_VALUE").Direction = ParameterDirection.ReturnValue

cmdInsertProduct.Parameters.Add(New SqlParameter("@ProductName", _
    SqlDbType.NVarChar, 40, "ProductName"))
cmdInsertProduct.Parameters.Add(New SqlParameter("@SupplierID", _
    SqlDbType.Int, 4, "SupplierID"))
cmdInsertProduct.Parameters.Add(New SqlParameter("@CategoryID", _
    SqlDbType.Int, 4, "CategoryID"))
cmdInsertProduct.Parameters.Add(New SqlParameter("@QuantityPerUnit", _
    SqlDbType.NVarChar, 20, "QuantityPerUnit"))
cmdInsertProduct.Parameters.Add(New SqlParameter("@UnitPrice", _
    SqlDbType.Money, 8, "UnitPrice"))
cmdInsertProduct.Parameters.Add(New SqlParameter("@UnitsInStock", _
    SqlDbType.SmallInt, 2, "UnitsInStock"))
cmdInsertProduct.Parameters.Add(New SqlParameter("@UnitsOnOrder", _
    SqlDbType.SmallInt, 2, "UnitsOnOrder"))
cmdInsertProduct.Parameters.Add(New SqlParameter("@ReorderLevel", _
    SqlDbType.SmallInt, 2, "ReorderLevel"))
cmdInsertProduct.Parameters.Add(New SqlParameter("@Discontinued", _
    SqlDbType.Bit, 1, "Discontinued"))

Dim daInsertProduct As New SqlDataAdapter()
daInsertProduct.InsertCommand = cmdInsertProduct
Dim dsProducts As DataSet = CType(DataGrid1.DataSource, DataSet)

Dim drNewProduct As DataRow
drNewProduct = dsProducts.Tables("Products").NewRow
drNewProduct.Item("ProductName") = "Billy's Sesame Oil"
drNewProduct.Item("SupplierID") = 4
drNewProduct.Item("CategoryID") = 7
drNewProduct.Item("QuantityPerUnit") = "6 10oz bottles"
drNewProduct.Item("UnitPrice") = 69
drNewProduct.Item("UnitsInStock") = 12
drNewProduct.Item("UnitsOnOrder") = 0
drNewProduct.Item("ReorderLevel") = 6
drNewProduct.Item("Discontinued") = False
dsProducts.Tables("Products").Rows.Add(drNewProduct)

daInsertProduct.Update(dsProducts.Tables("Products"))

MsgBox(drNewProduct.Item("ProductID"))

此代码与如上所示的代码类似,只是为返回值配置参数的代码行不同。请注意,它是第一个参数,并被设置为将返回值放回到 ProductID 字段中。

用于向数据集中插入新行的代码是标准 ADO.NET 代码,所以我们就不再赘述。它为产品记录创建一行新的适当结构(使用产品 DataTable 的 NewRow 方法),然后将数据放入行中,最后向产品 DataTable 的 Rows 集合中添加行。

现在运行程序进行测试。单击 Fill 按钮,但不对网格中的数据进行任何更改。然后按 Insert Product 按钮。将插入 Billy's Sesame Oil 的新产品记录,并且出现的消息框会通知您为其返回的 ProductID。还可以打开网格中的 Products 表,滚动到底部,并看到已添加了新行。

使用 Server Explorer(服务器资源管理器)编写参数代码
以上代码编写起来既冗长又繁琐。但是,DataAdapter Configuration Wizard(数据适配器配置向导)提示可以使用 Visual Studio 为我们编写此代码。DataAdapter Configuration Wizard(数据适配器配置向导)为完整配置所需的四个存储过程(分别是 Select、Update、Insert 和 Delete)生成了代码。假设您象以上示例一样只需要一个存储过程的代码,可以将其截短。要获得只与一个存储过程通信的预先编写好的代码,只需展开 Server Explorer(服务器资源管理器)以显示需要访问的存储过程,然后将该存储过程拖到设计界面上。将看到为该存储过程创建的 DataAdapter 和 Command 对象,代码的设计器部分包含为该存储过程配置参数所需的所有代码。可以按原样使用该代码,也可以根据需要复制并调整后使用。

小结
本文中的示例仍是演示软件,但至少足以向您说明如何访问存储过程,以便您开始编写自己的真实软件。当然,您需要了解要访问的存储过程,并且可能需要向数据库管理员 (DBA) 或其他组员咨询以获取该信息。

对于复杂系统,存储过程有许多优势。希望您在本文中学到了足够的知识,可以不必担心如何开始使用它们。第一次尝试编写代码时,您可能希望使用 DataAdapter Wizard(DataAdapter 向导)或 Server Explorer(服务器资源管理器)。但如果您能在必要时自行编写访问代码,则可以更有效地使用存储过程。

转载于:https://www.cnblogs.com/Carlwave/archive/2006/03/06/343916.html

已标记关键词 清除标记
第I部分 语言结构和环境 第1章 visual studio 2010 3 1.1 visual studio 2010:从express到ultimate的各种版本 4 1.2 visual basic的关键字和语法 7 1.2.1 控制台应用程序 10 1.2.2 从项目模板上创建项目 11 1.2.3 solution explorer窗口 13 1.2.4 项目属性 14 1.2.5 assembly information屏幕 15 1.2.6 编译设置 16 1.2.7 调试属性 20 1.2.8 引用 21 1.2.9 资源 23 1.2.10 设置 24 1.2.11 其他项目属性选项卡 26 1.3 provb_vs2010项目 27 1.3.1 在代码设置窗体属性 29 1.3.2 visual studio的其他组件 37 1.4 增强示例应用程序的功能 37 1.4.1 定制代码 39 1.4.2 构建应用程序 43 1.4.3 重用第一个windows窗体 50 1.5 visual studio 2010的特色功能 51 1.5.1 构建配置 51 1.5.2 任务列表 53 1.5.3 command窗口 54 1.5.4 server explorer 54 1.5.5 在visual studio 2010记录和使用宏 55 1.5.6 类图 57 1.5.7 应用程序生命周期管理 58 1.5.8 性能工具 60 1.6 小结 62 第2章 对象和visual basic 63 2.1 面向对象的术语 64 2.1.1 对象、类和实例 64 2.1.2 对象的组成 65 2.1.3 system.object 68 2.2 使用visual basic类型 68 2.2.1 值类型和引用类型 69 2.2.2 基本类型 71 2.3 命令:条件语句 72 2.3.1 if then 73 2.3.2 比较运算符 73 2.3.3 select case 75 2.4 值类型(结构) 75 2.4.1 布尔类型 76 2.4.2 整数类型 77 2.4.3 无符号类型 78 2.4.4 小数类型 78 2.4.5 char和byte类型 81 2.4.6 datetime类型 81 2.5 引用类型(类) 82 2.5.1 object类 82 2.5.2 string类 83 2.5.3 xml字面量 87 2.5.4 dbnull类和isdbnull()函数 89 2.6 参数传递 89 2.7 变量的作用域 91 2.8 使用对象 92 2.8.1 对象的声明和实例化 92 2.8.2 对象引用 93 2.8.3 取消对象的引用 93 2.8.4 前期绑定与后期绑定 94 2.9 数据类型转换 95 2.10 创建类 100 2.10.1 类 100 2.10.2 事件的处理 110 2.10.3 处理多个事件 111 2.10.4 withevents关键字 111 2.10.5 触发事件 111 2.10.6 声明和触发定制事件 112 2.10.7 用withevents关键字接收事件 113 2.10.8 用addhandler接收事件 115 2.10.9 构造函数方法 116 2.10.10 终止和清除 117 2.11 高级概念 118 2.11.1 重载方法 119 2.11.2 重载构造函数方法 121 2.11.3 共享方法、变量和事件 122 2.11.4 运算符重载 127 2.11.5 委托 129 2.11.6 类和组件 133 2.11.7 lambda表达式 134 2.12 小结 135 第3章 定制对象 137 3.1 继承 138 3.1.1 继承的实现 139 3.1.2 继承的层次 157 3.1.3 与基类、类及对象交互 159 3.1.4 构造函数 164 3.1.5 protected作用域 169 3.1.6 事件与继承 171 3.1.7 共享方法 174 3.1.8 共享事件 176 3.1.9 创建抽象基类 176 3.2 多接口 178 3.2.1 对象接口 178 3.2.2 辅助接口 180 3.3 抽象性 185 3.4 封装性 188 3.5 多态性 190 3.5.1 方法签名 190 3.5.2 实现多态性 191 3.6 进一步讨论继承 200 3.7 小结 211 第4章 公共语言运行库 213 4.1 .net应用程序的组成元素 214 4.1.1 模块 214 4.1.2 程序集 215 4.1.3 类型 215 4.2 版本化与部署 216 4.2.1 对版本化更好的支持 216 4.2.2 major.minor.build.revision版本介绍 217 4.2.3 更好的部署 217 4.3 跨语言集成 218 4.3.1 通用类型系统 218 4.3.2 元数据 219 4.3.3 对元数据更好的支持 219 4.3.4 属性 220 4.3.5 reflection api 222 4.4 il反汇编程序 222 4.5 内存管理 223 4.5.1 传统的垃圾回收机制 223 4.5.2 更快地为对象分配内存 230 4.5.3 垃圾回收器的优化 231 4.6 名称空间 232 4.6.1 名称空间的概念 233 4.6.2 名称空间与引用 236 4.6.3 常用的名称空间 237 4.6.4 导入名称空间并指定别名 239 4.6.5 为名称空间指定别名 240 4.6.6 在asp.net引用名称空间 241 4.7 创建自己的名称空间 241 4.8 my关键字 244 4.8.1 my.application名称空间 244 4.8.2 my.computer名称空间 248 4.8.3 my.forms名称空间 251 4.8.4 my.resources名称空间 251 4.8.5 my.user名称空间 251 4.8.6 my.webservices名称空间 251 4.9 扩展my名称空间 252 4.10 小结 254 第5章 用visual basic进行声明式编程 255 5.1 声明式编程与visual basic 256 5.2 使用xaml创建窗口 257 5.3 xaml语法 260 5.3.1 xaml语言基础 261 5.3.2 使用xaml声明工作流 264 5.4 小结 265 第6章 异常处理和调试 267 6.1 visual studio 2010 team system的新增内容:历史调试 267 6.2 与visual basic 6兼容的注意事项 268 6.3 .net的异常处理 268 6.4 结构化异常处理的关键字 269 6.4.1 try、catch和finally关键字 270 6.4.2 throw关键字 271 6.4.3 抛出新的异常 272 6.4.4 exit try语句 273 6.4.5 嵌套的try结构 274 6.4.6 异常属性的使用 275 6.4.7 message属性 276 6.4.8 innerexception和targetsite属性 276 6.5 与visual basic 6样式的错误处理交互操作 280 6.6 记录错误 281 6.6.1 事件日志 281 6.6.2 事件、方法和属性 282 6.6.3 写入跟踪文件 284 6.7 小结 286 第7章 测试驱动的开发 287 7.1 测试的内容和方式 288 7.2 visual studio的tdd工具 290 7.3 单元测试过程 291 7.3.1 创建测试程序 291 7.3.2 运行测试程序 294 7.3.3 测试数据访问代码 295 7.3.4 使用generate from usage特性 302 7.4 其他visual studio版本 306 7.5 第三方测试框架 306 7.6 小结 307 第ii部分 业务对象和数据访问第8章 数组、集合和泛型 311 8.1 数组 312 8.1.1 多维数组 313 8.1.2 ubound函数 314 8.1.3 redim语句 314 8.1.4 preserve关键字 315 8.2 集合 315 8.2.1 循环语句 317 8.2.2 装箱 319 8.3 泛型 320 8.3.1 泛型的使用 321 8.3.2 nullable类型 322 8.3.3 泛型类型 323 8.3.4 泛型方法 326 8.4 创建泛型 327 8.4.1 泛型类型 328 8.4.2 泛型方法 334 8.4.3 约束 335 8.4.4 泛型和后期绑定 338 8.4.5 协变和逆变 339 8.5 小结 340 第9章 在vb使用xml 341 9.1 xml简介 342 9.2 xml序列化 343 9.3 system.xml文档支持 348 9.4 xml流样式分析程序 348 9.4.1 写入xml流 349 9.4.2 读取xml流 352 9.4.3 文档对象模型(dom) 360 9.5 xslt转换 364 9.5.1 使用xslt转换不同的xml标准 367 9.5.2 system.xml.xsl定义的其他类和接口 370 9.6 asp.net的xml 370 9.6.1 xmldatasource服务器控件 370 9.6.2 xmldatasource控件的名称空间问题 374 9.6.3 xml服务器控件 375 9.7 linq to xml 376 9.8 linq to xml帮助对象 376 9.8.1 xdocument对象 377 9.8.2 xelement对象 377 9.8.3 xnamespace对象 378 9.8.4 xattribute对象 380 9.9 visual basic和xml字面量 381 9.10 使用linq查询xml文档 382 9.10.1 查询静态的xml文档 382 9.10.2 查询动态的xml文档 384 9.11 处理xml文档 385 9.11.1 读取xml文档 385 9.11.2 写入xml文档 386 9.12 vb的lambda表达式 387 9.13 小结 389 第10章 ado.net和linq 391 10.1 ado.net的体系结构 392 10.2 ado.net的基本功能 393 10.2.1 ado.net的常见任务 393 10.2.2 ado.net的基本名称空间和类 398 10.2.3 ado.net组件 399 10.3 .net数据提供程序 400 10.3.1 connection对象 400 10.3.2 command对象 401 10.3.3 通过command对象使用存储过程 402 10.3.4 datareader对象 405 10.3.5 命令的异步执行 407 10.3.6 dataadapter对象 409 10.3.7 sql server .net数据提供程序 413 10.3.8 ole db .net数据提供程序 413 10.4 dataset组件 413 10.4.1 datatablecollection对象 414 10.4.2 datarelationcollection对象 414 10.4.3 extendedproperties属性 414 10.4.4 创建和使用dataset对象 415 10.4.5 ado.net的datatable对象 417 10.4.6 dataset和datatable对象的高级ado.net特性 418 10.5 使用通用提供程序模型 420 10.6 ado.net的连接池 422 10.7 transactions类和system.transactions名称空间 423 10.7.1 创建事务 423 10.7.2 创建资源管理器 425 10.8 linq to sql 425 10.9 linq to sql和visual basic 426 10.9.1 用linq to sql提取数据:创建控制台应用程序 426 10.9.2 o/r设计器 427 10.9.3 创建product对象 428 10.10 对象到linq对象的映射 429 10.10.1 datacontext对象 430 10.10.2 table(tentity)对象 432 10.11 查询数据库 433 10.11.1 使用查询表达式 433 10.11.2 查询表达式详述 433 10.11.3 用表达式过滤 434 10.11.4 联接 434 10.11.5 数据项的组合 435 10.12 存储过程 437 10.13 更新数据库 438 10.14 小结 440 第11章 使用entity framework访问数据 441 11.1 对象关系映射 441 11.2 entity framework体系结构 442 11.2.1 概念模型 443 11.2.2 存储模型 446 11.2.3 映射模型 447 11.2.4 linq to entities 448 11.2.5 objectcontext 449 11.3 把对象映射到实体上 451 11.3.1 简单映射 451 11.3.2 对多个对象使用一个表 453 11.3.3 对一个对象使用多个表 455 11.4 从模型生成数据库 457 11.5 小结 460 第12章 使用sql server 461 12.1 sql server compact 462 12.1.1 连接sql server compactedition数据库 463 12.1.2 同步数据 466 12.2 sql server内置的xml功能 472 12.3 sql server的clr集成 474 12.3.1 决定使用t-sql还是vb 475 12.3.2 创建用户定义的类型 475 12.3.3 创建存储过程 487 12.3.4 在sql server使用web服务 493 12.3.5 sql server 2008特性 498 12.4 wcf数据服务 499 12.4.1 rest 499 12.4.2 atom和json 499 12.4.3 使用wcf数据服务提供数据 500 12.4.4 wcf数据服务的客户端库 504 12.5 小结 508 第13章 服务(xml/wcf) 509 13.1 服务 510 13.1.1 网络角度 510 13.1.2 应用程序的发展 510 13.1.3 合并网络和应用程序开发 510 13.1.4 web服务基础 511 13.1.5 存在的问题 512 13.1.6 其他技术 512 13.1.7 web服务 513 13.1.8 组合起来 514 13.1.9 wcf服务的构成 514 13.2 向soa迈出一大步 515 13.2.1 wcf的功能 516 13.2.2 协定和元数据 516 13.2.3 使用ws-*协议 517 13.3 建立wcf服务 518 13.4 建立wcf使用者应用程序 524 13.4.1 添加服务引用 525 13.4.2 查看引用 526 13.4.3 配置文件的修改 529 13.4.4 编写使用者应用程序的代码 531 13.5 使用数据协定 533 13.6 名称空间 535 13.6.1 建立主机应用程序 535 13.6.2 建立使用者应用程序 536 13.6.3 查看hellocustomerservice的wsdl和架构 538 13.7 小结 540 第iii部分 智能客户端应用程序第14章 windows窗体 543 14.1 system.windows.forms名称空间 543 14.2 窗体的使用 544 14.2.1 设置启动窗体 544 14.2.2 通过sub main显示窗体 545 14.2.3 application类的更多内容 545 14.2.4 窗体的启动位置 545 14.2.5 窗体边框 545 14.2.6 始终置顶——topmost属性 546 14.2.7 附属窗体 546 14.2.8 改变窗体的透明度 547 14.2.9 可视化继承 549 14.2.10 滚动窗体 549 14.2.11 mdi窗体 549 14.2.12 vb 2010的mdi样例 550 14.2.13 对话框窗体 551 14.2.14 运行时的窗体 553 14.2.15 默认的窗体实例 554 14.3 控件 554 14.3.1 以tab键切换控件的顺序 554 14.3.2 所有控件的属性 555 14.3.3 动态调整控件的大小和布局 555 14.3.4 flowlayoutpanel控件 557 14.3.5 tablelayoutpanel控件 558 14.3.6 panel和groupbox容器控件 559 14.3.7 扩展的provider控件 560 14.3.8 数据输入的高级功能 562 14.3.9 验证数据输入 564 14.3.10 工具栏与toolstrip控件 565 14.3.11 菜单 568 14.3.12 通用对话框 569 14.3.13 拖放操作 571 14.3.14 标准windows窗体控件小结 573 14.3.15 处理相关控件组 575 14.3.16 在运行时添加控件 576 14.4 其他编程技巧 577 14.5 小结 577 第15章 windows窗体的高级功能 579 15.1 在可视化控件封装逻辑 579 15.2 在windows窗体开发自定义的控件 580 15.2.1 继承现有的控件 580 15.2.2 构建复合控件 580 15.2.3 从头编写控件 581 15.3 继承现有的控件 581 15.3.1 基本步骤 581 15.3.2 给派生的控件添加代码 581 15.3.3 其他有用的特性 584 15.3.4 为派生的控件自定义事件 585 15.3.5 限制选项数的checkedlistbox 586 15.4 control与usercontrol基类 589 15.4.1 control类 589 15.4.2 usercontrol类 589 15.5 复合控件 590 15.5.1 创建复合的user-control 591 15.5.2 改变控件的大小 591 15.5.3 提供子控件的属性 592 15.5.4 一个具体的例子 592 15.6 从头构建控件 595 15.7 给工具箱的控件添加图标 600 15.8 在控件嵌入其他控件 601 15.9 小结 602 第16章 集成wpf和windows 窗体的用户控件 605 16.1 集成库 606 16.2 在windows窗体包含wpf控件 607 16.2.1 创建wpf控件库 608 16.2.2 windows窗体应用程序 610 16.3 在wpf包含windows 窗体控件 616 16.4 集成的限制 621 16.5 小结 622 第17章 wpf桌面应用程序 623 17.1 内容、位置、原因、方式——wpf策略 624 17.2 光栅图形和矢量图形 625 17.3 下一个windows项目应使用wpf吗 625 17.4 创建wpf应用程序 626 17.4.1 实现定制的wpf应用程序 627 17.4.2 定制用户界面 639 17.4.3 定制按钮 647 17.4.4 wpf用户控件 651 17.5 小结 672 第18章 expression blend 3 675 18.1 了解blend 676 18.2 sketchflow 682 18.2.1 第一个sketchflow 682 18.2.2 sketchflow player 685 18.2.3 归档sketchflow 686 18.3 小结 686 第19章 silverlight 687 19.1 什么是silverlight 687 19.1.1 smooth streaming特性 688 19.1.2 业界标准视频 688 19.1.3 数字版权管理 688 19.2 启动silverlight项目 688 19.2.1 silverlight应用程序 689 19.2.2 silverlight导航应用程序 689 19.2.3 silverlight类库 690 19.3 silverlight解决方案 691 19.3.1 web应用程序 691 19.3.2 应用程序库缓存 691 19.3.3 silverlight应用程序 692 19.4 控件 695 19.5 给silverlight项目添加项 702 19.5.1 silverlight用户控件 703 19.5.2 silverlight应用程序类 703 19.5.3 silverlight页面 703 19.5.4 silverlight子窗口 703 19.5.5 silverlight模板控件 703 19.5.6 silverlight资源字典 704 19.6 浏览器之外的silverlight 704 19.7 小结 705 第iv部分 internet应用程序技术 第20章 silverlight和服务 709 20.1 服务和silverlight 709 20.1.1 asmx web服务 709 20.1.2 wcf服务 712 20.1.3 ado.net数据服务 716 20.2 model-view-viewmodel 725 20.2.1 分割 725 20.2.2 model 725 20.2.3 view 728 20.2.4 viewmodel 729 20.3 小结 729 第21章 使用asp.net 731 21.1 asp.net的历史 731 21.2 asp.net的重要特性 732 21.2.1 开发效率 732 21.2.2 性能和可伸缩性 732 21.2.3 本地化 732 21.2.4 健康监控 733 21.2.5 易于访问数据 733 21.2.6 管理和维护 733 21.3 visual studio对asp.net 的支持 733 21.3.1 web site和web application项目 733 21.3.2 asp.net应用程序文件夹 734 21.3.3 web服务器选项 735 21.4 用web窗体构建asp.net应用程序 735 21.5 数据驱动的应用程序 746 21.5.1 使用sqldatasource控件绑定数据 746 21.5.2 使用linqdatasource控件绑定数据 754 21.5.3 使用objectdastasource控件绑定数据 757 21.6 小结 759 第22章 asp.net的高级功能 761 22.1 母版页 761 22.1.1 创建母版页 762 22.1.2 创建内容页 765 22.1.3 为母版页提供默认内容 767 22.2 导航 767 22.2.1 使用sitemappath服务器控件 769 22.2.2 menu服务器控件 770 22.3 使用asp.net的提供程序模型 771 22.4 成员和角色管理 776 22.5 配置文件属性 781 22.6 microsoft ajax(asp.net ajax) 783 22.6.1 理解对ajax的需求 783 22.6.2 microsoft ajax 的实现 784 22.6.3 updatepanel控件和客户端服务调用 785 22.6.4 示例项目 785 22.6.5 添加updatepanel控件 789 22.6.6 使用客户端服务调用和客户端模板 790 22.7 小结 795 第23章 asp.net mvc 797 23.1 mvc和asp.net 798 23.2 构建asp.net mvc应用程序 798 23.2.1 创建项目 798 23.2.2 控制器和操作 800 23.2.3 添加模型 802 23.2.4 视图 804 23.2.5 路由 807 23.2.6 搭框架和crud操作 808 23.2.7 验证 815 23.3 小结 817 第24章 sharepoint 2010开发 819 24.1 简介 819 24.1.1 sharepoint foundation 2010 820 24.1.2 sharepoint server 2010 820 24.1.3 sharepoint的术语 820 24.1.4 sharepoint开发环境 821 24.2 feature和solution framework 821 24.2.1 feature 821 24.2.2 solution framework 829 24.3 用于sharepoint开发的visual studio工具 833 24.4 sharepoint 2010对象模型 839 24.4.1 服务器对象模型 840 24.4.2 客户端对象模型 843 24.5 构建web 部件 845 24.6 小结 851 第v部分 库和专业主题技术 第25章 visual studio tools foroffice 855 25.1 vsto的各个版本 856 25.1.1 office的自动化功能和vsto 856 25.1.2 免pia部署 856 25.1.3 vsto项目类型 857 25.2 office业务应用程序的体系结构 858 25.3 使用vba和vsto 859 25.4 创建文档模板(word) 864 25.4.1 给文档添加内容 866 25.4.2 添加ribbon和操作窗格 867 25.4.3 激活操作窗格 870 25.4.4 更新内容控件 872 25.5 创建office插件(excel) 875 25.6 outlook form regions 881 25.7 小结 889 第26章 windows workflow foundation 891 26.1 应用程序的工作流 891 26.2 建立工作流 892 26.2.1 用windows workflowfoundation添加工作流 892 26.2.2 一个简单的工作流 894 26.2.3 标准活动 897 26.2.4 一个不太简单的工作流 899 26.2.5 建立定制活动 907 26.2.6 动态加载工作流 911 26.3 重新构建工作流设计器 912 26.4 小结 915 第27章 本地化 917 27.1 文化和区域 917 27.1.1 理解文化类型 918 27.1.2 线程 919 27.1.3 在asp.net声明全局文化 921 27.1.4 在asp.net使用文化设置 922 27.2 转换数值和操作 923 27.2.1 理解日期之间的区别 923 27.2.2 理解数字和货币的区别 925 27.2.3 理解排序字符串的区别 927 27.3 asp.net资源文件 929 27.3.1 使用本地资源 929 27.3.2 全局资源 933 27.4 windows窗体的资源文件 935 27.5 小结 938 第28章 与com的交互操作 939 28.1 理解com 940 28.2 com和.net的交互 940 28.2.1 传统的组件 941 28.2.2 .net应用程序 942 28.2.3 调试 945 28.2.4 直接使用tlbimp 945 28.2.5 后期绑定 946 28.3 activex控件 950 28.3.1 传统的activex控件 950 28.3.2 另一个.net应用程序 952 28.3.3 再次调试 954 28.4 在com应用程序使用.net组件 954 28.4.1 .net组件 954 28.4.2 regasm 956 28.4.3 tlbexp 957 28.5 p/invoke 957 28.6 小结 957 第29章 网络编程 959 29.1 协议、地址和端口 959 29.1.1 地址与计算机名 961 29.1.2 端口:指定应用程序 961 29.1.3 防火墙:不离不弃 962 29.2 system.net名称空间 963 29.2.1 web请求与响应 963 29.2.2 使用webclient简化常用的web请求 969 29.3 套接字 970 29.3.1 构建应用程序 971 29.3.2 创建conversation窗口 973 29.3.3 发送消息 980 29.3.4 关闭应用程序 984 29.4 在应用程序使用internetexplorer 988 29.5 小结 991 第30章 应用程序服务 993 30.1 给应用程序服务使用iis 993 30.2 windows服务 993 30.3 windows服务的特性 994 30.4 与windows服务交互 995 30.5 创建windows服务 996 30.5.1 用于windows服务的.net framework类 996 30.5.2 其他类型的windows服务 998 30.6 在vb创建windows服务 998 30.7 创建文件监视器服务 1000 30.7.1 创建windows服务的解决方案 1000 30.7.2 给服务添加.net组件 1000 30.7.3 安装服务 1003 30.7.4 启动服务 1004 30.7.5 卸载服务 1005 30.8 与服务通信 1005 30.8.1 servicecontroller类 1006 30.8.2 把servicecontroller集成到例子 1007 30.8.3 servicecontroller的更多内容 1008 30.9 定制命令 1008 30.10 给服务传递字符串 1010 30.11 调试服务 1010 30.12 小结 1012 第31章 程序集和反射 1013 31.1 程序集 1013 31.2 清单 1014 31.2.1 程序集标识部分 1016 31.2.2 引用的程序集 1018 31.3 程序集与部署 1018 31.3.1 应用程序私有的程序集 1018 31.3.2 共享程序集 1019 31.4 版本化问题 1020 31.4.1 应用程序隔离 1020 31.4.2 并行执行 1020 31.4.3 自描述 1021 31.4.4 版本策略 1021 31.4.5 配置文件 1022 31.5 反射基础 1025 31.5.1 assembly类 1026 31.5.2 获得当前加载的程序集 1026 31.5.3 type类 1027 31.6 程序集的动态加载 1028 31.6.1 assembly类的loadfrom方法 1028 31.6.2 动态加载示例 1029 31.6.3 传入程序集 1030 31.7 小结 1031 第32章 .net framework的安全性 1033 32.1 安全的概念与定义 1034 32.2 system.security.permissions名称空间的权限 1035 32.2.1 代码访问权限 1037 32.2.2 身份权限 1038 32.2.3 基于角色的权限 1038 32.3 管理代码访问权限集合 1041 32.4 用户访问控制 1043 32.5 定义应用程序的uac设置 1043 32.5.1 安全性工具 1045 32.5.2 使用securityexception类处理异常 1046 32.6 加密基础 1047 32.7 小结 1060 第33章 使用任务和线程进行并行编程 1061 33.1 启动并行任务 1061 33.1.1 system.threading.tasks.parallel类 1062 33.1.2 parallel.invoke 1062 33.2 把串行代码转换为并行代码 1066 33.2.1 检测热点 1067 33.2.2 测试并行执行获得的速度提升 1069 33.2.3 理解并行和并发执行 1070 33.3 并行循环 1071 33.3.1 parallel.for 1071 33.3.2 parallel.foreach 1076 33.3.3 退出并行循环 1081 33.4 指定希望的并行度 1086 33.4.1 paralleloptions 1086 33.4.2 理解硬件线程和逻辑核心 1087 33.5 创建和管理任务 1088 33.5.1 system.threading.tasks.task 1089 33.5.2 理解任务的生命周期 1090 33.5.3 使用任务并行化代码 1091 33.5.4 从任务返回值 1099 33.5.5 为并发和并行准备代码 1102 33.5.6 理解并发集合特性 1103 33.5.7 把linq转换为plinq 1106 33.6 小结 1108 第34章 部署 1109 34.1 应用程序部署 1110 34.1.1 .net的部署很简单 1110 34.1.2 xcopy部署 1110 34.1.3 使用windows installer 1110 34.1.4 clickonce部署 1111 34.2 选择framework版本 1111 34.3 visual studio部署项目 1112 34.3.1 项目模板 1112 34.3.2 创建部署项目 1113 34.4 修改部署项目 1117 34.4.1 项目属性 1117 34.4.2 file system编辑器 1119 34.4.3 registry编辑器 1122 34.4.4 file types编辑器 1124 34.4.5 user interface编辑器 1125 34.4.6 custom actions编辑器 1127 34.4.7 launch conditions编辑器 1129 34.4.8 构建 1132 34.5 windows应用程序的internet部署 1132 34.5.1 “无接触”部署 1132 34.5.2 clickonce部署 1133 34.6 iis web部署工具 1140 34.7 小结 1142 第vi部分 附 录 附录 a vb编译器 1145 附录 b visual basic powerpacks tools 1161 附录 c workflow 2008 1173 附录 d 企业服务 1193 附录 e 云的编程 1215
表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
编号 标题 内容 一 NET开发基础 .NET Framework概述 VS2008开发环境 C#语言及编码规范 面向对象开发初步 接口和类的设计 SQL语句,存储过程 二 .NET框架&C#编程 面向对象的基本知识体系 .NET的面向对象设计与应用 C#与设计模式 泛型 C#的新特性 程序集 .NET应用程序部署和版本控制 委托和事件 线程 反射 对象序列化 数据流和文件 Internet访问与网络编程 EventLog MSMQ Remoting 与COM的交互 Windows Service 三 ADO.NET 数据库连接与连接池控制 执行数据操作命令 DataReader DataSet ADO.NET的数据更新 多活动结果集 批量复制 ADO.NET的异步处理 事务处理机制 LINQ 案例分析:采用N层架构和分布式的大型图书系统 四 Web应用(ASP.NET&XML; WebService ASP.NET 页面控制机制及编译模型,页面周期,常用控件,自定义控件,用户控件   MasterPage,主题与皮肤,站点导航,数据源控件,数据绑定   AJAX,数据缓存,个性化用户配置,Web部件,成员资格与角色管理   自定义HttpHandler与HttpModule,综合站点设计,N层架构设计 XML   XMLDocument,XML Reader & Writer   XML XPATH,XML XSLT,XML Schema   XML & ADO.NET,XML & 配置文件   XML序列化 Web Service   WSDL,SOAP,UDDI,生成XML Web Service   Web Service的异步调用,状态管理   事务处理,安全性,自定义身份验证 Visual Studio Team System 的单元测试与Web测试 案例分析:基于.NET2.0的大型电子商务系统 五  Windows 应用(Windows Forms) 创建Windows应用程序 主要Windows控件与自定义控件 WinForm的数据处理 多文档界面 打印功能 GDI+ WinForm的异步编程 资源文件与国际化开发 部署方案(ClickOnce)
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页