对不起,我确信这已被多次覆盖,但我找不到我想要的东西。
我有一个单行数据表,其中包含我的网络系统中使用的各种设置。我一直在把它变成一个XML文档而不是单行数据表,这会更有意义吗?
无论如何,鉴于这是一条记录,有一个名为“locations”的字段,该字段包含如下数据:
locationName1,IpAddress|locationName2,IpAddress|etc
ipAddress只是IP的前5位数字,并且允许我确保只有在从公司计算机连接时(即使用我们的ISP)才能接受登录到某些元素(由工作人员管理的管理部分) - 这是这是一个很大程度上不必要的功能,但是我会停止在家里登录的孩子和东西!
因此,当用户登录时,我可以通过简单的SQL查询检查IP是否有效。
SELECT ips FROM settings WHERE loginLocations LIKE '%" & Left(ipAddress, 5) & " %'
我现在需要做的是从dataField数组中获取用户位置的名称。
我想出了一些冗长的循环程序,但有一种简单的分析方法
locationName1,IpAddress1|locationName2,IpAddress2|etc
作为字符串,只需获取LoginName,其中LoginIp = IpAddressX
...或者我是否以完全荒谬的方式处理这个问题并将其转换为xml文件? (这将为您解析XML提供一大堆其他问题!!)
答案 0 :(得分:0)
你可以在Vb.net中拆分字符串并将其发送给查询或其他任何东西
'Split the string on the "," character
Dim parts As String() = s.Split(New Char() {","c})
答案 1 :(得分:0)
我强烈建议您将我们分成数据库列,每个位置都是一个单独的行;如果它首先以这种方式完成,你就不会遇到现在的问题。
但是既然你把它放在一行/列中,为什么不把它带回来并简单地从.NET中获取值呢?
Dim Source As String = "TestLocationA,127.0|TestLocationB,128.0|TestLocationC,129.0"
Dim Test As String = Source
Dim ToFind As String = "127.0"
Test = Test.Substring(0, Test.IndexOf(ToFind & "|") - 1)
Test = Test.Substring(Test.LastIndexOf("|") + 1)
MsgBox(Test)
OR
Public Class Form1
Private IpLocationList As New List(Of IpLocation)
Private IpToFind As String = ""
Private Class IpLocation
Public Name As String
Public IP As String
Public Sub New(ByVal FullLocation As String)
Me.Name = FullLocation.Substring(0, FullLocation.IndexOf(","))
Me.IP = FullLocation.Substring(FullLocation.IndexOf(",") + 1)
End Sub
End Class
Private Function FindIP(ByVal IpLocationItem As IpLocation) As Boolean
If IpLocationItem.IP = IpToFind Then
Return True
Else
Return False
End If
End Function
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
Dim Source As String = "TestLocationA,127.0|TestLocationB,128.0|TestLocationC,129.0"
Dim LocationList As New List(Of String)
LocationList.AddRange(Split(Source, "|"))
For Each LocationItem As String In LocationList
IpLocationList.Add(New IpLocation(LocationItem))
Next
IpToFind = "127.0"
Dim result As IpLocation = IpLocationList.Find(AddressOf FindIP)
If result IsNot Nothing Then
MsgBox(result.Name)
End If
End Sub
End Class
enter code here
这样做的好处是可以一次加载数组而不需要手动循环遍历数组。
答案 2 :(得分:0)
在SQL Server中,这些是提取子字符串时感兴趣的函数:
CHARINDEX
SUBSTRING
LENGTH
您可以google有关它们的详细信息(例如http://msdn.microsoft.com/en-us/library/ms186323.aspx处的CHARINDEX)。有了这些,您需要在查询中使用计算列来提取该位置名称。
如果还为时不晚,您可能想要设计一种新方法来布局这些元素。例如,而不是:
locationName1,IpAddress1|locationName2,IpAddress2|etc
怎么样
{IpAddress1,locationName1}{IpAddress2,locationName2}etc
这样你就可以使用CHARINDEX找到" {" &安培;左(ipAddress,5);从那个位置,找到",&#34 ;;然后从该位置找到结束"}"。从那里开始,使用SUBSTRING来获取locationName应该很简单。预先警告这可能是一个混乱的查询(可能是从几个子查询构建的,每个位置一个)。
最后,SpectralGhost的想法只是在列中读取并在VB中进行提取可能是最麻烦的方式。
答案 3 :(得分:0)
我已经决定这样做,但我会感谢对效率的评论。
我已经将ipAddress和locationName拆分为两行中的两个数据库列,并通过将字符串作为数组进行比较来获取所需的数据,如下面的代码所示。
对于这个特定的应用程序,我只处理一条记录,所以它非常简单。然而,更进一步,我需要生产一个监控产品销售的系统。来自发票表。
每张发票记录都是数据库中的一行,发票中的项目类似,[item1],[item2]等。还有另一列数量[qty1],[qty2]等,价格[price1],[我需要能够在数据库中搜索发生项目编号的发票(简单的SQL WHERE itemList LIKE%[invNO]%),然后比较数组以获取每个项目的数量和单个价格在那张发票上。将这些行提取为数组并根据下面的代码定位这些行中的相关位置,可以正常工作,但是当整个操作循环遍历几百或几千行时,这会变得非常慢吗?
ipList, locationList = list as comma separated string from database record field
Dim ipArray As Array = Split(ipList, ",")
Dim locationArray As Array = Split(locationList, ",")
For i = 0 To UBound(ipArray)
If Left(ipArray(i), 5) = Left(ipAddress, 5) Then
arrayPosition = i
itemFound = "True"
Exit For
End If
Next
location = locationArray(arrayPosition)
'loop through ips then get the position and make the location equal to that
If itemFound <> "True" Then
inValidIP = "True"
End If