我有一个网页,我想显示使用visual basic拍摄的总休假时间。所有日期都存储在SQL数据库中。
我想让它获取tblworkhours中的所有记录,这些记录是员工登录到计算机并且工作代码为2的假期,然后我将计算总休假时间。
我把它设置为计算表中的所有记录(工作正常)。然后我找出该记录中的休息时间(工作正常)。我的问题 - 在我完成从该记录中获取信息后,我想转到下一条记录,让它休息几小时,然后是下一小时,依此类推,直到我为该员工休息一小时。我无法弄清楚如何让它去下一个记录,然后是下一个记录,依此类推,直到我到达记录的末尾。
示例 - 我的选择计数语句显示我有2条记录,其中员工是谁登录,工作代码是休假(2)。
第1条记录 - 2015年6月13日开始日期 - 2015年6月15日结束日期 - 所以,我计算3天或24小时
第2条记录 - 2015年6月20日开始日期 - 2015年6月20日结束日期 - 1天或8小时
我的代码计算了多少条记录 - 2. Do Until语句工作正常 - 它计算1和2,但它计算第一条记录2x。而不是总共32小时(第1小时加上第2小时),我得到48小时(第1小时2倍)。
仅供参考 - 我在增加时间方面没有问题。我的代码必须计算小时数,因为该表只有日期和时间。 在此先感谢您的帮助!
这是我的代码 - 我保留了正常工作的部分:
Dim sqlConnection As New SqlConnection("Data Source=WillSQL\ict2;Initial Catalog=TimeSQL;Integrated Security=SSPI")
Dim commandvct As New SqlCommand
Dim returnvct As Object
commandvct.CommandText = "Select count(workhoursid) from tblworkhours where Employee = " & rve & " and workcode = 2"
'workcode 2 is vacation. Count works fine.
commandvct.CommandType = CommandType.Text
commandvct.Connection = sqlConnection
sqlConnection.Open()
returnvct = commandvct.ExecuteScalar
sqlConnection.Close()
Do Until returnvct = 0
returnvct = returnvct - 1
' Deleted code that gets how many hours - this code works fine.
Loop
答案 0 :(得分:1)
让我展示一下使用Sql语言可以做些什么。在本例中,我将仅使用SQL总结休假时间
create table A (name varchar(100), bdate datetime, edate datetime)
-- I set dates to string, it will convert to rounded dates.
insert into a values ('AAA', '02/05/2015', '02/05/2015') -- 1 day / 8 hrs
insert into a values ('AAA', '06/05/2015', '06/09/2015') -- 5 days / 40 hrs
insert into a values ('BBB', '02/05/2014', '02/05/2014') -- 1 day / 8 hrs
insert into a values ('BBB', '06/05/2014', '06/07/2014') -- 3 days / 24 hrs
-- But when taking dates out, you need to cut off hours, minutes, etc - use CAST
select name, SUM(case
when CAST(bdate as date) = CAST(edate as date) Then 8
else (datediff(day, CAST(bdate as date), CAST(edate as date)) + 1) * 8 -- +1 to make date inclusive
end) as vacaHours
from a
where name = 'AAA' -- comment this and all people will return
group by name
仅AAA
name vacaHours
AAA 48
所有
的输出 name vacaHours
AAA 48
BBB 32
现在,您可以打开DataReader并将值读入程序
' They said, sql injection words... this is what you do - notice alias for count
cmd.CommandText = "Select count(workhoursid) as count from tblworkhours where Employee = @1 and workcode = @2"
cmd.Parameters.AddWithValue("@1", rve)
cmd.Parameters.AddWithValue("@2", 2)
' some code here
cmd.CommandType = CommandType.Text
' some code here
Using reader As IDataReader = cmd.ExecuteReader()
' do something with each record
While reader.Read()
myvar = Convert.ToInt32(reader("count"))
End While
End Using
答案 1 :(得分:1)
您只有一条基于此代码中的SQL查询的记录。没有第二条记录。
查询返回一个记录,其中包含符合条件的所有记录的计数。并且您正确使用ExecuteScalar
方法来获取该值。
除了每次从返回的整数中减去一个之外,还不清楚你在最后循环的是什么。你肯定没有遍历任何数据记录。
如果您需要所有记录,请选择所有记录。
SELECT * FROM tblworkhours where Employee = " & rve & " and workcode = 2
然后使用它返回一个datareader并遍历那里的记录。
有人提到你应该使用参数。这是真的,但可能会分散你的主要问题。