/// <summary> /// 将数据写入数据库 /// </summary> /// <param name="dataString"></param> private static void WriteIntoDatabase(byte[] dataByte, DateTime dateTime, OleDbConnection oleDbCon) { DatabaseCore dataCore = new DatabaseCore(oleDbCon); //数据库列名 string[] colName = { "ID", "Year", "Month", "Day", "Hour", "Minute", "Second", "WindSpeed(m/s)", "AirTemperayure", "Rasiation(W/m2)", "WindDirection", "Humidity(%RH)", "Component2Temperature", "Component3Temperature", "Component4Temperature", "Component5Temperature","Component6Temperature", }; //string colString = "Year, Month, Day, Hour, Minute, Second, WindSpeed(m/s), AirTemperayure, Rasiation(W/m2), WindDirection, Humidity(%RH), Component1Temperature, Component2Temperature, Component3Temperature,Component4Temperature, Component5Temperature, Component6Temperature"; //string valueString = "";//要插入的语句 Dictionary<string, string> QXdataDic = new Dictionary<string, string>(); //添加日期数据 int year = dateTime.Year; int month = dateTime.Month; int day = dateTime.Day; int hour = dateTime.Hour; int minute = dateTime.Minute; int second = dateTime.Second; int[] time = { year, month, day, hour, minute, second }; for (int i = 0; i < time.Length; i++) { QXdataDic.Add(colName[i+1], time[i].ToString()); //第一列不添加 } //添加气象仪数据 int[] index = { 1, 3, 6, 7, 9, 11, 12, 13, 14, 15 }; //有效通道 double[] precision = { 0.1, 0.1, 1.0, 1.0, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, }; //每个有效通道数值的精度 for (int i = 0; i < index.Length; i++) { int k = (index[i] + 1) * 2; //前面两个字内容无效, 所以+2 , 但由于dataByte的下标从零开始, 所以要-1 即: (index[i]-1+2), 每个数据占两个字节, 所以*2 int value = (dataByte[k] << 8) + dataByte[k + 1]; //高位左移8位地位 = 实际值 if (value >> 15 == 1) //如果最高位为1, 则取补, 否则不改变 { value = -(0x10000 - value); } double dvalue = value * precision[i]; //取精度 QXdataDic.Add(colName[i + 7], dvalue.ToString()); } try { dataCore.InsertData("MeteorologicalData", QXdataDic); //插入数据 } catch (Exception ex) { throw ex; } }
public static bool Analy(DateTime time, List<KeyValuePair<byte, bool>> messageQueue, OleDbConnection oleDbCon, int componentId, int azimuth, int obliquity) { DatabaseCore dataCore = new DatabaseCore(oleDbCon); Dictionary<string, string> IVdataDic = new Dictionary<string, string>(); byte[] byteArray = messageQueue.Select(b => b.Key).ToArray(); string byteStr = Transfer.BaToS(byteArray); string Regex = @"AA0012019001([A-Za-z0-9_]{800})CC33C33CAA0012029090([A-Za-z0-9_]{800})CC33C33CAA0012091100([A-Za-z0-9_]{34})CC33C33C"; Regex Re = new Regex(Regex); if (Re.IsMatch(byteStr)) { Match byteMatch = Re.Match(byteStr); string reasultStr = byteMatch.Groups[3].Value; int Tep = Convert.ToInt32(Inverse(reasultStr.Substring(2, 4)), 16); double Vo = Convert.ToInt32(Inverse(reasultStr.Substring(10, 4)), 16) / 10.0; double Is = Convert.ToInt32(Inverse(reasultStr.Substring(14, 4)), 16) / 100.0; double Vm = Convert.ToInt32(Inverse(reasultStr.Substring(18, 4)), 16) / 10.0; double Im = Convert.ToInt32(Inverse(reasultStr.Substring(22, 4)), 16) / 100.0; double Pm = Convert.ToInt64(Inverse(reasultStr.Substring(26, 8)), 16) / 10.0; int index = -1; //不用while,方朝增本来也这么做,也死循环;每次解析一条就好了 if ((index = byteStr.IndexOf(byteMatch.Value, index + 1)) != -1) { for (int i = index / 2; i < (index + byteMatch.Length) / 2; i++) messageQueue[i] = new KeyValuePair<byte, bool>(messageQueue[i].Key, false); index = -1; } int year = time.Year; int month = time.Month; int day = time.Day; int hour = time.Hour; int minute = time.Minute; int second = time.Second; IVdataDic.Add("Year", year.ToString()); IVdataDic.Add("Month", month.ToString()); IVdataDic.Add("Day", day.ToString()); IVdataDic.Add("Hour", hour.ToString()); IVdataDic.Add("Minute", minute.ToString()); IVdataDic.Add("Second", second.ToString()); IVdataDic.Add("ComponentId", componentId.ToString()); IVdataDic.Add("Component1Temperature", Tep.ToString()); IVdataDic.Add("OpenCircuitVoltage", Vo.ToString()); IVdataDic.Add("ShortCircuitCurrent", Is.ToString()); IVdataDic.Add("MaxPowerVoltage", Vm.ToString()); IVdataDic.Add("MaxPowerCurrent", Im.ToString()); IVdataDic.Add("MaxPower", Pm.ToString()); IVdataDic.Add("Azimuth", azimuth.ToString()); IVdataDic.Add("Obliquity", obliquity.ToString()); IVdataDic.Add("CurrentSeq", "'" + byteMatch.Groups[1].Value + "'"); IVdataDic.Add("VoltageSeq", "'" + byteMatch.Groups[2].Value + "'"); try { dataCore.InsertData("dbo_IVTable", IVdataDic); } catch (Exception ex) { throw ex; } } return true; }