// 创建 SELECT 命令 protected override CommandDefine ParseSelectCommand <T>(DbQueryableInfo_Select <T> qQuery, int indent = 0) { // 说明: // 1.OFFSET 前必须要有 'ORDER BY',即 'Skip' 子句前必须使用 'OrderBy' 子句 // 2.在有统计函数的<MAX,MIN...>情况下,如果有 'Distinct' 'GroupBy' 'Skip' 'Take' 子句,则需要使用嵌套查询 // 3.'Any' 子句将翻译成 IF EXISTS... // 4.分组再分页时需要使用嵌套查询,此时子查询不需要 'OrderBy' 子句,但最外层则需要 // 5.'Skip' 'Take' 子句视为语义结束符,在其之后的子句将使用嵌套查询 bool willNest = qQuery.HaveDistinct || qQuery.GroupBy != null || qQuery.Skip > 0 || qQuery.Take > 0; bool useStatis = qQuery.Statis != null; bool groupByPaging = qQuery.GroupBy != null && qQuery.Skip > 0; // 分组分页 bool useOrderBy = (!useStatis || qQuery.Skip > 0) && !qQuery.HaveAny; // 没有统计函数或者使用 'Skip' 子句,则解析OrderBy ExpressionVisitorBase visitor = null; TableAliasCache aliases = this.PrepareAlias <T>(qQuery); string statName = string.Empty; CommandDefine_Select sc = new CommandDefine_Select(this.EscCharLeft, this.EscCharRight, aliases); SqlBuilder jf = sc.JoinFragment; SqlBuilder wf = sc.WhereFragment; if (groupByPaging) { indent = indent + 1; } jf.Indent = indent; #region 嵌套查询 if (useStatis && willNest) { // SELECT jf.Append("SELECT "); jf.AppendNewLine(); // SELECT COUNT(1) visitor = new StatisExpressionVisitor(this, aliases, qQuery.Statis, qQuery.GroupBy, "t0"); visitor.Write(jf); statName = (visitor as StatisExpressionVisitor).ColumnName; sc.AddNavigation(visitor.Navigations); // SELECT COUNT(1) FROM jf.AppendNewLine(); jf.Append("FROM ( "); indent += 1; jf.Indent = indent; } #endregion // SELECT 子句 if (jf.Indent > 0) { jf.AppendNewLine(); } if (qQuery.HaveAny) { jf.Append("IF EXISTS("); indent += 1; jf.Indent = indent; jf.AppendNewLine(); } jf.Append("SELECT "); if (useStatis && !willNest) { // 如果有统计函数,并且不是嵌套的话,则直接使用SELECT <MAX,MIN...>,不需要解析选择的字段 jf.AppendNewLine(); visitor = new StatisExpressionVisitor(this, aliases, qQuery.Statis, qQuery.GroupBy); visitor.Write(jf); sc.AddNavigation(visitor.Navigations); } else { // DISTINCT 子句 if (qQuery.HaveDistinct) { jf.Append("DISTINCT "); } // TOP 子句 if (qQuery.Take > 0 && qQuery.Skip == 0) { jf.AppendFormat("TOP({0})", qQuery.Take); } // Any if (qQuery.HaveAny) { jf.Append("TOP 1 1"); } #region 择字段 if (!qQuery.HaveAny) { // SELECT 范围 visitor = new ColumnExpressionVisitor(this, aliases, qQuery.Expression, qQuery.GroupBy); visitor.Write(jf); sc.Columns = (visitor as ColumnExpressionVisitor).Columns; sc.NavDescriptors = (visitor as ColumnExpressionVisitor).NavDescriptors; sc.AddNavigation(visitor.Navigations); // 如果有统计,选择列中还要追加统计的列 if (useStatis && willNest) { string columnName = statName; if (!string.IsNullOrEmpty(columnName) && !sc.Columns.ContainsKey(columnName)) { if (sc.Columns.Count > 0) { jf.Append(","); } visitor = new ColumnExpressionVisitor(this, aliases, qQuery.Statis, qQuery.GroupBy, true); visitor.Write(jf); sc.Columns.Add(columnName, new Column { Name = columnName, Duplicate = 1 }); sc.AddNavigation(visitor.Navigations); } } // 如果分组后再分页,此时需要在原先的选择字段上再加上 'OrderBy' 子句指定的字段,外层的分页时需要用到这些排序字段 if (qQuery.OrderBy.Count > 0 && useOrderBy && groupByPaging) { if (sc.Columns.Count > 0) { jf.Append(","); } for (int i = 0; i < qQuery.OrderBy.Count; i++) { visitor = new ColumnExpressionVisitor(this, aliases, qQuery.OrderBy[i], qQuery.GroupBy, true); visitor.Write(jf); sc.AddNavigation(visitor.Navigations); if (i < qQuery.OrderBy.Count - 1) { jf.AppendNewLine(","); } } } } #endregion } // FROM 子句 jf.AppendNewLine(); jf.Append("FROM "); if (qQuery.Subquery != null) { // 子查询 jf.Append("("); CommandDefine define = this.ParseSelectCommand <T>(qQuery.Subquery as DbQueryableInfo_Select <T>, indent + 1); jf.Append(define.CommandText); jf.AppendNewLine(); jf.Append(")"); } else { jf.AppendMember(TypeRuntimeInfoCache.GetRuntimeInfo(qQuery.FromType).TableName); } jf.Append(" t0 "); if (!string.IsNullOrEmpty(DbQueryProvider.NOLOCK)) { jf.Append(DbQueryProvider.NOLOCK); } // LEFT<INNER> JOIN 子句 visitor = new JoinExpressionVisitor(this, aliases, qQuery.Join); visitor.Write(jf); wf.Indent = jf.Indent; // WHERE 子句 visitor = new WhereExpressionVisitor(this, aliases, qQuery.Where); visitor.Write(wf); sc.AddNavigation(visitor.Navigations); // GROUP BY 子句 visitor = new GroupByExpressionVisitor(this, aliases, qQuery.GroupBy); visitor.Write(wf); sc.AddNavigation(visitor.Navigations); // HAVING 子句 visitor = new HavingExpressionVisitor(this, aliases, qQuery.Having, qQuery.GroupBy); visitor.Write(wf); sc.AddNavigation(visitor.Navigations); // ORDER 子句 if (qQuery.OrderBy.Count > 0 && useOrderBy && !groupByPaging) { visitor = new OrderByExpressionVisitor(this, aliases, qQuery.OrderBy, qQuery.GroupBy); visitor.Write(wf); sc.AddNavigation(visitor.Navigations); } #region 分页查询 if (qQuery.Skip > 0 && !groupByPaging) { if (qQuery.OrderBy.Count == 0) { throw new XfwException("The method 'OrderBy' must be called before the method 'Skip'."); } wf.AppendNewLine(); wf.Append("OFFSET "); wf.Append(qQuery.Skip); wf.Append(" ROWS"); if (qQuery.Take > 0) { wf.Append(" FETCH NEXT "); wf.Append(qQuery.Take); wf.Append(" ROWS ONLY "); } } #endregion #region 嵌套查询 if (useStatis && willNest) { string inner = sc.CommandText; indent -= 1; jf.Indent = indent; jf.AppendNewLine(); jf.Append(" ) t0"); } #endregion #region 分组分页 if (groupByPaging) { SqlBuilder builder = new SqlBuilder(this.EscCharLeft, this.EscCharRight); // SELECT int index = -1; builder.Append("SELECT "); foreach (var kvp in sc.Columns) { index += 1; builder.AppendNewLine(); builder.AppendMember("t0", kvp.Key); if (index < sc.Columns.Count - 1) { builder.Append(","); } } builder.AppendNewLine(); builder.Append("FROM ( "); string inner = sc.CommandText; //jf.Replace(Environment.NewLine, Environment.NewLine + SqlBuilder.TAB); jf.Insert(0, builder); indent -= 1; jf.Indent = indent; jf.AppendNewLine(); jf.Append(" ) t0"); // 排序 if (qQuery.OrderBy.Count > 0 && useOrderBy) { visitor = new OrderByExpressionVisitor(this, aliases, qQuery.OrderBy, null, "t0"); visitor.Write(jf); } // 分页 if (qQuery.Skip > 0) { jf.AppendNewLine(); jf.Append("OFFSET "); jf.Append(qQuery.Skip); jf.Append(" ROWS"); if (qQuery.Take > 0) { jf.Append(" FETCH NEXT "); jf.Append(qQuery.Take); jf.Append(" ROWS ONLY "); } } } #endregion // 'Any' 子句 if (qQuery.HaveAny) { string inner = sc.CommandText; indent -= 1; jf.Indent = indent; jf.AppendNewLine(); jf.Append(") SELECT 1 ELSE SELECT 0"); } // UNION 子句 if (qQuery.Union != null && qQuery.Union.Count > 0) { string inner = sc.CommandText; for (int index = 0; index < qQuery.Union.Count; index++) { jf.AppendNewLine(); jf.AppendNewLine("UNION ALL"); CommandDefine define = this.ParseSelectCommand <T>(qQuery.Union[index] as DbQueryableInfo_Select <T>); jf.Append(define.CommandText); } } return(sc); }
/* * public static void initVLC() * { * if (Environment.Is64BitOperatingSystem) * { * // Set libvlc.dll and libvlccore.dll directory path * VlcContext.LibVlcDllsPath = @"VLC\"; * * // Set the vlc plugins directory path * VlcContext.LibVlcPluginsPath = @"VLC\plugins"; * } * else * { * // Set libvlc.dll and libvlccore.dll directory path * VlcContext.LibVlcDllsPath = @"VLC\"; * * // Set the vlc plugins directory path * VlcContext.LibVlcPluginsPath = @"VLC\plugins"; * } * * // Ignore the VLC configuration file * VlcContext.StartupOptions.IgnoreConfig = true; #if DEBUG * // Enable file based logging * VlcContext.StartupOptions.LogOptions.LogInFile = true; * * // Shows the VLC log console (in addition to the applications window) * VlcContext.StartupOptions.LogOptions.ShowLoggerConsole = true; #else * VlcContext.StartupOptions.LogOptions.ShowLoggerConsole = false; * VlcContext.StartupOptions.LogOptions.LogInFile = false; #endif * // Set the log level for the VLC instance * VlcContext.StartupOptions.LogOptions.Verbosity = VlcLogVerbosities.Debug; * VlcContext.StartupOptions.AddOption("--ffmpeg-hw"); * // Disable showing the movie file name as an overlay * VlcContext.StartupOptions.AddOption("--no-video-title-show"); * VlcContext.StartupOptions.AddOption("--rtsp-tcp"); * VlcContext.StartupOptions.AddOption("--rtsp-mcast"); * // VlcContext.StartupOptions.AddOption("--rtsp-host=192.168.10.35"); * // VlcContext.StartupOptions.AddOption("--sap-addr=192.168.10.35"); * VlcContext.StartupOptions.AddOption("--rtsp-port=8554"); * VlcContext.StartupOptions.AddOption("--rtp-client-port=8554"); * VlcContext.StartupOptions.AddOption("--sout-rtp-rtcp-mux"); * VlcContext.StartupOptions.AddOption("--rtsp-wmserver"); * * * VlcContext.StartupOptions.AddOption("--file-caching=18000"); * VlcContext.StartupOptions.AddOption("--sout-rtp-caching=18000"); * VlcContext.StartupOptions.AddOption("--sout-rtp-port=8554"); * VlcContext.StartupOptions.AddOption("--sout-rtp-proto=tcp"); * VlcContext.StartupOptions.AddOption("--network-caching=1000"); * * VlcContext.StartupOptions.AddOption("--vout-filter=wall"); * VlcContext.StartupOptions.AddOption("--wall-cols=2"); * VlcContext.StartupOptions.AddOption("--wall-rows=2"); * * // Pauses the playback of a movie on the last frame * VlcContext.StartupOptions.AddOption("--play-and-pause"); * VlcContext.CloseAll(); * // Initialize the VlcContext * VlcContext.Initialize(); * } */ private void Application_Startup(object sender, StartupEventArgs e) { bool login = true; Rows = new List <CsvRow>(); RowsSend = new List <CsvRow>(); Fonts = ExCss.ReadFile(@"Asset\Fonts\font-awesome.min.css"); Timethread = new Thread(CheckTimeFunctionThread); Timethread.IsBackground = true; listSerialPort = new List <SerialPort>(); QueueCMD = new Queue <string>(); m_bInitSDK = CHCNetSDK.NET_DVR_Init(); if (m_bInitSDK == false) { MessageBox.Show("NET_DVR_Init error!"); return; } if (!File.Exists(_FILE_CSV_COMMAND)) { File.Create(_FILE_CSV_COMMAND); } if (!File.Exists(_FILE_Send_COMMAND)) { File.Create(_FILE_Send_COMMAND); } // initVLC(); DefineCommand = CommandDefine.Read(_FILE_DEFINE_COMMAND); setting = Config.Read(_FILE_Config); if (!Directory.Exists("Data")) { DirectoryInfo di = Directory.CreateDirectory("Data"); di.Attributes = FileAttributes.Directory | FileAttributes.Hidden; } if (!Directory.Exists(setting.Folder)) { Directory.CreateDirectory(setting.Folder); } curDate = DateTime.Now; Timethread.Start(); curFolder = System.IO.Path.Combine(setting.Folder, this.curDate.ToString("dd-MM-yyyy")); if (!Directory.Exists(curFolder)) { Directory.CreateDirectory(curFolder); } DataUser = Users.read(@"Data\User.mtc"); if (DataUser == null) { DataUser = new Users(); User root = new User("root", 1); root.Pass = "******".toMD5(); root.type = 0; root.FullName = "Root"; DataUser.Add(root); Users.write(_FILE_User_Data, DataUser); } DataCamera = Cameras.Read(_FILE_Camera_Data); DataPreset = Presets.Read(_FILE_PRESET_DATA); DataAlarm = Alarms.Read(_FILE_Alarm_Data); this.checkFile = new Thread(checkFileFunctionThread); checkFile.IsBackground = true; this.checkFile.Start(); #if DEBUG if (DataCamera.Count == 0) { Camera camera = new Camera("192.168.10.199"); camera.name = "Camera Demo"; camera.channel = 1; camera.port = 8000; camera.admin = "admin"; camera.pass = "******"; camera.icon = "fa-video-camera"; DataCamera.Add(camera); } if (DataUser.Datas.Count < 2) { User root = new User("admin", 2); root.Pass = "******".toMD5(); root.type = 1; root.FullName = "Admin"; DataUser.Add(root); User root2 = new User("htdm", 3); root2.Pass = "******".toMD5(); root2.type = 2; root2.FullName = "Camera"; DataUser.Add(root2); Users.write(_FILE_User_Data, DataUser); } #endif var listCom = getListCOM(); if (listCom.Length > 0) { foreach (string i in listCom) { try { SerialPort serialPort = new SerialPort(); serialPort = new SerialPort(); serialPort.openCOM(i, BAUDRATE, DATABITS, StopBits.One); serialPort.DataReceived += serialPort_DataReceived; serialPort.sendCommand("#0$"); listSerialPort.Add(serialPort); } catch (Exception) { } } } Map = Map.Read(_FILE_Map_Data); for (int i = 0; i != e.Args.Length; i += 2) { if (e.Args[i] == "-u") { string hash = e.Args[i + 1]; User u = App.DataUser.Login(hash); if (u != null) { login = false; App.User = u; } } else if (e.Args[i] == "-mode") { Mode = (Camera_Final.Mode) int.Parse(e.Args[i + 1]); } } if (login) { this.MainWindow = new Login(); } else { this.MainWindow = new MainWindow(); } this.MainWindow.Show(); }