【问题标题】:VB.Net and SQL CommunicationVB.Net 与 SQL 通信
【发布时间】:2014-01-23 09:45:01
【问题描述】:

多年来我没有做过任何认真的编程,而且我也没有太多间接操作 SQL 数据的经验,但是我试图为我的雇主创建一个程序并且遇到了困惑。这里的许多答案和我拥有的大学书籍都很有帮助,但是当我认为我理解发生了什么时,我又迷失了,通常是因为人们使用相同的变量和列名,很难弄清楚发生了什么在哪里。

假设我在 SQL 服务器 localhost 上有一个名为 Attendance 的数据库。里面是一个名为 employees 的表,它由以下列组成:employee_idname_lastname_firstpoints。前三个是varchar,最后一个是decimal(2,1)。使用 Visual Studio for Visual Basic,我创建了一个包含多个文本框的程序。用户输入员工 ID,当他们点击 Load 按钮时,该 ID 变为 var_empid

我将如何继续,以便程序执行一个 SQL 查询,该查询从表中提取 name_last 和 name_first,其中 employee_id 与用户输入的 var_empid 匹配,并将该数据放入 var_last_namevar_first_name 变量?

其次,如果用户在其他文本框中输入了 var_empidvar_last_namevar_first_name 的信息,然后单击了 添加员工 按钮,我将如何继续以便信息用户添加的是否写入SQL表?

为了澄清,在文本框和变量之间移动数据不是问题。我可以整天这样做。它在 VB 和 SQL 之间移动变量,这给我带来了问题。我意识到这是基本的东西,但任何帮助都会很棒。

【问题讨论】:

  • 有很多,many 由微软和其他人提供的关于这类事情的教程网站。说它们“使用相同的变量和列名”并不能充分解释为什么您不能只阅读和应用它们。请指出其中一些您已阅读但无法弄清楚的内容。

标签: sql vb.net variables select insert


【解决方案1】:

这超出了您的要求,因为我试图同时推动您采用一些好的做法:

Public Class Employee
    Public Property ID As String 
    Public Property Points As Double 'why is this a decimal(2,1)?
    Public Property LastName As String
    Public Property FirstName As String

    Public Shared Function FromDataRow(ByVal data As IDataRecord) As Employee
         Dim result As New Employee()
         result.ID = CDbl(data("ID"))
         result.LastName = CStr(data("LastName"))
         result.FirstName = CStr(data("FirstName"))
         Return result
    End Function
End Class

Public Module DataLayer
    'Check www.connectionstring.com for more info on connection strings
    Private Property ConnectionString As String = "database connection string here"

    Private Iterator Function GetRecords(ByVal sql As String, ByVal addParams As Action(Of SqlParameterCollection)) As IEnumerable(Of IDataRecord)
        Using cn As New SqlConnection(ConnectionString), _
              cmd As New SqlCommand(sql, cn)

            addParams(cmd.Parameters)
            cn.Open()
            Using rdr As SqlDataReader = cmd.ExecuteReader()
                While rdr.Read)
                    Yield Return rdr
                End While
            End Using
        End Using
    End Function 

    Private Function GetRecords(Of T)(ByVal sql As String, ByVal addParams As Action(Of SqlParameterCollection), ByVal translate As Function(Of IDataRecord, T)) As IEnumerable(Of T)
       Return GetRecords(sql, addParams).Select(translate)
    End Function

    Public Function GetEmployeeData(ByVal EmployeeID As String) As Employee
        Dim sql As String = _
         "SELECT employee_id, name_last, name_first " & _ 
         "FROM employees " & _
         "WHERE employee_id= @ID"

        Return GetRecords(sql, _
            Sub(p) p.Add("@ID", SqlDbType.NVarChar, 10).Value = EmployeeID, _
            Employee.FromDataRow).First()
    End Function
End Class

【讨论】:

  • 这是一个小数,因为迟到的结果只有半个点。
  • 将员工用作类并使用对象属性而不是变量......这太棒了。我希望是经验带来的那些概念之一。感谢大家的帮助。我会继续学习和做。
  • 十进制(2,1) 的最大值为 9.9。那正确吗?听起来您可能想要一个小数 (3,1),其最大值为 99.9。
【解决方案2】:

要回答您的第二个请求,请尝试执行以下查询:

Dim Query = "INSERT INTO Attendance (name_first, name_last, points) VALUES(var_first_name, var_last_name, var_points)"

注意,我没有插入 var_empid,因为如果您已正确创建表,此 id 应该是自动生成的主键,会自动递增。

【讨论】:

    【解决方案3】:

    这并不容易开始,因为起初您会看到许多不同的名称和技术,而且它们似乎都或多或少地承诺相同的事情。尤其是如果您想构建一个与数据库连接的应用程序,并开始执行诸如 CRUD 操作(插入、更新、删除...)之类的基本操作,很容易感到困惑。

    从这里开始阅读ADO.NET Architecture。希望你能更多地了解DataSetLinq To SQLEntity Framework,但可能并不多。这就是为什么我强烈建议您花几天时间慢慢观看 Beth Massi 在 VB.Net 和 Data 上的教程视频。

    在这个页面,How Do I Videos for Visual Basic,你会发现很多有用的信息来开始构建简单但非常有效的应用程序和数据库。 请务必观看 Forms over Data 视频系列Visual Basic 2008 Forms over Data 视频(使用DataSets)以及语言集成查询 (LINQ) 系列(使用LINQ To SQL,您将了解为什么在您的vb.net 应用程序中您的对象变量与您的数据库列具有相同的名称)。最后你可以看看Entity Framework 教程(你会发现它与 Linq To SQL 非常相似)。

    学习完这些基本教程后,您将能够选择自己的路径并开始编程。掌握基本概念后,搜索和了解您在互联网上找到的内容会容易得多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-17
      • 2016-03-01
      • 1970-01-01
      • 2011-04-21
      • 2016-10-25
      • 1970-01-01
      相关资源
      最近更新 更多