【问题标题】:autoNumber in VB.NETVB.NET 中的自动编号
【发布时间】:2017-06-20 05:37:44
【问题描述】:

我想从 VB6 迁移到 VB.NET,但还是菜鸟。如何使自动编号程序像 VB.NET (VB2012) 中的 VB6 中的代码,目前在我的代码下方。

在我之前的VB6代码下面,这个代码在addbutton_click时会起作用,它会显示CDEUSR005,因为之前的表中有4条记录,CDEUSR001,CDEUSR002,CDEUSR003,CDEUSR004。 Image sample that works in VB6

Sub autoNumber()
    Rs_User.Requery
    Set Rs_User = New ADODB.Recordset
    strSQL = "SELECT userCode FROM tblUser ORDER BY userCode"
    Rs_User.Open strSQL, Conn, adOpenDynamic, adLockBatchOptimistic
    If Rs_User.BOF Then
        NewCode = "CDEUSR001"
        Exit Sub
    Else
        Rs_User.MoveLast
        NewCode = Rs_User!userCode
        userCode = Right(userCode, 3)
        userCode = Val(userCode) + 1
        If Len(userCode) > 5 Then
            Exit Sub
        End If
    End If
    userCode = "CDEUSR" & Format(NewCode, "000")
 End Sub

这是我的VB.NET(VB2012)代码,当添加按钮时,会显示CDEUSER001,不显示CDEUSR005.Image sample that wont' works in VB.NET

Sub autoNumber()
    sql = New Odbc.OdbcCommand("SELECT userCode FROM tblUser ORDER BY userCode", conn)
    dr = sql.ExecuteReader
    dr.Read()

    If (xxxx which has same function with Rs_User.BOF) Then
        NewCode = "CDEUSR001"
        Exit Sub
    Else
        NewCode = Microsoft.VisualBasic.Right(dr.GetString(0), 3)
        NewCode = Val(NewCode) + 1
        If Len(NewCode) > 5 Then
            Exit Sub
        End If
    End If
    NewCode = "CDEUSR" & Format(NewCode, "000")
End Sub

【问题讨论】:

  • 如果你有一个数据库,那你为什么不让它生成数字呢?
  • 你的代码应该可以工作,显然条件If (xxxx which has same function with Rs_User.BOF) Then在你的情况下总是返回true
  • @jmcilhinney:我不知道怎么做......
  • @Fabio: hihi...VB.NET 的细微差别.....
  • 看起来这是一个包含单行的表,您想查看查询是否返回了任何内容(意思是从 CDEUSR001 开始),否则将 1 添加到现有的数值数字。在这种情况下,您只需检查阅读器 .hasrows 是否使用您的起始编号,如果为 false,则分解并增加编号。如果我的假设不正确,请考虑从表中查询 LAST userCode 并从那里开始工作。

标签: mysql vb.net odbc


【解决方案1】:

VB6 中的 ADODB 和 VB.NET 中的OdbcConnection 的区别在于OdbcConnection 经常使用OdbcDataReader.HasRows 属性作为ADODB.Recordset.BOFADODB.Recordset.EOF 对应物。

你的 VB.NET 代码应该这样修改(Using 块在初始化 OdbcConnection 时作为通用约定添加):

Sub autoNumber()
    Using conn As New OdbcConnection(...)
        Using sql As New OdbcCommand("SELECT userCode FROM tblUser ORDER BY userCode", conn)
           Using dr As OdbcDataReader = sql.ExecuteReader()

               ' similar like Recordset.EOF or BOF
               If dr.HasRows = False Then 
                   NewCode = "CDEUSR001"
                   Exit Sub
               Else
                   dr.Read()
                   ' dr("userCode") may also work here
                   NewCode = Right(dr.GetString(0), 3)
                   NewCode = Val(NewCode) + 1
                   If Len(NewCode) > 5 Then
                      Exit Sub
                   End If
               End If
            NewCode = "CDEUSR" & Format(NewCode, "000")
            End Using
        End Using
    End Using
End Sub

注意:与ADODB.Recordset 不同,OdbcDataReader 没有行索引来确定最后一行,但DataSet 有。您可以检索DataSet 中的最后一条记录,如下所示:

Dim ds As DataSet = New DataSet()

Using conn As New OdbcConnection(...)
   Using sql As New OdbcCommand("SELECT userCode FROM tblUser ORDER BY userCode", conn)
       Dim adapter As OdbcDataAdapter = New OdbcDataAdapter(sql)
       adapter.Fill(ds)

       ' here to get last row from DataSet
       ' related: stackoverflow.com/questions/2099379/
       NewCode = Right(ds.Tables(0)(ds.Tables(0).Rows.Count - 1)("userCode"), 3)

       ' other stuff

   End Using
End Using

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-22
    相关资源
    最近更新 更多