演练:仅使用存储过程 (C#)

本演练提供了通过仅使用存储过程来访问数据的 LINQ to SQL 基本端对端方案。 数据库管理员经常使用此方法来限制数据存储的访问方式。

备注

你还可以在 LINQ to SQL 应用程序中使用存储过程来重写默认行为,尤其是 CreateUpdateDelete 进程的默认行为。 有关详细信息,请参阅自定义插入、更新和删除操作

出于本演练的需要,您将用到已映射到 Northwind 示例数据库中存储过程的两个方法:CustOrdersDetail 和 CustOrderHist。 此映射发生在运行 SqlMetal 命令行工具来生成 C# 文件时。 有关更多信息,请参见本演练后面的“先决条件”一节。

本演练不依赖于对象关系设计器。 使用 Visual Studio 的开发人员还可以使用 O/R 设计器来实现存储过程功能。 请参阅 Visual Studio 中的 LINQ to SQL 工具

注意

以下说明中的某些 Visual Studio 用户界面元素在计算机上出现的名称或位置可能会不同。 这些元素取决于你所使用的 Visual Studio 版本和你所使用的设置。 有关详细信息,请参阅个性化设置 IDE

本演练是使用 Visual C# 开发设置编写的。

先决条件

本演练需要如下内容:

  • 本演练使用专用文件夹(“c:\linqtest7”)来保存文件。 请在开始本演练前创建此文件夹。

  • Northwind 示例数据库。

    如果您的开发计算机上没有此数据库,您可以从 Microsoft 下载网站下载它。 有关说明,请参阅下载示例数据库。 下载此数据库后,请将 northwnd.mdf 文件复制到 c:\linqtest7 文件夹。

  • 从 Northwind 数据库生成的 C# 代码文件。

    本演练是通过使用 SqlMetal 工具以及如下命令行编写的:

    sqlmetal /code:"c:\linqtest7\northwind.cs" /language:csharp "c:\linqtest7\northwnd.mdf" /sprocs /functions /pluralize

    有关详细信息,请参阅 SqlMetal.exe(代码生成工具)

概述

本演练由六项主要任务组成:

  • 在 Visual Studio 中设置 LINQ to SQL 解决方案。

  • 将 System.Data.Linq 程序集添加到项目中。

  • 向项目添加数据库代码文件。

  • 创建与数据库的连接。

  • 设置用户界面。

  • 运行和测试应用程序。

创建 LINQ to SQL 解决方案

在这第一项任务中,你将创建一个 Visual Studio 解决方案,其中包含生成和运行 LINQ to SQL 项目所必需的引用。

创建 LINQ to SQL 解决方案

  1. 在 Visual Studio 的“文件”菜单上,指向“新建”,再单击“项目”。

  2. 在“新建项目”对话框中的“项目类型”窗格中,单击“Visual C#”。

  3. “模板” 窗格中,单击 “Windows 窗体应用程序”

  4. 在“名称”框中,键入 SprocOnlyApp。

  5. 在“位置”框中,确认要用于存储项目文件的位置。

  6. 单击“确定”。

    Windows 窗体设计器即会打开。

添加 LINQ to SQL 程序集引用

LINQ to SQL 程序集未包含在标准的 Windows 窗体应用程序模板中。 您将需要按照以下步骤中的说明自行添加此程序集:

添加 System.Data.Linq.dll

  1. 在“解决方案资源管理器”中,右键单击“引用”,然后单击“添加引用”。

  2. 在“添加引用”对话框中,依次单击“.NET”、System.Data.Linq 程序集,再单击“确定”。

    此程序集即被添加到项目中。

将 Northwind 代码文件添加到项目

此步骤假定你已使用 SqlMetal 工具从 Northwind 示例数据库生成代码文件。 有关更多信息,请参见本演练前面部分的“先决条件”一节。

将 northwind 代码文件添加到项目

  1. 在“项目”菜单上,单击“添加现有项”

  2. 在“添加现有项”对话框中,移动到 c:\linqtest7\northwind.cs,然后单击“添加”。

    northwind.cs 文件即被添加到项目中。

创建数据库连接

在此步骤中,您要定义与 Northwind 示例数据库的连接。 本演练使用“c:\linqtest7\northwnd.mdf”作为路径。

创建数据库连接

  1. 在“解决方案资源管理器”中,右键单击“Form1.cs”,然后单击“查看代码”。

  2. 将下面的代码键入到 Form1 类中:

    Northwnd db = new Northwnd(@"c:\linqtest7\northwnd.mdf");
    

设置用户界面

在此任务中,你要设置一个界面,供用户执行存储过程以访问数据库中的数据之用。 在您按照本演练开发的应用程序中,用户只能使用应用程序中嵌入的存储过程来访问数据库中的数据。

设置用户界面

  1. 返回到 Windows 窗体设计器 (Form1.cs[Design])。

  2. 在“视图”菜单上,单击“工具箱”

    工具箱即会打开。

    备注

    单击“自动隐藏”图钉,以使工具箱在你执行本节中剩余步骤的过程中保持打开。

  3. 从工具箱中将两个按钮、两个文本框和两个标签拖到“Form1”上。

    按照附图排列这些控件。 扩展“Form1”,让控件更便于显示。

  4. 右键单击“label1”,然后单击“属性”。

  5. 将“Text”属性从“label1”更改为“Enter OrderID:”。

  6. 对于“label2”,请按相同的方式将“Text”属性从“label2”更改为“Enter CustomerID:”。

  7. 按相同的方式,将“button1”的“Text”属性更改为“Order Details”。

  8. 将“button2”的“Text”属性更改为“Order History”。

    将这些按钮控件加宽,以使所有文本均可见。

处理按钮单击

  1. 双击 Form1 上的“Order Details”(订单明细),在代码编辑器中打开 button1 事件处理程序。

  2. 将如下代码键入到 button1 处理程序中:

    // Declare a variable to hold the contents of
    // textBox1 as an argument for the stored
    // procedure.
    string param = textBox1.Text;
    
    // Declare a variable to hold the results
    // returned by the stored procedure.
    var custquery = db.CustOrdersDetail(Convert.ToInt32(param));
    
    // Execute the stored procedure and display the results.
    string msg = "";
    foreach (CustOrdersDetailResult custOrdersDetail in custquery)
    {
        msg = msg + custOrdersDetail.ProductName + "\n";
    }
    if (msg == "")
        msg = "No results.";
    MessageBox.Show(msg);
    
    // Clear the variables before continuing.
    param = "";
    textBox1.Text = "";
    
  3. 现在双击 Form1 上的 button2 ,打开 button2 处理程序

  4. 将如下代码键入到 button2 处理程序中:

    // Comments in the code for button2 are the same
    // as for button1.
    string param = textBox2.Text;
    
    var custquery = db.CustOrderHist(param);
    
    string msg = "";
    foreach (CustOrderHistResult custOrdHist in custquery)
    {
        msg = msg + custOrdHist.ProductName + "\n";
    }
    MessageBox.Show(msg);
    
    param = "";
    textBox2.Text = "";
    

测试应用程序

现在,可以开始测试您的应用程序了。 请注意,您可对数据存储施加的影响仅限于这两个存储过程能够执行的操作。 这些操作是要根据您输入的所有 orderID 返回相应订单包括的产品,或根据您输入的所有 CustomerID 返回相应客户的产品订购历史记录。

测试应用程序

  1. 按 F5 开始调试。

    此时将显示 Form1。

  2. 在“Enter OrderID”(输入 OrderID)框中,键入 10249,然后单击“Order Details”(订单明细)。

    随即会显示一个消息框,其中列出了 10249 号订单中所包括的产品。

    单击“确定” 关闭消息框。

  3. 在“Enter CustomerID”(输入 CustomerID)框中,键入 ALFKI,然后单击“Order History”(订单历史记录)。

    随即会显示一个消息框,其中列出了 ALFKI 客户的订单历史记录。

    单击“确定” 关闭消息框。

  4. 在“Enter OrderID”(输入 OrderID)框中,键入 123,然后单击“Order Details”(订单明细)。

    随即会显示一个消息框,其中显示“无结果”。

    单击“确定” 关闭消息框。

  5. 在“调试”菜单上,单击“停止调试”。

    调试会话即会关闭。

  6. 如果你已试验完毕,可以单击“文件”菜单上的“关闭项目”,并在看到相应提示时保存你的项目。

后续步骤

您可以通过做一些更改来增强此项目的功能。 例如,您可以在列表框中列出可用的存储过程,供用户选择要执行哪些过程。 您还可以将报告的输出以流的方式传输到文本文件。

请参阅