Exemplo n.º 1
0
        private void SelectDataLock()
        {
            try
            {
                //var conToDb = new ConnectionToDB(filename_db_server);
                dataset_serv.Clear();
                name_table   = "LST_LOCK";
                sqlcmd       = "select * from " + name_table;
                dataset_serv = ConnectionToDB.dsTableFromDB(name_table, dataset_serv, sqlcmd, PARTH_DB_SERVER);
                //dataset_serv = connect_server.DataSetDB("LST_CHANGE_NUM",dataset_serv);

                /*var connect = new ConnectionToDB(filename_dbinp);
                 * dataset_inp.Clear();
                 * dataset_inp = connect.DataSetDB("LST_INPAR", dataset_inp);
                 * dataset_inp = connect.DataSetDB("LST_ITEM", dataset_inp);
                 */
            }
            catch (Exception ex)
            {
                PrintLine(ex.Message);
            }
        }
Exemplo n.º 2
0
        //читаем поток данных
        void OnCompleteReadFromClientStream(IAsyncResult iar)
        {
            int       nCountReadBytes = 0;
            string    strRecv;
            TcpClient tcpc = null;

            try
            {
                //синхронизируем результат в объект tcpclient
                tcpc = (TcpClient)iar.AsyncState;
                //расчитываем количество байт в int
                nCountReadBytes = tcpc.GetStream().EndRead(iar);

                //проверяем, если есть еще пакеты
                if (nCountReadBytes == 0)
                {
                    PrintLine("Client has been disconnected. Idle for too long...");
                    if (tcpc == mTcpClientLock && mTcpClientLock != null)
                    {
                        mTcpClientLock = null;
                        UpdateLocking(0);
                    }
                    return;
                }
                tx     = null;
                txSize = null;
                //обновляем полученные таблицы в базе
                strRecv = Encoding.Unicode.GetString(mRx, 0, nCountReadBytes);
                switch (strRecv)
                {
                //просто текст
                case " ":
                    mRx         = new byte[254];
                    strRecvSize = null;
                    break;

                //дата сет
                case "$":
                    mRx         = new byte[Convert.ToInt32(strRecvSize)];
                    strRecvSize = null;
                    updateTable = true;
                    break;

                //получение запроса для таблицы change_num
                case "%":
                    mRx         = new byte[Convert.ToInt32(strRecvSize)];
                    strRecvSize = null;
                    isChangeNum = true;
                    break;

                case "#":
                    mRx         = new byte[2];
                    strRecvSize = null;
                    tx          = Encoding.Unicode.GetBytes("#");
                    tcpc.GetStream().BeginWrite(tx, 0, tx.Length, onCompleteWriteToClientStream, tcpc);
                    break;

                //завершение размера пакета
                case "-":
                    mRx         = new byte[2];
                    strRecvSize = null;
                    break;

                //приходит если нужно блокировать/разблокировать
                case "+":
                    mRx = new byte[2];
                    string flagToClient;
                    //считали с бд сервера флаг блокироки
                    var svLockingFlag = GetFlagLock();
                    stateServDb.Locking();
                    //блокировка
                    if (strRecvSize.Equals("0"))
                    {
                        if (!svLockingFlag && mTcpClientLock == null)
                        {
                            mTcpClientLock = tcpc;
                            flagToClient   = "1";
                            UpdateLocking(1);
                        }
                        else
                        {
                            flagToClient = "Сервер заблокирован другим пользователем";
                        }
                    }
                    //разблокировка
                    else
                    {
                        if (svLockingFlag)
                        {
                            mTcpClientLock = null;
                            flagToClient   = "0";
                            UpdateLocking(0);
                        }
                        else
                        {
                            flagToClient = "Ошибка блокировки";
                        }
                    }

                    if (flagToClient.Length != 1)
                    {
                        tx     = Encoding.Unicode.GetBytes(flagToClient);
                        txSize = Encoding.Unicode.GetBytes(tx.Length + "+");
                        tcpc.GetStream().BeginWrite(txSize, 0, txSize.Length, onCompleteWriteToClientStream, tcpc);
                        tcpc.GetStream().BeginWrite(tx, 0, tx.Length, onCompleteWriteToClientStream, tcpc);
                    }
                    else
                    {
                        tx = Encoding.Unicode.GetBytes(flagToClient + "+");
                        tcpc.GetStream().BeginWrite(tx, 0, tx.Length, onCompleteWriteToClientStream, tcpc);
                    }

                    strRecvSize = null;
                    break;

                default:
                    if (nCountReadBytes == 2)
                    {
                        strRecvSize += strRecv;
                    }
                    else if (updateTable)
                    {
                        var ds_server = new DataSet();
                        ds_server = Transformation.convertByteArrayToDataSet(mRx);

                        string[] split = ds_server.DataSetName.Split('|');
                        foreach (DataTable item in ds_server.Tables)
                        {
                            UpdateTable(split[0], item);                                //update change_num table
                        }

                        if (split[4].Equals("U"))
                        {
                            sqlcmd = "update " + NAME_TAB_DB_SERVER + " set CHANGE_NUM = '" + split[3] +
                                     "' where NAME_DB = '" + split[1] + "' and NAME_TABLE = '" + split[2] + "'";
                        }
                        else
                        {
                            sqlcmd = "insert into " + NAME_TAB_DB_SERVER +
                                     " values('" + split[1] + "','" + split[2] + "','" + split[3] + "')";
                        }
                        ConnectionToDB.sqlcmd(sqlcmd, PARTH_DB_SERVER);

                        tx = Encoding.Unicode.GetBytes(" " + ds_server.DataSetName);
                        tcpc.GetStream().BeginWrite(tx, 0, tx.Length, onCompleteWriteToClientStream, tcpc);
                        updateTable = false;
                    }
                    else if (isChangeNum)
                    {
                        var    ds_server  = new DataSet();
                        string change_num = null;

                        string   str   = Encoding.Unicode.GetString(mRx);
                        string[] split = str.Split('|');

                        try
                        {
                            ds_server = ConnectionToDB.dsFromDB(ds_server, split[0], PARTH_DB_SERVER);
                            foreach (DataTable item in ds_server.Tables)
                            {
                                foreach (DataRow item2 in item.Rows)
                                {
                                    change_num = item2["CHANGE_NUM"].ToString();
                                }
                            }
                            //посылаем обратно клиенту данные по запросу, бд, таблице и номеру изменению
                            tx     = Encoding.Unicode.GetBytes(str + '|' + change_num);
                            txSize = Encoding.Unicode.GetBytes(tx.Length + "%");
                            tcpc.GetStream().BeginWrite(txSize, 0, txSize.Length, onCompleteWriteToClientStream, tcpc);
                            tcpc.GetStream().BeginWrite(tx, 0, tx.Length, onCompleteWriteToClientStream, tcpc);
                            isChangeNum = false;
                        }
                        catch (Exception ex)
                        {
                            tx = Encoding.Unicode.GetBytes(" " + ex.Message);
                            tcpc.GetStream().BeginWrite(tx, 0, tx.Length, onCompleteWriteToClientStream, tcpc);
                        }
                    }
                    mRx = new byte[2];
                    break;
                }

                PrintLine(strRecv);
                tcpc.GetStream().BeginRead(mRx, 0, mRx.Length, OnCompleteReadFromClientStream, tcpc);
            }
            catch (Exception ex)
            {
                PrintLine(ex.Message);
                if (tcpc == mTcpClientLock && mTcpClientLock != null)
                {
                    mTcpClientLock = null;
                    UpdateLocking(0);
                }
            }
        }