如何从 SQL 中读取数据并将其放入 VB 中的数组,其中包含代码且没有框
How to read data from SQL and put it into an array in VB with code and no boxes
我正在做一个项目,我需要从 SQL Table(称为 Table_IDs_Name)中读取数据。在那个 table 中,我必须读取列 (Variable_Name) 并获取数组中的每一行(在代码中称为 Names_Array)。我正在尝试以下代码并使用 reader 获取值,但如何将它们放入数组中?
它非常重要,所以希望你能帮助我
Public SQL_Connection As SqlConnection
Public SQL_Command As SqlCommand
Public SQL_Connection_String As String
Public Names_Array() As String
SQL_Connection_String = "---------------------------"
SQL_Connection = New SqlConnection(SQL_Connection_String)
SQL_Connection.Open()
Dim SQL_Statement_Array As String = "SELECT Variable_Names From Table_IDs_Names"
SQL_Command = New SqlCommand(SQL_Statement_Array, SQL_Connection)
Dim Reader As SqlDataReader
Dim i As Integer
Reader = SQL_Command.ExecuteReader()
While Reader.Read()
Console.WriteLine(Reader("Variable_Name").ToString().ToArray())
Names_Array(i) = Reader("Variable_Name").ToString().ToArray()
i = i + 1
Console.WriteLine("PROBANDO {0}", Names_Array(i))
End While
SQL_Command.Dispose()
John 建议您可以使用来自 System.Collection.Generic
.
的 List
of string
Import System.Collection.Generic
.... 'rest of the code
'declare list of string to store stuff
Dim lst as List(Of String) = new List(Of String)
'iterate query result
While Reader.Read()
'add query result to the list
lst.Add(Reader("Variable_Name").ToString())
End While
您可以在循环中使用名为 lst
的字符串列表或使用 lst.ToArray()
.
将其转换为数组
注:vb.net好久没写了
这里有几件事可能会让新手感到困惑:
- 不要尝试 re-use 相同的连接对象。它会干扰称为 连接池 的功能,最终会造成瓶颈,使速度变慢,并导致您使用 更多 内存,而不是更少。
- 请将您的数据访问放入它自己的 class 或模块中,与您的 UI 和业务逻辑分开,但仅 re-use 连接字符串 在这个模块中,不是全连接。此 class/module 将为您要 运行.
的每个查询或操作提供单独的方法
- 请将这些 short-lived 连接放在
Using
块中以确保它们被正确处理。
- 数组在正式的计算机科学术语中具有非常具体的含义。但是,许多语言以更通俗的方式定义数组。对于 .Net 则不是这样。当您在 .Net 中有一个数组时,您在完整的正式定义中就有一个真正的数组。这些正式的阵列通常不适合现代工作。您几乎总是想要一个通用列表,甚至是 ADO.Net 提供的原始数据访问对象 (DAO),如 IDataReader 或 DataTable。数据绑定也是一种选择。数组对此很不利,对吗?不要将它们与其他集合混为一谈。
- 一定要始终使用参数化查询,并且从不 字符串连接来构建您的SQL 语句。我没有看到你在这方面遗漏的证据,但它很重要,足以确保它已列出。
- 与#5 类似(重要到不容忽视,即使它与问题无关),从不 将密码存储在您的数据库中。要使用您的数据库来支持身份验证,而不是 salt 具有唯一随机数值的新密码,然后使用安全的加密散列(如 BCrypt)对结果进行散列。您可以保存生成的哈希值。当有人尝试登录时,您对尝试的密码执行相同的操作,然后比较哈希值; 从不直接比较密码。
说了这么多,我们可以看一些代码:
Public Module DB
Private ConnectionString As String = "---------------------------"
'I'm extending this to filter by TableID, just so I can demonstrate a parameterized query
Public Shared Iterator Function GetIDVariables(TableID As Integer) As IEnumerable(Of String)
Dim SQL As String = "SELECT Variable_Names From Table_IDs_Names WHERE TableID = @TableID"
Using cn As New SqlConnection(ConnectionString), _
cmd As New SqlCommand(SQL, cn)
cmd.Parameters.Add("@TableID", SqlDbType.Int).Value = Table
cn.Open()
Using rdr As SqlDataReader = cmd.ExecuteReader()
While rdr.Read()
Yield DirectCast(rdr("Variable_Names"), String)
End While
rdr.Close()
End Using
End Using
End Function
End Module
然后在其他代码中:
Dim data = DB.GetIDVariables(12345)
For Each variable As String in data
Console.WriteLine($"PROBANDO {variable}")
Next
我正在做一个项目,我需要从 SQL Table(称为 Table_IDs_Name)中读取数据。在那个 table 中,我必须读取列 (Variable_Name) 并获取数组中的每一行(在代码中称为 Names_Array)。我正在尝试以下代码并使用 reader 获取值,但如何将它们放入数组中? 它非常重要,所以希望你能帮助我
Public SQL_Connection As SqlConnection
Public SQL_Command As SqlCommand
Public SQL_Connection_String As String
Public Names_Array() As String
SQL_Connection_String = "---------------------------"
SQL_Connection = New SqlConnection(SQL_Connection_String)
SQL_Connection.Open()
Dim SQL_Statement_Array As String = "SELECT Variable_Names From Table_IDs_Names"
SQL_Command = New SqlCommand(SQL_Statement_Array, SQL_Connection)
Dim Reader As SqlDataReader
Dim i As Integer
Reader = SQL_Command.ExecuteReader()
While Reader.Read()
Console.WriteLine(Reader("Variable_Name").ToString().ToArray())
Names_Array(i) = Reader("Variable_Name").ToString().ToArray()
i = i + 1
Console.WriteLine("PROBANDO {0}", Names_Array(i))
End While
SQL_Command.Dispose()
John 建议您可以使用来自 System.Collection.Generic
.
List
of string
Import System.Collection.Generic
.... 'rest of the code
'declare list of string to store stuff
Dim lst as List(Of String) = new List(Of String)
'iterate query result
While Reader.Read()
'add query result to the list
lst.Add(Reader("Variable_Name").ToString())
End While
您可以在循环中使用名为 lst
的字符串列表或使用 lst.ToArray()
.
注:vb.net好久没写了
这里有几件事可能会让新手感到困惑:
- 不要尝试 re-use 相同的连接对象。它会干扰称为 连接池 的功能,最终会造成瓶颈,使速度变慢,并导致您使用 更多 内存,而不是更少。
- 请将您的数据访问放入它自己的 class 或模块中,与您的 UI 和业务逻辑分开,但仅 re-use 连接字符串 在这个模块中,不是全连接。此 class/module 将为您要 运行. 的每个查询或操作提供单独的方法
- 请将这些 short-lived 连接放在
Using
块中以确保它们被正确处理。 - 数组在正式的计算机科学术语中具有非常具体的含义。但是,许多语言以更通俗的方式定义数组。对于 .Net 则不是这样。当您在 .Net 中有一个数组时,您在完整的正式定义中就有一个真正的数组。这些正式的阵列通常不适合现代工作。您几乎总是想要一个通用列表,甚至是 ADO.Net 提供的原始数据访问对象 (DAO),如 IDataReader 或 DataTable。数据绑定也是一种选择。数组对此很不利,对吗?不要将它们与其他集合混为一谈。
- 一定要始终使用参数化查询,并且从不 字符串连接来构建您的SQL 语句。我没有看到你在这方面遗漏的证据,但它很重要,足以确保它已列出。
- 与#5 类似(重要到不容忽视,即使它与问题无关),从不 将密码存储在您的数据库中。要使用您的数据库来支持身份验证,而不是 salt 具有唯一随机数值的新密码,然后使用安全的加密散列(如 BCrypt)对结果进行散列。您可以保存生成的哈希值。当有人尝试登录时,您对尝试的密码执行相同的操作,然后比较哈希值; 从不直接比较密码。
说了这么多,我们可以看一些代码:
Public Module DB
Private ConnectionString As String = "---------------------------"
'I'm extending this to filter by TableID, just so I can demonstrate a parameterized query
Public Shared Iterator Function GetIDVariables(TableID As Integer) As IEnumerable(Of String)
Dim SQL As String = "SELECT Variable_Names From Table_IDs_Names WHERE TableID = @TableID"
Using cn As New SqlConnection(ConnectionString), _
cmd As New SqlCommand(SQL, cn)
cmd.Parameters.Add("@TableID", SqlDbType.Int).Value = Table
cn.Open()
Using rdr As SqlDataReader = cmd.ExecuteReader()
While rdr.Read()
Yield DirectCast(rdr("Variable_Names"), String)
End While
rdr.Close()
End Using
End Using
End Function
End Module
然后在其他代码中:
Dim data = DB.GetIDVariables(12345)
For Each variable As String in data
Console.WriteLine($"PROBANDO {variable}")
Next