You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何给整数前置字符?代码仅返回无T整数的问题排查

问题分析:returnNo字段添加前缀T后无法正确入库的原因

我们的数据库中有一个名为returnNo的字段,查询时返回整数类型值(示例:4098)。需要在该整数前添加字符T,再将数值加1后存入数据库,但运行代码后,仅返回不带T的整数并入库,问题出在这几个地方:

原代码:

Dim retNo As Integer = 0
Dim return_No As String = ""
Dim dteReturned As String = ""
Try
    Dim Sqls As String = "select MAX(returnNo) returnNo from Trials"
    Dim Sqlsr As String = "select DateReturned from Trials where ownerId='" & Session("rOwnerID") & "' "
    Dim prevretcmd As SqlCommand = New SqlCommand(Sqls)
    prevretcmd.Connection = con
    Dim rdr As SqlDataReader = prevretcmd.ExecuteReader()
    If rdr.Read() Then
    dteReturned = rdr("DateReturned").ToString()
    testReturnNo.Text = rdr("ReturnNo").ToString()
    retNo = Convert.ToInt32(testReturnNo.Text.Replace("T", "")) + 1
    returnNo.Text = "T" + retNo.ToString().PadLeft(1, "0"c)
    End If
    rdr.Close()
Catch
    retNo = 1
    returnNo.Text = retNo.ToString()
End Try

问题点拆解:

  1. SQL查询与读取字段不匹配
    你执行的第一个SQL只查了MAX(returnNo),结果里根本没有DateReturned字段,但代码里硬要读rdr("DateReturned"),这会直接触发异常跳转到Catch块。而Catch块里只把retNo设为1,returnNo.Text直接赋值成retNo.ToString(),完全没加前缀T,这就是入库只有纯整数的核心原因。

  2. 冗余的字符串处理
    数据库里的returnNo是整数类型,rdr("ReturnNo").ToString()得到的本来就是纯数字字符串,你调用Replace("T", "")完全多此一举,没有任何作用。

  3. SQL注入风险
    第二个SQL用字符串拼接ownerId='" & Session("rOwnerID") & "',属于高危写法,很容易被注入攻击,必须改成参数化查询。

修正后的代码示例:

Dim retNo As Integer = 0
Dim return_No As String = ""
Dim dteReturned As String = ""
Try
    ' 先查询最大的returnNo,用ISNULL处理空表情况
    Dim getMaxRetNoSql As String = "select ISNULL(MAX(returnNo), 0) from Trials"
    Using maxRetCmd As New SqlCommand(getMaxRetNoSql, con)
        Dim maxRetValue As Object = maxRetCmd.ExecuteScalar()
        retNo = Convert.ToInt32(maxRetValue) + 1
    End Using

    ' 参数化查询DateReturned,避免SQL注入
    Dim getDteSql As String = "select DateReturned from Trials where ownerId = @OwnerId"
    Using dteCmd As New SqlCommand(getDteSql, con)
        dteCmd.Parameters.AddWithValue("@OwnerId", Session("rOwnerID"))
        Dim dteValue As Object = dteCmd.ExecuteScalar()
        If dteValue IsNot DBNull.Value Then
            dteReturned = dteValue.ToString()
        End If
    End Using

    ' 生成带T的编号,PadLeft位数按需调整(比如4位变成T0001)
    returnNo.Text = "T" & retNo.ToString().PadLeft(4, "0"c)
    testReturnNo.Text = retNo.ToString()
Catch ex As Exception
    ' 异常时也生成带T的初始编号
    retNo = 1
    returnNo.Text = "T" & retNo.ToString().PadLeft(4, "0"c)
End Try

关键修正说明:

  • 分开查询两个字段,避免DataReader读取不存在的列触发异常
  • 用ExecuteScalar()获取单值结果,比DataReader更简洁高效
  • 所有SQL都改成参数化写法,彻底解决注入风险
  • 异常分支也添加前缀T,确保任何场景下都生成符合要求的编号
  • 去掉冗余的Replace("T", "")操作,减少无效代码

内容的提问来源于stack exchange,提问作者Tairoc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 03:05:16