【问题标题】:Concept of a database driven program in VB.NETVB.NET 中数据库驱动程序的概念
【发布时间】:2013-05-01 00:58:36
【问题描述】:

我已经用 VB.NET 开发程序几年了,对它很熟悉。我接触不多的领域是数据库。

我正在编写一个名为电影管理器的程序(供我个人使用)。它将存储有关我拥有的电影的信息。我选择了 Sql Server Compact Edition 数据库。假设我有一个包含两个表的数据库,即 Info 和 Cast。信息表有几个列,如电影名称、发布日期等。 Cast 表的列数很少,例如 first_name、last_name 等。

现在我创建了一个 DataSet,它从数据库中读取所有表的信息(打开连接,填充表信息,关闭连接)。这样在全局变量中我就有了数据库的快照。

我的查询:

  1. 一旦我有了数据,每次我需要添加、编辑或删除记录时,我都必须打开连接、触发 sql 并关闭连接。正确的 ?有没有办法在不使用 Sql 的情况下做到这一点?另外,这个概念可以吗。

  2. 由于我没有使用结构,所以我需要创建空数据集来存储临时信息。这方便吗?

  3. 如果我必须在数据集表中搜索特定事物,那么我是否必须遍历所有项目,或者我可以在数据集上使用 sql 还是有替代方法?

【问题讨论】:

  • @rs。我认为,在他处理实体之前,他可能应该弄清楚发生了什么的基础知识。
  • 要回答您的问题,您通常会聘请一个每小时 1000 美元的人员来确定上述所有问题的解决方案,该人员会考虑所有针对您的应用程序的注意事项。对于一般情况,没有正确答案。这很像“我想建造一架飞机,我应该使用铝吗?我应该有涡轮机吗?我应该使用皮革作为乘客座椅吗?”

标签: database vb.net


【解决方案1】:

1)一旦我有了数据,每次我需要添加、编辑或删除记录时,我都必须打开一个连接,触发一个 sql 并关闭连接。正确的 ?有没有办法在不使用 Sql 的情况下做到这一点?另外,这个概念可以吗。

没有。要更新数据库,您必须使用数据库。在数据库中创建一个存储过程来处理您的功能,然后从代码中调用它并传入需要保存的任何数据。不要使用内联 SQL。参数化存储过程是要走的路。

2) 由于我没有使用结构,所以我需要创建空数据集来存储临时信息。这样方便吗?

这取决于你在做什么。我会创建一个对象模型来保留我更新的数据,然后在需要保存我的更改时将属性传递到存储过程中。

3) 如果我必须在数据集表中搜索特定事物,那么我是否必须遍历所有项目,或者我可以在数据集上使用 sql 还是有替代方法?

您可以循环行,也可以使用 linq 提取您需要的内容。 Linq 非常好,因为它基本上是针对集合的 .NET 编码查询。

那里有很多教程/指南向您展示如何通过存储的 proc 调用从您的代码中进行更新。还有大量的 linq 教程。基本上,针对您的表的 linq 查询将类似于:

dim result as Generic.List(of String) =
  (from r in table.AsEnumerable()
  select r
  where r["columnName"] = "the value").ToList()

这个语法可能有点不对劲,但看起来差不多。

编辑

你的模特:

Public Class EmployeeModel
    Public Property Id
    Public Property FirstName
    Public Property Last Name
    Public Property JobCode
    Public Sub EmployeeModel(your params)
        //set properties
    End Sub
End Class

您的 DAL:

Public Shared Class EmployeeDAL
    Public Shared Sub SaveEmployee(ByRef model as EmployeeModel)
       // call your sp_SaveEmployee stored procedure and set the parameters to the model properties
       // @id = EmpoyeeModel.Id
       // @JobCode = Employee.JobCode
       // ...
    End Sub
End Class

我每隔几个月就使用一次 VB,因此其中可能存在一些小的语法错误。但这基本上就是您需要做的所有事情。保存数据的功能在 DAL 中,而不是在类本身中。但是,如果您不想使用 DAL,则可以将保存功能放在您的类中。它会以同样的方式工作,只是没有那么清楚地分开。

