关于vb.net自动生成编号的问题

diamondcong 2020-05-08 03:23:40
开发环境VS2019+SQL2012
本人想实现自动生成个人编号,格式为yymmdd(即当天日期)+xxx
大致想法是:
1.在数据库中模糊查询编号带有是yymmdd的最大值记录
2.如果没有返回值,则新编号是yymmdd+001
3.如果有返回值,取返回值的后四位,做加1处理,得到答新编号
代码如下
 Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load

Dim cnStr As String = " Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=xxxx;Data Source=xxxx"
cn = New SqlConnection(cnStr) '连接数据库
cn.Open()

Dim id, nowdata As String
nowdata = Format(DateTime.Now, "yyMMdd") '获取今天日期
'第一步,模糊查询现有最大编号
Dim str As String = "Select max(PatID) from current_Patient where PatID like'%" & nowdata & "%'"
da = New SqlDataAdapter(str, cn)
ds.Clear()
da.Fill(ds, "ss号")

DataGridView1.DataSource = ds.Tables("ss号") '测试查询编号

If ds.Tables("ss号").Rows.Count = 0 Then '判断编号是否为当天新号

id = Format(DateTime.Now, "yyMMdd").ToString * 1000 '第二步,没有返回值,建立新编号
TextBox2.Text = id + 1
Else
TextBox2.Text = ds.Tables("ss号").Rows(0).Item(0).ToString + 1 '有返回值,最大值编号+1
End If
cn.Close()

End Sub

理论上 没有新编号,则Select max(PatID) 返回的内容应该是这样

现在的问题是 Select max(PatID) 返回的内容是一个空格

导致了后面 ds.Tables("ss号").Rows.Count = 0的判断一直为false
希望有懂得这方面知识的大神帮帮忙,万分感谢!!!
...全文
416 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
diamondcong 2020-05-11
  • 打赏
  • 举报
回复
引用 3 楼 三楼一郎 的回复:
那么你的语句究竟是”select partid from ……“ 还是 ”select max(partid) from ……“呢,你的代码里写的是select max(partid),查询分析器里又是select partid,这两个语句返回的结果并不一样

select partid from ……无符合条件记录时返回的是空记录集,你可以通过.rows.count是不是等于0来判断

select max(partid) from ……无符合条件记录时通常返回一条值为NULL的记录,所以你不能使用.rows.count=0来判断,而只能通过.rows(0).item(0)的值是不是system.dbnull.value对象来判断,既然你要使用.rows(0).item(0)去取返回的第一个记录那么首先必须得保证
.rows.count不等于0,否则就会报未将对象引用到实例的错

这么简单的问题不知道你在搅和啥呢。

确实是我写错了,当时我尝试用.rows(0).item(0)的值是不是system.dbnull.value对象来判断,结果还是未找到对象引用
现在已经改为另外一种方法去编写编号了
三楼の郎 2020-05-10
  • 打赏
  • 举报
回复
那么你的语句究竟是”select partid from ……“ 还是 ”select max(partid) from ……“呢,你的代码里写的是select max(partid),查询分析器里又是select partid,这两个语句返回的结果并不一样 select partid from ……无符合条件记录时返回的是空记录集,你可以通过.rows.count是不是等于0来判断 select max(partid) from ……无符合条件记录时通常返回一条值为NULL的记录,所以你不能使用.rows.count=0来判断,而只能通过.rows(0).item(0)的值是不是system.dbnull.value对象来判断,既然你要使用.rows(0).item(0)去取返回的第一个记录那么首先必须得保证 .rows.count不等于0,否则就会报未将对象引用到实例的错 这么简单的问题不知道你在搅和啥呢。
diamondcong 2020-05-09
  • 打赏
  • 举报
回复
引用 1 楼 X-i-n 的回复:

da = New SqlDataAdapter(str, cn)
这一行中断,看下监视里 str的实际内容是什么。
然后,把str这句SQL复制到sql server里运行一下看看结果。


把str复制到sqlserver中,没有新编号时结果返回是空值NULL(在VS监视器也是这样)

这种情况估计是If ds.Tables("ss号").Rows.Count = 0判断无法识别NULL,所以一直是false
我的另外一个贴有人提到了https://bbs.csdn.net/topics/396524152
X-i-n 2020-05-08
  • 打赏
  • 举报
回复
在 da = New SqlDataAdapter(str, cn) 这一行中断,看下监视里 str的实际内容是什么。 然后,把str这句SQL复制到sql server里运行一下看看结果。

1,216

社区成员

发帖
与我相关
我的任务
社区描述
VB 数据库(包含打印,安装,报表)
社区管理员
  • 数据库(包含打印,安装,报表)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