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); } }
//читаем поток данных 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); } } }