这星期弄机房的时候,遇到了很多问题。每次完成一个功能要点击运行的时候都有一种紧张感,不过每次不出意料的都会报错。报错是一个不错的事情,学到了不少,现在看起来这些错误看起来不怎样,但当时还真是很头疼的呢。
这个是对上一篇博客“导出Excel”的补充。之前导出Excel的时候只点击了保存,能保存,偷偷高兴了一会呢。这次无意间点了取消,报错了。
解决方法很简单,就是判断一下保存文件对话框是不是点击的保存。
saveDialog.Filter = "Excel文件|*.xls" '文件类型
result = saveDialog.ShowDialog() '弹出保存文件对话框
If result = DialogResult.OK Then
fileName = saveDialog.FileName '将对话框中输入的文件名赋给filename
ms = New MemoryStream()
fs = New FileStream(fileName, FileMode.Create)
workBook.Write(ms) '写入数据
workBook.Write(fs)
fs.Close() '关闭文件
workBook = Nothing
ms.Close() '释放数据流
ms.Dispose()
End If
其实这个涉及到测试的内容,在测试的时候,要把每一个路径都测试到。
想实现一个功能:注册时,当选好用户类型后,自动检查数据库,如果有已退卡的,就把已退卡中的第一个卡号显示出来,如果没有已退卡的,就把所有卡号排序,把最后一个卡号加一显示出来。
卡号不是自己输入的,是自己显示出来的 。
存储过程是这样写的:
ALTER PROCEDURE [dbo].[PROC_Regist_ReturnID] AS declare @cardID integer ----声明变量 declare @recordCount integer BEGIN ---- 查询退卡的记录数 select @recordCount = COUNT (*)from Card where state = '已退卡' if @recordCount >0 ----查询卡表中已退卡的记录的第一条记录 select top 1 * from card where state = '已退卡' order by CardID ASC else ---查询卡表,以卡号升序排列 select top 1 * from card order by CardID DESC END
本来是这样写的:
select top 1 @cardID = CardID where state = '已退卡' order by CardID ASC
认为直接找出来符合条件的卡号比较方便,但是在D层报错了。因为sqlhelper里查找功能的返回都是datatable, 只把一个数放到表里会出错的,好像datatable只能查出数据库的记录,最少是一条记录。
所以就改成了select * , 然后再D层在从记录中取出卡号。
根据用户的不同类型注册向不同的表中添加数据。
ALTER PROCEDURE [dbo].[PROC_Regist_UpdateRecord]
@cardID integer, ----定义传参的类型
@balance decimal,
@studentID integer=null,
@name char(15)= null,
@gender char(10)=null,
@department char(15)=null,
@grade char(15)=null,
@class char(15)=null,
@remark char(30)=null,
@userID integer,
@computerID char(30),
@type char(15),
@date char(15),
@time char(15)
AS
BEGIN
if @type = '固定用户'
begin
---向Card表中添加注册卡的信息
insert into Card (CardID,Balance,UserID ,State ,BuyCartDate ,BuyCartTime ,type,ComputerID ) values ( @cardID , @balance, @userID,'未退卡',@date , @time ,@type ,@computerID)
---向student表中添加注册卡的学生信息
insert into Student (StudentID,CardID,Name ,Gender ,Department,Grade ,Class,Remark ) values (@studentID ,@cardID,@name,@gender,@department,@grade,@class,@remark)
---向recharge表中添加充值信息
insert into Recharge (CardID ,UserID ,RechargeCash ,RechargeDate ,RechargeTime ) values (@cardID,@userID,@balance,@date,@time)
end
else if @type = '临时用户'
---只向Card表中添加注册卡的信息
insert into Card (CardID,Balance,UserID ,State ,BuyCartDate ,BuyCartTime ,type,ComputerID ) values ( @cardID , @balance, @userID,'未退卡',@date , @time ,@type,@computerID)
END
临时用户用的参数比固定用户少,像学号,班级等临时用户都用不着。定义的像学号这样的属性在临时用户注册的时候报错说属性没有赋值。
解决方法就是对这些用不着的属性给个默认值。以上代码中就默认值设定的时null。
'strDate = DateTime.Now.ToString("yyyy-mm-dd")
'strTime = DateTime.Now.ToString("hh:mm:ss")
strDate = Format(Today(), "yyyy-MM-dd")
strTime = TimeOfDay()
'computerName = Environment.GetEnvironmentVariable("USERNAME") '获得计算机的用户名
computerName = System.Net.Dns.GetHostName.ToString() '获得计算机名
在获取系统时间的时候试了好多方法,但是don’t work。vb.net中获得当前日期的就只是today(),当前时间:timeofday() 非常简单移动的几个名字
另外把日期些成“yyyy-MM-dd”中,MM得是大写。
获得计算机名,一开始查的是引用一个Environment的对象,但是这个只能 获得你的用户名
然后又查到一个方法获得计算机名字但不是ip地址。
这个星期收获最大的就是注册功能的时候根据自己的想法实现自动显示卡号,对不同用于添加信息用不同的方法。其中遇到了好多问题,但是学到了好多,尤其是把自己的想法实现的时候有点小小的成就感。加油!