不会向数据库写数据,就找一本入门书,花半个月把里边的 ADO.NET 部分好好练习一下。如果以前没有学过关系数据库,那么花一年时间去上学。

解决方案 »

  1.   

    1.工控程序需要对多线程进行处理
    2.像JZ_RecePort1_DataReceived_JZ这些函数实际上是在后台线程中执行的
    3.在后台线程中不要进行访问数据库这样的耗时操作,收到数据后,先写入缓存(就是变量)里面
    4.前台线程中,启动一个Timer,,每隔一段时间去读一次缓存
    注意:写和读缓存的时候,要用Monitor.Enter和Monitor.Exit同步
      

  2.   

    给你个例子吧,根据自己需要改一下  
    public class COM
      {
        private SerialPort sp;
        private string val = "";    public COM(string portName, int baudRate, int dataBits, StopBits stopBits, Parity parity)
        {
          sp = new SerialPort();
          sp.PortName = portName;
          sp.BaudRate = baudRate;
          sp.DataBits = dataBits;
          sp.StopBits = stopBits;
          sp.Parity = parity;
          sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
        }    public void open()
        {
            try
            {
                sp.Open();
            }
            catch (Exception ex) { Trace.WriteLine(sp.PortName+ ex.Message); }
        }    public void close()
        {
            if (sp != null && sp.IsOpen) sp.Close();
        }    public string getValue()
        {
          string v;
          Monitor.Enter(this);
          v = string.Copy(val);
          Monitor.Exit(this);
          return v;
        }
        public void setValue(string v)
        {
          Monitor.Enter(this);
          val = string.Copy(v);
          Monitor.Exit(this);
        }    public void send(string v)
        {
          try
          {
            sp.Write(v);
          }
          catch (Exception ex) { Trace.WriteLine(sp.PortName+ ex.Message); }
        }    private void sp_DataReceived(System.Object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
          Thread.Sleep(100); //延时等待数据接收完毕
          try
          {
            string str = sp.ReadExisting();
            setValue(str);
          }
          catch (Exception ex) { Trace.WriteLine(sp.PortName+ ex.Message); }
        }
      }
      

  3.   

            public void Data_Write(string[] data_rece)
            {
                for (int i = 0; i < 4; i++)
                {
                    char[] reve = new char[80];
                    reve = data_rece[i].ToCharArray();
                    //判断接收到的数据来自哪一块CPU
                    if (reve[5].ToString() == "0")
                    {
                        //判断对应的CPU表是否为空
                        int n = getTableId(Table_Name[i, 0]);
                        if (n == 0)
                        {
                            reve.CopyTo(Com_Reve, 0);                //保存每次第一次接收到的数据,最为中间比较数据
                            //更新对应的CPU表,将数据擦人表中
                            sql = "INSERT INTO " + Table_Name[i, 0] + "( startTime,stopTime, sendPoint ,receivePoint ,GD_readBack,ZX_Output_readBack ,FX_0utput_readBack ,GJ_JDQ_readBack ,system_falue  ,CT1_1_SZ ,CT1_2_SZ ,CT2_1_SZ ,CT2_2_SZ ) " +
                            "VALUES ( '" + DateTime.Now.ToString() + "', '" + DateTime.Now.ToString() + "' ,'" + reve[1] + "','" + reve[2] + "','" + reve[47] + "'," +
                            "'" + reve[46] + "','" + reve[45] + "','" + reve[44] + "','" + reve[43] + "','" + reve[55] + "','" + reve[54] + "','" + reve[53] + "','" + reve[52] + "' ) ";
                            get_DB_Com(sql);
                            sql = "select top 1 starttime from " + Table_Name[i, 0] + " order by ID desc";
                            reference = name(sql);       //记录其实计数时间                    }
                        //当CPU表不为空时
                        else
                        {                        //比较新接收到的数据是否和前一次接收到的数据相同
                            if ((reve[1] == Com_Reve[1]) & (reve[2] == Com_Reve[2]) & (reve[47] == Com_Reve[47]) &
                                (reve[46] == Com_Reve[46]) & (reve[45] == Com_Reve[45]) &
                                (reve[44] == Com_Reve[44]) & (reve[43] == Com_Reve[43]) &
                                  (reve[55] == Com_Reve[55]) & (reve[54] == Com_Reve[54]) &
                                (reve[53] == Com_Reve[53]) & (reve[52] == Com_Reve[52]))
                            {
                                //相同,更新结束时间
                                sql = "UPDATE " + Table_Name[i, 0] + " set stopTime='" + DateTime.Now.ToString() + "'";
                                get_DB_Com(sql);
                            }
                            else
                            {
                                //   不相同时,更新数据编。
                                sql = "INSERT INTO " + Table_Name[i, 0] + "( startTime,stopTime, sendPoint ,receivePoint ,GD_readBack,ZX_Output_readBack ,FX_0utput_readBack ,GJ_JDQ_readBack ,system_falue  ,CT1_1_SZ ,CT1_2_SZ ,CT2_1_SZ ,CT2_2_SZ ) " +
                               "VALUES ( '" + reference + "', '" + DateTime.Now.ToString() + "' ,'" + reve[1] + "','" + reve[2] + "','" + reve[47] + "'," +
                                "'" + reve[46] + "','" + reve[45] + "','" + reve[44] + "','" + reve[43] + "','" + reve[55] + "','" + reve[54] + "','" + reve[53] + "','" + reve[52] + "' ) ";
                                this.get_DB_Com(sql);
                                reve.CopyTo(Com_Reve, 0); //将新接收到的数据作为中间数据
                            }
                        }
                    }
                    else
                    {
                        //判断表是否为空
                        int n = getTableId(Table_Name[i, 1]);
                        if (n == 0)
                        {
                            reference = DateTime.Now.ToString();    //记录其实计数时间
                            reve.CopyTo(Com_Reve, 0);               //保存每次第一次接收到的数据,最为中间比较数据
                            // 更新数据库表
                            sql = "INSERT INTO " + Table_Name[i, 1] + "( startTime,stopTime, sendPoint ,receivePoint ,GD_readBack,ZX_Output_readBack ,FX_0utput_readBack ,GJ_JDQ_readBack ,system_falue  ,CT1_1_SZ ,CT1_2_SZ ,CT2_1_SZ ,CT2_2_SZ ) " +
                            "VALUES ( '" + DateTime.Now.ToString() + "', '" + DateTime.Now.ToString() + "' ,'" + reve[1] + "','" + reve[2] + "','" + reve[47] + "'," +
                            "'" + reve[46] + "','" + reve[45] + "','" + reve[44] + "','" + Com_Reve[43] + "','" + reve[55] + "','" + reve[54] + "','" + reve[53] + "','" + reve[52] + "' ) ";
                            get_DB_Com(sql);
                            sql = "select top 1 starttime from " + Table_Name[i, 0] + " order by ID desc";
                            reference = name(sql);       //记录其实计数时间
                        }
                        else
                        {
                            if (Com_Reve == null)
                            {
                                sql = "select top 1 sendPoint from " + Table_Name[i, 1] + " order by ID desc";
                                Com_Reve[1]=name(sql); 
                            }
                            if (reve[1] == Com_Reve[1] & (reve[2] == Com_Reve[2]) & (reve[47] == Com_Reve[47]) &
                                (reve[46] == Com_Reve[46]) & (reve[45] == Com_Reve[45]) &
                                (reve[44] == Com_Reve[44]) & (reve[43] == Com_Reve[43]) &
                                  (reve[55] == Com_Reve[55]) & (reve[54] == Com_Reve[54]) &
                                (reve[53] == Com_Reve[53]) & (reve[52] == Com_Reve[52]))
                            {
                                reve.CopyTo(Com_Reve, 0);               //保存每次第一次接收到的数据,最为中间比较数据
                                sql = "UPDATE " + Table_Name[i, 1] + " set stopTime= '" + DateTime.Now.ToString() + "'";
                                get_DB_Com(sql);
                            }
                            else
                            {
                                sql = "select top 1 starttime from " + Table_Name[i, 0] + " order by ID desc";
                                reference = name(sql);       //记录其实计数时间
                                sql = "INSERT INTO " + Table_Name[i, 1] + "( startTime,stopTime, sendPoint ,receivePoint ,GD_readBack,ZX_Output_readBack ,FX_0utput_readBack ,GJ_JDQ_readBack ,system_falue  ,CT1_1_SZ ,CT1_2_SZ ,CT2_1_SZ ,CT2_2_SZ ) " +
                                "VALUES ( '" + reference + "', '" + DateTime.Now.ToString() + "' ,'" + reve[1] + "','" + reve[2] + "','" + reve[47] + "'," +
                                 "'" + reve[46] + "','" + reve[45] + "','" + reve[44] + "','" + reve[43] + "','" + reve[55] + "','" + reve[54] + "','" + reve[53] + "','" + reve[52] + "' ) ";
                                get_DB_Com(sql);
                            }
                        }
                    }
                }
            }
      

  4.   

    reve.CopyTo(Com_Reve, 0);  
    这什么乱糟糟的逻辑,for循环里的i,后面处理根本没用上???你应该将串口数据放进二维数组中
    或者如果串口数据有规律,都放进一维数组也行
    比如固定是12个字节的话,串口1放到0-11,串口2放到12-23...然后循环去处理6个串口的数据入库
    循环里都没有使用循环变量,那你6次循环岂不是一模一样的操作
      

  5.   

    先把逻辑捋清楚了,再写代码.
    从你乱糟糟的代码里,根本看不明白到底想干嘛6组数据分别放到不同的地方,这个地方就要首先保证不能有交叉覆盖
    前面Com_Receive[1] = utility.ByteArrayToBinaryString(bits);这是闹哪样,看后面Com_Receive明显是个一维数组,每组数据就只有1个字节???你这不是从1开始,把串口1的数据都覆盖了然后6组数据应该分别处理,串口1变化,就更新串口1,串口2变化,就更新串口2
    而不是逻辑都混到一起.你后面那么多&&是闹哪样,非要六个串口同时变化才更新,有1个不变就不更新???
      

  6.   

    抱歉。代码有点乱!
    是这样的:
    我就6个串口接收上来的数据放在了Com_Receive[]数组里,接收上来的数据位十个字节,然后再Data_Write()函数中循环写入数据库。
    在主函数中,用timer控制写入时间,每秒钟中写入一次!
      

  7.   

    for (int i = 1; i < 4; i++)
                {
                    char[] reve = new char[80];
                    reve = data_rece[i].ToCharArray();
                    //判断接收到的数据来自哪一块CPU
                    if (reve[5].ToString() == "0")
                    {
                        //判断对应的CPU表是否为空
                        int n = getTableId(Table_Name[i, 0]);
                        if (n == 0)
                        {                        reve.CopyTo(Com_Reve, 0);                //保存每次第一次接收到的数据,最为中间比较数据
                            //更新对应的CPU表,将数据擦人表中
                            sql = "INSERT INTO " + Table_Name[i, 0] + "( startTime,stopTime, sendPoint ,receivePoint ,GD_readBack,ZX_Output_readBack ,FX_0utput_readBack ,GJ_JDQ_readBack ,system_falue  ,CT1_1_SZ ,CT1_2_SZ ,CT2_1_SZ ,CT2_2_SZ ) " +
                            "VALUES ( '" + DateTime.Now.ToString() + "', '" + DateTime.Now.ToString() + "' ,'" + reve[1] + "','" + reve[2] + "','" + reve[47] + "'," +
                            "'" + reve[46] + "','" + reve[45] + "','" + reve[44] + "','" + reve[43] + "','" + reve[55] + "','" + reve[54] + "','" + reve[53] + "','" + reve[52] + "' ) ";
                            get_DB_Com(sql);
                        }
                        //当CPU表不为空时
                        else
                        {
                            //比较新接收到的数据是否和前一次接收到的数据相同
                            if ((reve[1] == Com_Reve[1]) & (reve[2] == Com_Reve[2]) & (reve[47] == Com_Reve[47]) &
                                (reve[46] == Com_Reve[46]) & (reve[45] == Com_Reve[45]) &
                                (reve[44] == Com_Reve[44]) & (reve[43] == Com_Reve[43]) &
                                  (reve[55] == Com_Reve[55]) & (reve[54] == Com_Reve[54]) &
                                (reve[53] == Com_Reve[53]) & (reve[52] == Com_Reve[52]))
                            {
                                //相同,更新结束时间
                                sql = "UPDATE " + Table_Name[i, 0] + " set stopTime='" + DateTime.Now.ToString() + "'";
                                get_DB_Com(sql);
                            }
                            else
                            {
                                //   不相同时,更新数据编。
                                sql = "INSERT INTO " + Table_Name[i, 0] + "( startTime,stopTime, sendPoint ,receivePoint ,GD_readBack,ZX_Output_readBack ,FX_0utput_readBack ,GJ_JDQ_readBack ,system_falue  ,CT1_1_SZ ,CT1_2_SZ ,CT2_1_SZ ,CT2_2_SZ ) " +
                               "VALUES ( '" + reference + "', '" + DateTime.Now.ToString() + "' ,'" + reve[1] + "','" + reve[2] + "','" + reve[47] + "'," +
                                "'" + reve[46] + "','" + reve[45] + "','" + reve[44] + "','" + reve[43] + "','" + reve[55] + "','" + reve[54] + "','" + reve[53] + "','" + reve[52] + "' ) ";
                                this.get_DB_Com(sql);
                                reve.CopyTo(Com_Reve, 0); //将新接收到的数据作为中间数据
                            }
                        }
                    }
      

  8.   

    我上面贴的程序就是讲收到的数据存在一个数据库数组中,每一秒钟写一次数据库我给的是一个后台运行的类,前台只需要创建对象,并调用里面的公共方法就行了,访问数据库是在前台的定时器timer事件中完成的,总的思想是把串口操作单独分离开
    当然,取回来的数据(这里是字符串)要自己解析处理
    工控里面的数据库访问其实非常简单,如果你觉得难,可以找一个SQLHelper类来完成