datetime.now 时间不准确
webfrom 访问 webapi
webapi 开启 thread
thread 执行 以GO分隔的SQL
sql 执行一句触发一次 ExectueLine
ExectueLine 写入日志 兼websocket(fleck)广播。。。这里有个datetime.now
webform 前端 websocket 接收消息也加上时间,,,
这个webform js new Date() 时间不等于ExectueLine Datetime.now
在本机测试,,,,
win7 .net 4.6 C# sql server 2008
这.net 莫名奇妙的坑跟BUG真太多了。。。。。。。估计我也得转JAVA了,,,不然得被坑死
申明下,,这个不等,最多可以差40几秒,根据执行时间需求。。
比如有个执行,,,数着执行了10秒ExectueLine Datetime.now,时间差显示,,,不到1秒。。。
执行12秒左右,,,竟然只有600多毫秒的时间差。。。。。。
开始执行SQL之后才会,,,,执行之前时间正常。。。。
这个测试结果是在获取 webconfig之后,,,无保存动作,,,,,记得后来把获取 webconfig注释了也一样的效果(这里不太确定)
private long d1 = DateTime.Now.Ticks;
/// <summary>
/// 执行事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void DbHelperSQL_ExecuteOneLine(object sender, ErrorEventArgs e)
{
var d2 = DateTime.Now.Ticks;
var mill = (d2 - d1)/10000;
d1 = d2;
SocketSevice.Instance.BroadcastMessage(DateTime.Now.TimeOfDay.ToString()+"。。。SQL执行。。。"+ mill.ToString()+"毫秒..." + e.ToString());
}
DbHelperSQL.ExecuteOneLine += DbHelperSQL_ExecuteOneLine;
DbHelperSQL.ExecuteSqlWithGo(sql);
DbHelperSQL.ExecuteOneLine -= DbHelperSQL_ExecuteOneLine;
/// <summary>
/// 执行完一句
/// </summary>
public static event System.EventHandler<ErrorEventArgs> ExecuteOneLine;
/// <summary>
/// 执行多行SQL语句,返回影响的记录数
/// 以GO分隔。就是管理工具里执行的脚本
/// Linyee 2017-09-19
/// </summary>
/// <param name="sql"></param>
public static int ExecuteSqlWithGo(String sql)
{
int effectedRows = 0;
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
SqlCommand cmd = new SqlCommand();
//cmd.CommandTimeout = 15;//15秒超时 创建数据库所需的时间大约15秒
cmd.Connection = conn;
try
{
//注: 此处以 换行_后面带0到多个空格_再后面是go 来分割字符串
String[] sqlArr = Regex.Split(sql.Trim(), "\r\n\\s*go", RegexOptions.IgnoreCase);
foreach (string strsql in sqlArr)
{
//System.Threading.Thread.Sleep(100);
if (strsql.Trim().Length > 1 && strsql.Trim() != "\r\n")
{
cmd.CommandText = strsql;
try
{
effectedRows = cmd.ExecuteNonQuery();
}catch(Exception ex)
{
AllErrors.Add(ex);
if (ExecuteOneLine != null)
ExecuteOneLine(cmd, new ErrorEventArgs() { Code=-2000, Message="发生错误!", ErrMessage = ex.Message,Description= strsql });
}
finally
{
if (ExecuteOneLine != null)
ExecuteOneLine(cmd,new ErrorEventArgs() { Message="执行完成!" });
}
}
}
}
catch (Exception E)
{
throw E;
}
finally
{
conn.Close();
WaitClosed(conn);
}
return effectedRows;
}
}