【讨论】:

  • 非常感谢您的回复。 1) 我将创建存储过程来添加、编辑或删除数据库中的数据。 2)这很棘手。你看我不明白你的陈述“我会创建一个对象模型来保留我更新的数据......”。我的意思是因为我没有使用结构,那么如果我想将临时数据保存在内存中,那么我应该使用空数据集,因为它们已经包含适当的表和列。这个可以吗 ? 3) 我会尝试使用 LINQ/Loop 从数据集中获取数据。
  • @Greatchap 我会创建一个类(对象模型是一个代表您的数据的类)来保留该数据。老实说,这不需要太多工作。它很可能是一个简单的类,其属性代表您需要的数据。但是,如果您想在 Session 的表中保留某些内容,您也可以这样做。我只是不认为这是最好的方法。您也可以使用KeyValuePairsDictionary 的集合。
  • 在应用程序中,您创建一个结构并根据使用情况创建该结构的数组并将值存储在其中。这些值可以临时使用,当您认为需要编写它时,将它们写入文件或数据库。与我想的相同方式不是创建一个包含数据库表的相同字段的结构,我可以使用临时数据集,因为它包含所有表字段并在其中存储值。如果我认为我需要编写它们,那么我可以将该变量发送到一个函数/子,它将它们添加到数据库中。我希望这没问题。
  • @Greatchap 这是你的程序,决定权在你,伙计。我提出了一个建议,你可以使用也可以不使用。如果您想使用表/数据集 - 就这样做。设计决策由您做出。我只能提出建议。如果我的回答对您有帮助,请投票并接受。
  • 我认为 SQL CE 没有存储过程。参数化查询可以使用。
【解决方案2】:

关于你的问题。

数字 1:您必须连接到数据库才能存储和检索数据。有很多方法可以处理它,其中一种方法是使用 app.config 或者您可以简单地创建一个函数,在每次需要时调用连接。

第 2 点:由于您正在处理数据集,这里有一些提示,您可能需要查看 DataSet

number 3:您也可以尝试使用数据适配器和数据表。我不确定您的问题 3 是什么意思。

干杯

【讨论】:

    【解决方案3】:

    我对您使用数据库和计算机内存的方式有疑问。 问题1:既然你已经有一个保存电影信息的数据库,为什么还要在内存中保存相同的信息?,产生额外的开销。如果您的答案是为了性能,或者我的内存很便宜,那么您为什么不使用 xml 或 flatfile 呢?此场景不需要数据库。

    问题2:你就像一个不知道他使用的武器的士兵?正确的?因为您问的第一个问题是关于打开连接的愚蠢问题。答案是肯定的,您每次保存/读取数据时都必须打开连接并尽快关闭它。 你关于convinent的第二个问题答案是否定的。而是创建具有所有字段作为属性的类和一些用于初始化、保存、删除的方法。这样,您必须编写更少的代码。 nad 假设你有一个电影名称 xyz 可以有另一个电影 xyz 你将如何区分它?如果你有完整的信息 b4,你可以通过发布日期、演员表等来完成,但仍然很难,所以为你的表创建一个主键

    最后是你的第三个问题,使用 sql 查询比遍历数据集更容易(尽快摆脱数据集) 祝你在rdbms

    的道路上好运

    【讨论】:

    • 感谢您的回复,但令人困惑的是您为什么认为我在问愚蠢的问题。(1) 我的数据库有 5 个表 (2) 我知道主键并且我的表有它们 (3)在示例中,我提到了最简单的开始。 (4) 平面文件不适合这里,因为表格有电影信息,每部电影都有演员信息,每部电影都连接到图像表等等。我需要使用数据库。 (5) 我将有一个通用的保存和更新功能,但我只是想确认我需要在每种情况下打开/关闭连接。 (6) 如果不将数据集加载到内存中,如何搜索、读取信息?
    猜你喜欢
    • 1970-01-01
    • 2015-07-06
    • 2013-09-24
    • 1970-01-01
    • 1970-01-01
    • 2015-05-07
    • 2019-10-31
    • 1970-01-01
    • 2012-01-06
    相关资源
    最近更新 更多