问题再现
之前的一个项目,需求是:根据输入的日期、开始时间、结束时间、项目、项目时长、连续发布天数生成项目数据。前端截图如图1所示。
图1. 前端截图
之前是使用PHP做的,核心代码如下所示:
for ($i = 0; $i < count($list); $i++) {
$date = $list[$i];
while ($startTime < $endTime) {
$Time_1 = date("H:i", $startTime);
$Time_2 = date("H:i", $startTime + $duration * 60); // 加时间(分钟)
$sql = $sql . "('$testId','$date','$projectName','$tips','$Time_1','$Time_2','$duration'),";
$startTime = $Time_2;
}
$startTime = $rStartTime;
$endTime = $rEndTime;
}
现在项目重构,选用.NET WebAPI对其进行重构,由于C#中没有date类型,所以处理起来有些麻烦,需要进行类型转换。
解决方案
数据类型选择
首先,核心代码主题不需要大的改动,改动主要在数据处理上。主要的变量及数据类型如表1所示。
表1. 主要变量及数据类型
变量 | 数据类型 |
---|---|
date | DateTime |
start_time | TimeSpan |
end_time | TimeSpan |
duration | int |
MySQL数据库连接
考虑到成本因素,项目采用的是MySQL数据库,一般简单的数据处理使用Entity Framework框架进行就可以,但是目前的这种需求采用原生sql语句更为方便。
// 连接数据库,执行sql语句
string constructorString = "server=XXXXXX;user id=XXXXXX;password=XXXXXX;port=XXXX;database=XXXXXX";
MySqlConnection myConnnect = new MySqlConnection(constructorString);
myConnnect.Open(); // 打开数据库连接
MySqlCommand myCmd = new MySqlCommand(sql, myConnnect); // 实例化
myCmd.ExecuteNonQuery(); // 执行sql语句
myConnnect.Close(); // 关闭数据库连接
完整代码
/// <summary>
/// 发布课程表class_list
/// </summary>
/// <param name="openid"></param>
/// <param name="date"></param>
/// <param name="start_time"></param>
/// <param name="end_time"></param>
/// <param name="object_id"></param>
/// <param name="duration"></param>
/// <returns></returns>
public static appReturnResult InsertClass(string openid, DateTime date, TimeSpan start_time, TimeSpan end_time, int days, int object_id, int duration)
{
appReturnResult obj = new appReturnResult();
try
{
// 获取coach_id
string str_1 = GetCoachInfoByOpenid(openid).data["coach_info"];
string str_2 = str_1.Substring(1, str_1.Length - 2);
int coach_id = JsonConvert.DeserializeObject<klc_coach_all>(str_2).id;
int school_id = JsonConvert.DeserializeObject<klc_coach_all>(str_2).school_id;
// 存储传入的start_tim,end_time
TimeSpan input_start_time = start_time;
TimeSpan input_end_time = end_time;
// 开始拼装原生sql语句对MySQL数据库进行INSERT
string sql = "INSERT INTO klc_classlist (date,start_time,end_time, coach_id, object_id, school_id, duration,gmt_create,gmt_modified) VALUES";
// 将连续发布的开始日期和结束日期装入list
var list = MySystem.DateList((ulong)new DateTimeOffset(date).ToUnixTimeSeconds(), (ulong)(new DateTimeOffset(date).ToUnixTimeSeconds() + days * 24 * 3600));
// 遍历list中的日期
for (var j = 0; j < list.Count(); j++)
{
DateTime new_date = Convert.ToDateTime(list[j]);
while (start_time < end_time)
{
var time_1 = start_time;
var time_2 = new TimeSpan(start_time.Hours, start_time.Minutes + duration, 0);
sql += String.Format("('{0}','{1}','{2}',{3},{4},{5},{6},'{7}','{8}'),", new_date.ToString("yyyy-MM-dd"), time_1, time_2, coach_id, object_id, school_id, duration, DateTime.Now.ToString("yyyy-MM-dd"), DateTime.Now.ToString("yyyy-MM-dd"));
start_time = time_2;
}
// 一个日期循环完成后重置start_time和end_time
start_time = input_start_time;
end_time = input_end_time;
}
// 去除拼装完成的sql语句最后的逗号
sql = sql.Substring(0, sql.Length - 1);
// 连接数据库,执行sql语句
string constructorString = "server=XXXXXX;user id=XXXXXX;password=XXXXXX;port=XXXX;database=XXXXXX";
MySqlConnection myConnnect = new MySqlConnection(constructorString);
myConnnect.Open(); // 打开数据库连接
MySqlCommand myCmd = new MySqlCommand(sql, myConnnect); // 实例化
myCmd.ExecuteNonQuery(); // 执行sql语句
myConnnect.Close(); // 关闭数据库连接
// 返回信息
obj.message = "生成课程表成功";
obj.result = true;
}
catch (Exception e)
{
obj.message = "生成课程表失败";
obj.addValue("error", e.ToString());
obj.result = false;
}
return obj;
}