如何给整数前置字符?代码仅返回无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
问题点拆解:
SQL查询与读取字段不匹配
你执行的第一个SQL只查了MAX(returnNo),结果里根本没有DateReturned字段,但代码里硬要读rdr("DateReturned"),这会直接触发异常跳转到Catch块。而Catch块里只把retNo设为1,returnNo.Text直接赋值成retNo.ToString(),完全没加前缀T,这就是入库只有纯整数的核心原因。冗余的字符串处理
数据库里的returnNo是整数类型,rdr("ReturnNo").ToString()得到的本来就是纯数字字符串,你调用Replace("T", "")完全多此一举,没有任何作用。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
相关产品推荐
相关产品推荐

