如何:使用 LINQ 修改数据库中的数据 (Visual Basic)

使用语言集成查询 (LINQ) 可以方便地访问数据库信息和修改数据库中的值。

本主题中的示例使用 Northwind 示例数据库。 如果没有在开发计算机中安装 Northwind 示例数据库,可以从 Microsoft Download Center(Microsoft 下载中心)网站下载该数据库。 有关说明,请参见下载示例数据库

创建与数据库的连接

  1. 在 Visual Studio 中,单击**“视图”菜单,选择“服务器资源管理器”/“数据库资源管理器”,打开“服务器资源管理器”/“数据库资源管理器”**。

  2. 在**“服务器资源管理器”/“数据库资源管理器”中,右击“数据连接”,然后单击“添加连接”**。

  3. 指定与 Northwind 示例数据库的有效连接。

将 LINQ to SQL 文件添加到项目

  1. 在 Visual Studio 中的**“文件”菜单上,指向“新建”,然后单击“项目”。 选择 Visual Basic“Windows 窗体应用程序”**作为项目类型。

  2. 在**“项目”菜单上,单击“添加新项”。 选择“LINQ to SQL 类”**项模板。

  3. 将文件命名为 northwind.dbml。 单击**“添加”**。 为 northwind.dbml 文件打开对象关系设计器(O/R 设计器)。

将要查询和修改的表添加到设计器

  1. 在**“服务器资源管理器”/“数据库资源管理器”中,展开与 Northwind 数据库的连接。 展开“表”**文件夹。

    如果已经关闭 O/R 设计器,可以通过双击先前添加的 northwind.dbml 文件重新将其打开。

  2. 单击 Customers 表并将它拖到设计器的左窗格上。

    设计器为项目创建新的 Customer 对象。

  3. 保存所做的更改并关闭设计器。

  4. 保存您的项目。

添加用于修改数据库和显示结果的代码

  1. 从**“工具箱”**中,将 DataGridView 控件拖到项目的默认 Windows 窗体 Form1 上。

  2. 将表添加到 O/R 设计器后,设计器会向项目中添加一个 DataContext 对象。 此对象包含可用于访问 Customers 表的代码。 还包含为表定义局部 Customer 对象和 Customers 集合的代码。 项目的 DataContext 对象是根据 .dbml 文件的名称命名的。 对于此项目,DataContext 对象被命名为 northwindDataContext。

    可以在代码中创建 DataContext 对象的实例,也可以查询和修改 O/R 设计器所指定的 Customers 集合。 通过调用 DataContext 对象的 SubmitChanges 方法提交对 Customers 集合所做的更改之后,这些更改才会在数据库中反映出来。

    双击 Windows 窗体 Form1,可将代码添加到 Load 事件,以便查询公开为 DataContext 的属性的 Customers 表。 添加下列代码:

    Private db As northwindDataContext
    
    Private Sub Form1_Load(ByVal sender As System.Object, 
                           ByVal e As System.EventArgs
                          ) Handles MyBase.Load
      db = New northwindDataContext()
    
      RefreshData()
    End Sub
    
    Private Sub RefreshData()
      Dim customers = From cust In db.Customers 
                      Where cust.City(0) = "W" 
                      Select cust
    
      DataGridView1.DataSource = customers
    End Sub
    
  3. 从**“工具箱”中将三个 Button 控件拖到窗体上。 选择第一个 Button 控件。 在“属性”**窗口中,将 Button 控件的 Name 设置为 AddButton,将 Text 设置为 Add。 选择第二个按钮,将 Name 属性设置为 UpdateButton,将 Text 属性设置为 Update。 选择第三个按钮,将 Name 属性设置为 DeleteButton,将 Text 属性设置为 Delete。

  4. 双击**“Add”**按钮,向其 Click 事件添加代码。 添加下列代码:

    Private Sub AddButton_Click(ByVal sender As System.Object, 
                                ByVal e As System.EventArgs
                               ) Handles AddButton.Click
      Dim cust As New Customer With { 
        .City = "Wellington", 
        .CompanyName = "Blue Yonder Airlines", 
        .ContactName = "Jill Frank", 
        .Country = "New Zealand", 
        .CustomerID = "JILLF"}
    
      db.Customers.InsertOnSubmit(cust)
    
      Try
        db.SubmitChanges()
      Catch
        ' Handle exception.
      End Try
    
      RefreshData()
    End Sub
    
  5. 双击**“Update”**按钮,向其 Click 事件添加代码。 添加下列代码:

    Private Sub UpdateButton_Click(ByVal sender As System.Object, _
                                   ByVal e As System.EventArgs
                                  ) Handles UpdateButton.Click
      Dim updateCust = (From cust In db.Customers 
                        Where cust.CustomerID = "JILLF").ToList()(0)
    
      updateCust.ContactName = "Jill Shrader"
    
      Try
        db.SubmitChanges()
      Catch
        ' Handle exception.
      End Try
    
      RefreshData()
    End Sub
    
  6. 双击**“Delete”**按钮,向其 Click 事件添加代码。 添加下列代码:

    Private Sub DeleteButton_Click(ByVal sender As System.Object, _
                                   ByVal e As System.EventArgs
                                  ) Handles DeleteButton.Click
      Dim deleteCust = (From cust In db.Customers 
                        Where cust.CustomerID = "JILLF").ToList()(0)
    
      db.Customers.DeleteOnSubmit(deleteCust)
    
      Try
        db.SubmitChanges()
      Catch
        ' Handle exception.
      End Try
    
      RefreshData()
    End Sub
    
  7. 按 F5 运行项目。 单击**“Add”添加新记录。 单击“Update”修改该新记录。 单击“Delete”**删除该新记录。

请参见

任务

如何:分配存储过程以执行更新、插入和删除(O/R 设计器)

演练:创建 LINQ to SQL 类(O/R 设计器)

概念

DataContext 方法(O/R 设计器)

其他资源

Visual Basic 中的 LINQ

查询 (Visual Basic)

LINQ to SQL [LINQ to SQL]