我正在研究生物识别考勤系统。设备会根据其中注册的用户数生成这些User punch logs
。现在问题是,每当我尝试将硬件日志与其通信SDK同步时,每个月都会自动生成一个新表来存储设备日志。
例如:
对于2017年7月的所有User punches
,都有一个名为DeviceLogs_7_2017
的SQL表。同样,对于八月,有DeviceLogs_8_2017
。
现在我正在使用Visual Studio 2012和C#创建一个不同的前端(除了系统提供的软件),我需要从前端读取这些日志以使用某些公式计算出勤率。
现在我不知道如何阅读它们,因为它们每个月都在变化。
可以使用某些存储过程查询中的变量来完成吗?
表格说明如下:
DeviceLogId int NULL
DownloadDate datetime NULL
DeviceId int NULL
UserId nvarchar 50
LogDate datetime NULL
Direction nvarchar 100
AttDirection nvarchar 255
C1 nvarchar 255
C2 nvarchar 255
C3 nvarchar 255
C4 nvarchar 255
C5 nvarchar 255
C6 nvarchar 255
C7 nvarchar 255
WorkCode nvarchar 100
UpdateFlag int NULL
在此表格之外,我想要UserID
,LogDate
和WorkCode
列中的数据。请帮助我让我的头脑朝着解决这个问题的方向努力。
答案 0 :(得分:0)
首先看到这个以打开与DB How to directly execute SQL query in C#? Have example batch file
的连接以下是上述链接的修改代码(更改连接字符串)。您可以使用此代码。您可以使用其他日期,而不是使用Now()
。例如,如果您总是要上个月提取数据,则可以执行DateTime dt = DateTime.Now().AddMonths(-1)
:
string queryString = "SELECT UserID, LogDate, WorkCode from DeviceLogs_" + Month(DateTime.Now()) + "_" + Year(DateTime.Now());
string connectionString = "Server=.\PDATA_SQLEXPRESS;Database=;User Id=sa;Password=2BeChanged!;";
using (SqlConnection connection = new SqlConnection(connectionString))
{
SqlCommand command = new SqlCommand(queryString, connection);
connection.Open();
SqlDataReader reader = command.ExecuteReader();
try
{
while (reader.Read())
{
Console.WriteLine(String.Format("{0}, {1}, {2}",
reader["UserId"],reader["LogDate"]), reader["WorkCode"]));// etc
}
}
finally
{
// Always call Close when done reading.
reader.Close();
}
}
上面代码的第一行是您需要修改以使用用户选择的from和to日期创建具有生成的表名的联合。您需要重新学习SQL语言以及如何使用连接和联合。或者您可以在循环中触发多个查询(如下面的注释所示),每个查询一个表,以C#代码收集返回的数据并显示。看来有些非常聪明的人设计了数据库。一个理智的人不会在不同月份创建不同的表,而是一个表就足够了,因为该表有LogDate
列