2016-01-29 21 views
0

一些我有一个例程,从SQL数据库的INT列得到了MAX值,应该是“1”,以增加这个数字。问题是,当它运行时,它似乎是第一次工作,但每次之后,例程继续返回'1'。我正在查找的值叫做maxrptnum。例程如下:试图增加从SQL数据库查询

Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    Dim conn As New SqlConnection("Data Source=server;Initial Catalog=forms;User ID=user;Password=password") 
    Dim cmd As New SqlCommand 

    cmd.CommandText = "select max(increment) from forma where rptnum like '[email protected]%'" 
    cmd.Parameters.Clear() 
    cmd.Parameters.Add("@inspinit", SqlDbType.Char).Value = inspinit.Text 
    cmd.Connection = conn 
    conn.Open() 
    maxrptnum = cmd.ExecuteScalar() & String.Empty 
    If maxrptnum = String.Empty Then 
     maxrptnum = 1 
     Me.rptnum.Text = ("A" + "-" + Me.inspinit.Text + "-" + maxrptnum) 
    Else 
     Me.rptnum.Text = ("A" + "-" + Me.inspinit.Text + "-" + (maxrptnum + 1)) 
    End If 

    conn.Close() 
    saverpt() 
End Sub 

的maxrptnum被声明为一个字符串,但DB类型为int。这可能是问题,但不知道如何解决。

+2

什么是增量的数据类型?这看起来很像你想要创建自己的递增号码。不要这样做。有这么多的挑战和细微差别,你永远不会做对。这就是身份的用途。它已经做到了这一点,并处理所有边界情况下的并发性,所以你不必这样做。如果你在2012+以上,你也可以使用序列。 –

+0

它也看起来像你可能试图使用字母数字标识。不要那样做。如果用户或其他人需要预先填写字母,则可以使用代码轻松完成此操作。它可以防止您能够使用AI /身份栏...请参阅注释1 – Plutonix

回答

1

正如上面的评论中所解释的,你通常不应该做这个操作。桌面上的并发会给你带来麻烦。
但是,你的问题在于查询和添加参数占位符的方式。将它放在单引号之间可以将所有内容转换为文字字符串。

你应该写

cmd.CommandText = @"select max(increment) 
        from forma where rptnum like @inspinit" 

,然后,当你添加参数,

cmd.Parameters.Add("@inspinit", SqlDbType.Char).Value = "a-" + inspinit.Text + "-%" 

最后检索值的代码可以直接写入使用一个整数,并在未转化的一切串

Dim maxrptnum As Integer 
Dim result = cmd.ExecuteScalar() 
If result Is Nothing Then 
    maxrptnum = 1 
Else 
    maxrptnum = Convert.ToInt32(result) + 1 
End If 
Me.rptnum.Text = ("A-" & Me.inspinit.Text & "-" & maxrptnum.ToString())