使用asp.net和VB的数组

时间:2011-10-31 18:00:30

标签: asp.net vb.net arrays

对不起,我确信这已被多次覆盖,但我找不到我想要的东西。

我有一个单行数据表,其中包含我的网络系统中使用的各种设置。我一直在把它变成一个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提供一大堆其他问题!!)

4 个答案:

答案 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