我尝试做的事情可能更适合与SQL Server一起使用,但我在过去看到过很多应用程序只处理文本文件,我想尝试模仿这些应用程序遵循的相同行为。
我在文本文件中有一个URL列表。这很简单,可以逐行打开和读取,但如何从文件中存储其他数据并查询数据呢?
E.g。 文本文件:
http://link1.com/ - 0
http://link2.com/ - 0
http://link3.com/ - 1
http://link4.com/ - 0
http://link5.com/ - 1
然后我会用以下内容阅读数据:
Private Sub ButtonX2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonX2.Click
OpenFileDialog1.Filter = "*txt Text Files|*.txt"
If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
Dim AllText As String = My.Computer.FileSystem.ReadAllText(OpenFileDialog1.FileName)
Dim Lines() = Split(AllText, vbCrLf)
Dim list = New List(Of Test)
Dim URLsLoaded As Integer = 0
For i = 0 To UBound(Lines)
If Lines(i) = "" Then Continue For
Dim URLInfo As String() = Split(Lines(i), " - ")
If URLInfo.Count < 6 Then Continue For
list.Add(New Test(URLInfo(0), URLInfo(1)))
URLsLoaded += 1
Next
DataGridViewX1.DataSource = list
LabelX5.Text = URLsLoaded.ToString()
End If
End Sub
正如您所看到的,上面我提示用户打开一个文本文件,之后它会在datagridview中显示回用户。
现在这是我的问题,我希望能够查询数据,例如。选择*来自URL WHERE active ='1'(过去常用于PHP + MySQL!)
其中1是文本文件中URL后面的对应1或0。
在上面的示例中,数据存储在一个简单的类中,如下所示:
Public Class Test
Public Sub New(ByVal URL As String, ByVal Active As Integer)
_URL = URL
_Active = Active
End Sub
Private _URL As String
Public Property URL() As String
Get
Return _URL
End Get
Set(ByVal value As String)
_URL = value
End Set
End Property
Private _Active As String
Public Property Active As String
Get
Return _Active
End Get
Set(ByVal value As String)
_Active = value
End Set
End Property
End Class
从文本文件导入后,我是否完全错误地存储数据?
我是VB.NET的新手,并且仍在学习基础知识,但我发现在阅读大量书籍之前,通过玩游戏更容易学习!
答案 0 :(得分:1)
您可以使用LINQ查询您的类,只要它在适当的集合类型中,例如List(of Test)
。我不完全熟悉LINQ的VB语法,但它将类似于下面的内容。
list.Where(Function(x) x.Active == "1").Select(Function(x) x.Url)
但是,这实际上并没有将任何东西存储到数据库中,我认为你的问题可能会问?
答案 1 :(得分:1)
工作示例:
Dim myurls As New List(Of Test)
myurls.Add(New Test("http://link1.com/", 1))
myurls.Add(New Test("http://link2.com/", 0))
myurls.Add(New Test("http://link3.com/", 0))
Dim result = From t In myurls Where t.Active = 1
For Each testitem As Test In result
MsgBox(testitem.URL)
Next
顺便说一下,LINQ很神奇。您可以将加载/解析代码缩短为3行代码:
Dim Lines() = IO.File.ReadAllLines("myfile.txt")
Dim myurls As List(Of Test) = (From t In lines Select New Test(Split(t, " - ")(0), Split(t, " - ")(1))).ToList
DataGridViewX1.DataSource = myurls
第一行将文件中的所有行读取为字符串数组。 第二行拆分数组中的每一行,并创建一个测试项,然后将所有这些结果项转换为一个列表(Test)。
当然,这可能会被误用于愚蠢行为:呃:
DataGridViewX1.DataSource = (From t In IO.File.ReadAllLines("myfile.txt") Select New Test(Split(t, " - ")(0), Split(t, " - ")(1))).ToList
将使您的加载函数仅包含以下4行:
If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
DataGridViewX1.DataSource = (From t In IO.File.ReadAllLines("myfile.txt") Select New Test(Split(t, " - ")(0), Split(t, " - ")(1))).ToList
LabelX5.Text = ctype(datagridviewx1.datasource,List(Of Test)).Count
End If
答案 2 :(得分:0)
我认为你正在重新发明轮子,这通常不是一件好事。如果您希望SQL功能只是将数据存储在SQL DB中并进行查询。
您应该使用现有数据库的原因有很多:
那就是说,如果这只是一次学术活动,那就去吧。但是,对于现实世界的系统,我不会这样做。