遍历记录以获得总数
Looping through Records to get total
我有一个网页,我想用 Visual Basic 来显示休假的总时间。所有日期都存储在 SQL 数据库中。
我希望它获取所有在 tblworkhours 中登录计算机且工作代码为 2 的休假员工的记录,然后我将计算休假的总时数。
我将其设置为计算 table 中的所有记录(工作正常)。然后我计算出该记录中的休息时间(工作正常)。我的问题 - 从该记录中获取信息后,我想转到下一条记录以获取休假时间,然后是下一条记录,依此类推,直到我获得该员工的总休假时间。我不知道如何让它转到下一条记录,下一条,等等,直到我到达记录的末尾。
示例 – 我的 select 计数语句显示我有 2 条记录,其中员工是登录的人,工作代码是休假 (2)。
第一个记录 - 开始日期 6/13/15 - 结束日期 6/15/15 - 所以,我计算 3 天或 24 小时
第二条记录 - 开始日期 6/20/15 - 结束日期 6/20/15 - 1 天或 8 小时
我的代码计算了多少条记录 - 2。Do Until 语句工作正常 - 它计算了 1 和 2,但它计算了第一条记录的 2 倍。而不是总共 32 小时(第一个记录小时加上第二个记录小时),我得到 48 小时(第一个记录小时 2x)。
仅供参考 - 我在增加时间方面没有问题。我的代码必须计算小时数,因为 table 只有日期和时间。
预先感谢您的帮助!
这是我的代码 - 我保留了工作正常的部分:
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
让我展示一下您可以使用 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
根据您在此代码中的 SQL 查询,您只有一条记录。没有第二条记录。
查询是 returning 一个 条记录,其中包含 count 条符合条件的所有记录。并且您正确地使用了 ExecuteScalar
方法来获取该值。
除了每次从 returned 整数中减去 1 之外,还不清楚你在最后循环的是什么。您当然不会循环访问任何数据记录。
如果需要全部记录,则select全部记录。
SELECT * FROM tblworkhours where Employee = " & rve & " and workcode = 2
然后将其用于 return 数据读取器并循环遍历那里的记录。
有人提到您应该使用参数。这是真的,但可能会分散您对此处主要问题的注意力。
我有一个网页,我想用 Visual Basic 来显示休假的总时间。所有日期都存储在 SQL 数据库中。
我希望它获取所有在 tblworkhours 中登录计算机且工作代码为 2 的休假员工的记录,然后我将计算休假的总时数。
我将其设置为计算 table 中的所有记录(工作正常)。然后我计算出该记录中的休息时间(工作正常)。我的问题 - 从该记录中获取信息后,我想转到下一条记录以获取休假时间,然后是下一条记录,依此类推,直到我获得该员工的总休假时间。我不知道如何让它转到下一条记录,下一条,等等,直到我到达记录的末尾。
示例 – 我的 select 计数语句显示我有 2 条记录,其中员工是登录的人,工作代码是休假 (2)。
第一个记录 - 开始日期 6/13/15 - 结束日期 6/15/15 - 所以,我计算 3 天或 24 小时
第二条记录 - 开始日期 6/20/15 - 结束日期 6/20/15 - 1 天或 8 小时
我的代码计算了多少条记录 - 2。Do Until 语句工作正常 - 它计算了 1 和 2,但它计算了第一条记录的 2 倍。而不是总共 32 小时(第一个记录小时加上第二个记录小时),我得到 48 小时(第一个记录小时 2x)。
仅供参考 - 我在增加时间方面没有问题。我的代码必须计算小时数,因为 table 只有日期和时间。 预先感谢您的帮助!
这是我的代码 - 我保留了工作正常的部分:
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
让我展示一下您可以使用 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
根据您在此代码中的 SQL 查询,您只有一条记录。没有第二条记录。
查询是 returning 一个 条记录,其中包含 count 条符合条件的所有记录。并且您正确地使用了 ExecuteScalar
方法来获取该值。
除了每次从 returned 整数中减去 1 之外,还不清楚你在最后循环的是什么。您当然不会循环访问任何数据记录。
如果需要全部记录,则select全部记录。
SELECT * FROM tblworkhours where Employee = " & rve & " and workcode = 2
然后将其用于 return 数据读取器并循环遍历那里的记录。
有人提到您应该使用参数。这是真的,但可能会分散您对此处主要问题的注意力。