(NET) NET (2007 год)

Скачка, раззиповка, перекодирование, парсинг и укладка в базу ЖД-расписания из АСУ Экспресс-3.

Если кому-нибудь рассказать - что в раше-параше даже получить расписание поездов из первоисточника (АСУ-Экспресс) можно только платно - то это может вызвать легкий шок у человека не травмированного проживанием в чекистской говнораше. Казалось бы ... поезда, государственная монопольная железная дорога для обслуживания населения... и ее СВЯЩЕННАЯ ОБЯЗАННОСТЬ заключается в информировании населения о расписании ЖД-поездов. Ан нет, в чекистской раше-параше оказывается государство (и его "естественные" монополии) даже с протухшей кучи гавна может исхитриться и слизнуть сладенькую пеночку. Будет ли у нас на территории современной России когда нибудь нормальное государственное образование вместо антинародной говно-раши-параши? На этот вопрос ответа пока нет - поэтому нам пока приходится смириться с тем что даже расписание Российской Железной Дороги мы можем получать у чекистских "естественных" монополий только за деньги.

Второй РЖД-прикол, который мне понравился (помимо платного доступа к расписанию) - это формат ЖД-раписания. Железные люди (несмотря на уровень своих доходов) никогда не слышали о SOAP/WSDL и прочих изобретениях последних 20-ти лет - но порадовало то, что они хоть слышали про FTP и ZIP.

Итак, на этой страничке я опишу рыбку одной простейшей проги (написанной за вечер), которая скачивает у железных людей расписание для дальнейшего публичного раcпространения ЖД-расписания населению. Предполагается что распространение расписания населению должно сопровождаться массовой рекламой и таким образом компания, оплатившая доступ к первоисточнику расписания (хорошо потрудившись) может попытаться скомпенсировать свои затраты на первичную покупку ЖД-расписания у АСУ-Экспресс.

Моя прога работает в боевом режиме и именно с ее помощью население имеет счастье узнать расписание РЖД (хотя наверное я не единственный клиент у АСУ Экпресс), но я не буду тут публиковать свою прогу полностью, а только покажу как она работает на примере одной таблы из трех. Моя прога входит на сервер РЖД, выполняет базовую аутентификацию, забирает ZIP-архив, перекодирует его из кодировки АСУ-Экспресс, и разружает данные в три вот такие таблы:


   1:  CREATE TABLE [dbo].[Train](
   2:      [TRAINNUMBER] [nchar](10) NOT NULL,
   3:      [TRNUMBERSEQNUM] [int] NOT NULL,
   4:      [START_DATE] [datetime] NOT NULL,
   5:      [FINISH_DATE] [datetime] NOT NULL,
   6:      [DEPARTURESTATIONCODE] [nchar](10) NOT NULL,
   7:      [ARRIVALSTATIONCODE] [nchar](10) NOT NULL,
   8:      [DEPARTURESTATIONNAME] [nvarchar](50) NOT NULL,
   9:      [ARRIVALSTATIONNAME] [nvarchar](50) NOT NULL,
  10:      [CALENDAR] [tinyint] NOT NULL,
  11:      [TRAINCATEGORY] [tinyint] NOT NULL,
  12:      [DININGCAR] [bit] NOT NULL,
  13:      [MWCOMPARTMENTS] [bit] NOT NULL,
  14:      [LUGGAGEVAN] [bit] NOT NULL,
  15:      [COMPARTMENTCARRIAGE] [bit] NOT NULL,
  16:      [CARRIAGEWITHNUMBEREDSEATS] [bit] NOT NULL,
  17:      [SITTINGCAR] [bit] NOT NULL,
  18:      [PUBLIC1] [bit] NOT NULL,
  19:      [LUXURY] [bit] NOT NULL,
  20:      [SOFTSEATED] [bit] NOT NULL,
  21:      [KINDTHREAD] [smallint] NULL,
  22:      [RELEASESTATIONNAME] [nvarchar](50) NULL,
  23:      [RELEASESTATIONCODE] [nchar](10) NULL,
  24:      [HOOKINGSTATIONNAME] [nvarchar](50) NULL,
  25:      [HOOKINGSTATIONCODE] [nchar](10) NULL,
  26:      [RELEASETRAIN] [nchar](10) NULL,
  27:      [DEPARTURE_STATIONCODE_RT] [nchar](10) NULL,
  28:      [DEPARTURESTATIONNAME_RT] [nvarchar](50) NULL,
  29:      [ARRIVAL_STATIONCODE_RT] [nchar](10) NULL,
  30:      [ARRIVAL_STATIONNAME_RT] [nvarchar](50) NULL,
  31:      [BASICTRAIN] [nchar](10) NULL,
  32:      [DEPARTURESTATIONCODE_BT] [nchar](10) NULL,
  33:      [DEPARTURESTATIONNAME_BT] [nvarchar](50) NULL,
  34:      [ARRIVALSTATIONCODE_BT] [nchar](10) NULL,
  35:      [ARRIVALSTATIONNAME_BT] [nvarchar](50) NULL,
  36:      [DATE_KURS] [datetime] NULL,
  37:      [MONTH1] [nchar](31) NULL,
  38:      [MONTH2] [nchar](31) NULL,
  39:      [MONTH3] [nchar](31) NULL,
  40:      [MONTH4] [nchar](31) NULL,
  41:      [MONTH5] [nchar](31) NULL,
  42:      [MONTH6] [nchar](31) NULL,
  43:      [MONTH7] [nchar](31) NULL,
  44:      [MONTH8] [nchar](31) NULL,
  45:      [MONTH9] [nchar](31) NULL,
  46:      [MONTH10] [nchar](31) NULL,
  47:      [MONTH11] [nchar](31) NULL,
  48:      [MONTH12] [nchar](31) NULL
  49:  ) ON [PRIMARY]
  50:   
  51:  GO
  52:   
  53:   
  54:  CREATE TABLE [dbo].[Route](
  55:      [TRAINNUMBER] [nchar](5) NOT NULL,
  56:      [TRNUMBERSEQNUM] [int] NOT NULL,
  57:      [STATIONCODE] [nchar](7) NOT NULL,
  58:      [STATIONNAME] [nvarchar](22) NOT NULL,
  59:      [DEPARTURETIME] [datetime] NOT NULL,
  60:      [STATIONTIME] [datetime] NOT NULL,
  61:      [ARRIVALTIME] [datetime] NULL,
  62:      [DISTANCE] [int] NOT NULL,
  63:      [DURATION24] [tinyint] NOT NULL,
  64:      [TIMEINPATH] [int] NULL,
  65:      [START_DATE] [datetime] NOT NULL,
  66:      [FINISH_DATE] [datetime] NOT NULL
  67:  ) ON [PRIMARY]
  68:   
  69:  GO
  70:   
  71:   
  72:  CREATE TABLE [dbo].[Station](
  73:      [STATIONCODE] [nchar](10) NOT NULL,
  74:      [NAME] [nchar](22) NOT NULL,
  75:      [CITYSIGN] [nchar](10) NULL,
  76:      [TIMEZONEINT] [int] NULL,
  77:      [NAMEL] [nchar](40) NOT NULL
  78:  ) ON [PRIMARY]
  79:   
  80:  GO
  81:   
  82:  CREATE TABLE [dbo].[Error](
  83:      [i] [int] IDENTITY(1,1) NOT NULL,
  84:      [crDate] [datetime] NULL,
  85:      [TXT] [nvarchar](max) NULL
  86:  ) ON [PRIMARY]
  87:   
  88:  GO

Вывести данные из этих таблиц на сайт может оказаться не так просто как вы рассчитываете. Например в АСУ Экспресс довольно хитро все сделано с разбивкой по месяцам (но этот фрагмент кода я публиковать не буду). А типичные обьемы данных вы можете увидеть на рисунке.



Ну а моя прога для скачки с бзовой аутентификацией, рассзиповки, перекодирования, парсинга и загрузки в базу выглядит вот так:


   1:  Module Module1
   2:      '
   3:      'скачка трех файлов с базовой аутентификацией
   4:      '
   5:      'http://www.timetable.tsi.ru/update/StationAdv.rar
   6:      'http://www.timetable.tsi.ru/update/RouteAdv.rar 
   7:      'http://www.timetable.tsi.ru/update/TrainAdv.rar 
   8:      '
   9:      'раззиповка, перекодировка из CP866 и укладка в базу
  10:      'все параметры этого обработчка в конфиге
  11:   
  12:      Public Enum ParceType
  13:          Station = 1
  14:          Route = 2
  15:          Train = 3
  16:      End Enum
  17:   
  18:      Sub Main()
  19:          '
  20:          ProcessStation()
  21:          ProcessRoute()
  22:          ProcessTrain()
  23:      End Sub
  24:   
  25:   
  26:  #Region "Обработка Train"
  27:   
  28:   
  29:      Sub ProcessTrain()
  30:          If My.Computer.FileSystem.FileExists("TrainAdv.rar") Then
  31:              My.Computer.FileSystem.DeleteFile("TrainAdv.rar")
  32:          End If
  33:          GetBinaryWithBasicAU(My.Settings.TrainURL, My.Settings.Login, My.Settings.Password, "TrainAdv.rar")
  34:          '
  35:          If My.Computer.FileSystem.FileExists("TrainAdv.rar") Then
  36:              '
  37:              Dim TXTFileName As String = IO.Path.Combine(My.Application.Info.DirectoryPath, "TrainAdv.TXT")
  38:              Dim InFileName As String = IO.Path.Combine(My.Application.Info.DirectoryPath, "TrainAdv.rar")
  39:              If My.Computer.FileSystem.FileExists(TXTFileName) Then
  40:                  My.Computer.FileSystem.DeleteFile(TXTFileName)
  41:              End If
  42:              UnZip(InFileName, My.Application.Info.DirectoryPath)
  43:              If My.Computer.FileSystem.FileExists(TXTFileName) Then
  44:                  Dim CN1 As New System.Data.SqlClient.SqlConnection(My.Settings.TrainDB1)
  45:                  CN1.Open()
  46:                  Dim CMD1 As New SqlClient.SqlCommand(My.Settings.InsertTrain, CN1)
 ....               
  97:                  ParseTXT(TXTFileName, ParceType.Train, CMD1)
  98:                  CN1.Close()
  99:              End If
 100:          End If
 101:      End Sub
 102:   
 103:      'Обработка одной строки Train
 104:      Sub ParceTrain(ByVal Line1 As String, ByVal CMD1 As SqlClient.SqlCommand, ByVal LineNumber As Integer)
 105:          Try
 106:              Dim Arr1() As String = Line1.Split(vbTab)
 107:              If Arr1.Count = 47 Then
 ....               
 269:                  CMD1.ExecuteNonQuery()
 270:              End If
 271:          Catch x As Exception
 272:              Console.WriteLine("Ошибка: " & x.Message)
 273:              Dim CN2 As New System.Data.SqlClient.SqlConnection(My.Settings.TrainDB1)
 274:              CN2.Open()
 275:              Dim CMD2 As New SqlClient.SqlCommand(My.Settings.ErrorMSG, CN2)
 276:              CMD2.Parameters.Add("TXT", SqlDbType.NVarChar)
 277:              CMD2.Parameters("TXT").Value = LineNumber & ": " & Line1 & " :" & x.Message
 278:              CMD2.ExecuteNonQuery()
 279:              CN2.Close()
 280:          End Try
 281:      End Sub
 282:   
 283:  #End Region
 284:   
 285:  #Region "Обработка Route"
 286:   
 287:      Sub ProcessRoute()
 288:          If My.Computer.FileSystem.FileExists("RouteAdv.rar") Then
 289:              My.Computer.FileSystem.DeleteFile("RouteAdv.rar")
 290:          End If
 291:          GetBinaryWithBasicAU(My.Settings.RouteURL, My.Settings.Login, My.Settings.Password, "RouteAdv.rar")
 292:          '
 293:          If My.Computer.FileSystem.FileExists("RouteAdv.rar") Then
 294:              '
 295:              Dim TXTFileName As String = IO.Path.Combine(My.Application.Info.DirectoryPath, "RouteAdv.TXT")
 296:              Dim InFileName As String = IO.Path.Combine(My.Application.Info.DirectoryPath, "RouteAdv.rar")
 297:              If My.Computer.FileSystem.FileExists(TXTFileName) Then
 298:                  My.Computer.FileSystem.DeleteFile(TXTFileName)
 299:              End If
 300:              UnZip(InFileName, My.Application.Info.DirectoryPath)
 301:              If My.Computer.FileSystem.FileExists(TXTFileName) Then
 302:                  Dim CN1 As New System.Data.SqlClient.SqlConnection(My.Settings.TrainDB1)
 303:                  CN1.Open()
 304:                  Dim CMD1 As New SqlClient.SqlCommand(My.Settings.InsertRoute, CN1)
 ....               
 317:                  ParseTXT(TXTFileName, ParceType.Route, CMD1)
 318:                  CN1.Close()
 319:              End If
 320:          End If
 321:      End Sub
 322:   
 323:      'Обработка одной строки Route
 324:      Sub ParceRoute(ByVal Line1 As String, ByVal CMD1 As SqlClient.SqlCommand, ByVal LineNumber As Integer)
 325:          Try
 326:              Dim Arr1() As String = Line1.Split(vbTab)
 327:              If Arr1.Count = 12 Then
 ....               
 350:                  CMD1.ExecuteNonQuery()
 351:              End If
 352:          Catch x As Exception
 353:              Console.WriteLine("Ошибка: " & x.Message)
 354:              Dim CN2 As New System.Data.SqlClient.SqlConnection(My.Settings.TrainDB1)
 355:              CN2.Open()
 356:              Dim CMD2 As New SqlClient.SqlCommand(My.Settings.ErrorMSG, CN2)
 357:              CMD2.Parameters.Add("TXT", SqlDbType.NVarChar)
 358:              CMD2.Parameters("TXT").Value = LineNumber & ": " & Line1 & " :" & x.Message
 359:              CMD2.ExecuteNonQuery()
 360:              CN2.Close()
 361:          End Try
 362:      End Sub
 363:   
 364:  #End Region
 365:   
 366:  #Region "Обрботка Station"
 367:      Sub ProcessStation()
 368:          If My.Computer.FileSystem.FileExists("StationAdv.rar") Then
 369:              My.Computer.FileSystem.DeleteFile("StationAdv.rar")
 370:          End If
 371:          GetBinaryWithBasicAU(My.Settings.StationURL, My.Settings.Login, My.Settings.Password, "StationAdv.rar")
 372:          '
 373:          If My.Computer.FileSystem.FileExists("StationAdv.rar") Then
 374:              '
 375:              Dim TXTFileName As String = IO.Path.Combine(My.Application.Info.DirectoryPath, "StationAdv.TXT")
 376:              Dim InFileName As String = IO.Path.Combine(My.Application.Info.DirectoryPath, "StationAdv.rar")
 377:              If My.Computer.FileSystem.FileExists(TXTFileName) Then
 378:                  My.Computer.FileSystem.DeleteFile(TXTFileName)
 379:              End If
 380:              UnZip(InFileName, My.Application.Info.DirectoryPath)
 381:              If My.Computer.FileSystem.FileExists(TXTFileName) Then
 382:                  Dim CN1 As New System.Data.SqlClient.SqlConnection(My.Settings.TrainDB1)
 383:                  CN1.Open()
 384:                  Dim CMD1 As New SqlClient.SqlCommand(My.Settings.InsertStation, CN1)
 385:                  CMD1.Parameters.Add("STATIONCODE", SqlDbType.NVarChar)
 386:                  CMD1.Parameters.Add("NAME", SqlDbType.NVarChar)
 387:                  CMD1.Parameters.Add("CITYSIGN", SqlDbType.NVarChar)
 388:                  CMD1.Parameters.Add("TIMEZONEINT", SqlDbType.Int)
 389:                  CMD1.Parameters.Add("NAMEL", SqlDbType.NVarChar)
 390:                  ParseTXT(TXTFileName, ParceType.Station, CMD1)
 391:                  CN1.Close()
 392:              End If
 393:          End If
 394:      End Sub
 395:   
 396:      'Обработка одной строки Station
 397:      Sub ParceStation(ByVal Line1 As String, ByVal CMD1 As SqlClient.SqlCommand, ByVal LineNumber As Integer)
 398:          Try
 399:              Dim Arr1() As String = Line1.Split(vbTab)
 400:              If Arr1.Count = 5 Then
 401:                  CMD1.Parameters("STATIONCODE").Value = Arr1(0)
 402:                  CMD1.Parameters("NAME").Value = Arr1(1)
 403:                  CMD1.Parameters("CITYSIGN").Value = Arr1(2)
 404:                  CMD1.Parameters("TIMEZONEINT").Value = Arr1(3)
 405:                  CMD1.Parameters("NAMEL").Value = Arr1(4)
 406:                  CMD1.ExecuteNonQuery()
 407:              End If
 408:          Catch x As Exception
 409:              Console.WriteLine("Ошибка: " & x.Message)
 410:              Dim CN2 As New System.Data.SqlClient.SqlConnection(My.Settings.TrainDB1)
 411:              CN2.Open()
 412:              Dim CMD2 As New SqlClient.SqlCommand(My.Settings.ErrorMSG, CN2)
 413:              CMD2.Parameters.Add("TXT", SqlDbType.NVarChar)
 414:              CMD2.Parameters("TXT").Value = LineNumber & ": " & Line1 & " :" & x.Message
 415:              CMD2.ExecuteNonQuery()
 416:              CN2.Close()
 417:          End Try
 418:      End Sub
 419:  #End Region
 420:   
 421:   
 422:  #Region "Общая обработка всех трех файлов"
 423:   
 424:      'считывает Бинарник с заданного URL (с базовой аутинтификацией) в заданный файл
 425:      Public Sub GetBinaryWithBasicAU(ByVal URL As String, ByVal Login As String, ByVal Pass As String, ByVal OutFileName As String)
 426:          Try
 427:              'запрос по HTTP
 428:              Dim Request As Net.WebRequest = System.Net.WebRequest.Create(URL)
 429:              Request.Credentials = New Net.NetworkCredential(Login, Pass)
 430:              Dim PageRequest As Net.HttpWebRequest = CType(Request, System.Net.HttpWebRequest)
 431:              'Отправлен запрос - ждем
 432:              Dim PageResponse As Net.HttpWebResponse = PageRequest.GetResponse
 433:              'Получен ответ
 434:              Dim response As Net.HttpWebResponse = PageRequest.GetResponse()
 435:              Dim GET_Stream As IO.Stream = response.GetResponseStream()
 436:              Dim Reader = New IO.BinaryReader(GET_Stream)
 437:              Dim Buf1(1000) As Byte
 438:              While Reader.BaseStream.CanRead
 439:                  Buf1 = Reader.ReadBytes(Buf1.Length)
 440:                  If Buf1.Length > 0 Then
 441:                      My.Computer.FileSystem.WriteAllBytes(OutFileName, Buf1, True)
 442:                  Else
 443:                      Exit Sub
 444:                  End If
 445:              End While
 446:          Catch x As System.Exception
 447:              Console.WriteLine("Ошибка: " & x.Message & " " & x.Source)
 448:          End Try
 449:      End Sub
 450:   
 451:      'раззиповка 
 452:      Sub UnZip(ByVal ZipFileName As String, ByVal OutDirectory As String)
 453:          Dim ZipPath As String = My.Settings.ZipPath
 454:          Dim ZipCacheDir As String = "C:\"
 455:          Dim Zip As New System.Diagnostics.Process
 456:          Zip.StartInfo.UseShellExecute = False
 457:          Zip.StartInfo.CreateNoWindow = True
 458:          'Раззиповывываем и возвращаем имя раззипованного файла
 459:          Try
 460:              Zip.StartInfo.FileName = ZipPath
 461:              Zip.StartInfo.Arguments = " e " & ZipFileName & " -o" & OutDirectory
 462:              Zip.StartInfo.WorkingDirectory = ZipCacheDir
 463:              Zip.Start()
 464:              Zip.WaitForExit()
 465:              Zip.Close()
 466:          Catch x As Exception
 467:              Console.WriteLine("Ошибка: " & x.Message & " " & x.Source)
 468:          End Try
 469:      End Sub
 470:   
 471:      'перекодировка раззипованного файла, парсинг на строки и вызов команды записи в базу по каждой строки
 472:      Sub ParseTXT(ByVal FileName As String, ByVal Type As ParceType, ByVal CMD1 As SqlClient.SqlCommand)
 473:          Dim Buf As Byte() = My.Computer.FileSystem.ReadAllBytes(FileName)
 474:          Dim Str1 As String = System.Text.Encoding.GetEncoding("cp866").GetString(Buf)
 475:          Dim RDR1 As New IO.StringReader(Str1)
 476:          Dim Line1 As String = " "
 477:          Dim I As Integer
 478:          While Line1 <> ""
 479:              I += 1
 480:              Try
 481:                  Line1 = RDR1.ReadLine
 482:                  Select Case Type
 483:                      Case ParceType.Station
 484:                          ParceStation(Line1, CMD1, I)
 485:                      Case ParceType.Route
 486:                          ParceRoute(Line1, CMD1, I)
 487:                      Case ParceType.Train
 488:                          ParceTrain(Line1, CMD1, I)
 489:                  End Select
 490:                  Console.WriteLine(I & ": " & Line1)
 491:              Catch x As Exception
 492:                  Console.WriteLine("Ошибка: " & x.Message)
 493:                  Exit While
 494:              End Try
 495:          End While
 496:          Console.ReadLine()
 497:      End Sub
 498:   
 499:  #End Region
 500:   
 501:  End Module

Прога работает с вот таким конфигом:


   1:  <?xml version="1.0" encoding="utf-8" ?>
   2:  <configuration>
   3:      <configSections>
   4:          <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
   5:              <section name="TimeTable.My.MySettings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
   6:          </sectionGroup>
   7:      </configSections>
   8:      <connectionStrings>
  10:          <add name="TimeTable.My.MySettings.TrainDB" connectionString="Data Source=192.168.0.155;Initial Catalog=train;Persist Security Info=True;User ID=sa;Password=ZZZZZZZZZZZZ" />
  11:      </connectionStrings>
  12:      <system.diagnostics>
  13:          <sources>
  14:              <!-- This section defines the logging configuration for My.Application.Log -->
  15:              <source name="DefaultSource" switchName="DefaultSwitch">
  16:                  <listeners>
  17:                      <add name="FileLog"/>
  18:                      <!-- Uncomment the below section to write to the Application Event Log -->
  19:                      <!--<add name="EventLog"/>-->
  20:                  </listeners>
  21:              </source>
  22:          </sources>
  23:          <switches>
  24:              <add name="DefaultSwitch" value="Information" />
  25:          </switches>
  26:          <sharedListeners>
  27:              <add name="FileLog"
  28:                   type="Microsoft.VisualBasic.Logging.FileLogTraceListener, Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
  29:                   initializeData="FileLogWriter"/>
  30:              <!-- Uncomment the below section and replace APPLICATION_NAME with the name of your application to write to the Application Event Log -->
  31:              <!--<add name="EventLog" type="System.Diagnostics.EventLogTraceListener" initializeData="APPLICATION_NAME"/> -->
  32:          </sharedListeners>
  33:      </system.diagnostics>
  34:      <applicationSettings>
  35:          <TimeTable.My.MySettings>
  36:              <setting name="ZipPath" serializeAs="String">
  37:                  <value>C:\Program Files (x86)\7-Zip\7z.exe </value>
  38:              </setting>
  39:              <setting name="StationURL" serializeAs="String">
  40:                  <value>http://www.timetable.tsi.ru/update/StationAdv.rar</value>
  41:              </setting>
  42:              <setting name="RouteURL" serializeAs="String">
  43:                  <value>http://www.timetable.tsi.ru/update/RouteAdv.rar</value>
  44:              </setting>
  45:              <setting name="TrainURL" serializeAs="String">
  46:                  <value>http://www.timetable.tsi.ru/update/TrainAdv.rar</value>
  47:              </setting>
  48:              <setting name="Login" serializeAs="String">
  49:                  <value>XXXXXXXXXXXXXX</value>
  50:              </setting>
  51:              <setting name="Password" serializeAs="String">
  52:                  <value>YYYYYYYYYYYY</value>
  53:              </setting>
  54:              <setting name="InsertStation" serializeAs="String">
  55:                  <value>INSERT INTO [train].[dbo].[Station] ([STATIONCODE],[NAME],[CITYSIGN],[TIMEZONEINT],[NAMEL]) VALUES(@STATIONCODE, @NAME, @CITYSIGN, @TIMEZONEINT ,@NAMEL)</value>
  56:              </setting>
  57:              <setting name="InsertRoute" serializeAs="String">
  58:                  <value>INSERT INTO [train].[dbo].[Route]([TRAINNUMBER],[TRNUMBERSEQNUM],[STATIONCODE],[STATIONNAME],[DEPARTURETIME],[STATIONTIME],[ARRIVALTIME],[DISTANCE],[DURATION24],[TIMEINPATH],[START_DATE],[FINISH_DATE])VALUES(@TRAINNUMBER,@TRNUMBERSEQNUM,@STATIONCODE,@STATIONNAME,@DEPARTURETIME,@STATIONTIME,@ARRIVALTIME,@DISTANCE,@DURATION24,@TIMEINPATH,@START_DATE,@FINISH_DATE)</value>
  59:              </setting>
  60:              <setting name="InsertTrain" serializeAs="String">
  61:                  <value>INSERT INTO [train].[dbo].[Train]
  62:             ([TRAINNUMBER]
  63:             ,[TRNUMBERSEQNUM]
  64:             ,[START_DATE]
  65:             ,[FINISH_DATE]
  66:             ,[DEPARTURESTATIONCODE]
  67:             ,[ARRIVALSTATIONCODE]
  68:             ,[DEPARTURESTATIONNAME]
  69:             ,[ARRIVALSTATIONNAME]
  70:             ,[CALENDAR]
  71:             ,[TRAINCATEGORY]
  72:             ,[DININGCAR]
  73:             ,[MWCOMPARTMENTS]
  74:             ,[LUGGAGEVAN]
  75:             ,[COMPARTMENTCARRIAGE]
  76:             ,[CARRIAGEWITHNUMBEREDSEATS]
  77:             ,[SITTINGCAR]
  78:             ,[PUBLIC1]
  79:             ,[LUXURY]
  80:             ,[SOFTSEATED]
  81:             ,[KINDTHREAD]
  82:             ,[RELEASESTATIONNAME]
  83:             ,[RELEASESTATIONCODE]
  84:             ,[HOOKINGSTATIONNAME]
  85:             ,[HOOKINGSTATIONCODE]
  86:             ,[RELEASETRAIN]
  87:             ,[DEPARTURE_STATIONCODE_RT]
  88:             ,[DEPARTURESTATIONNAME_RT]
  89:             ,[ARRIVAL_STATIONCODE_RT]
  90:             ,[ARRIVAL_STATIONNAME_RT]
  91:             ,[BASICTRAIN]
  92:             ,[DEPARTURESTATIONCODE_BT]
  93:             ,[DEPARTURESTATIONNAME_BT]
  94:             ,[ARRIVALSTATIONCODE_BT]
  95:             ,[ARRIVALSTATIONNAME_BT]
  96:             ,[DATE_KURS]
  97:             ,[MONTH1]
  98:             ,[MONTH2]
  99:             ,[MONTH3]
 100:             ,[MONTH4]
 101:             ,[MONTH5]
 102:             ,[MONTH6]
 103:             ,[MONTH7]
 104:             ,[MONTH8]
 105:             ,[MONTH9]
 106:             ,[MONTH10]
 107:             ,[MONTH11]
 108:             ,[MONTH12])
 109:       VALUES
 110:             (@TRAINNUMBER
 111:             ,@TRNUMBERSEQNUM
 112:             ,@START_DATE
 113:             ,@FINISH_DATE
 114:             ,@DEPARTURESTATIONCODE
 115:             ,@ARRIVALSTATIONCODE
 116:             ,@DEPARTURESTATIONNAME
 117:             ,@ARRIVALSTATIONNAME
 118:             ,@CALENDAR
 119:             ,@TRAINCATEGORY
 120:             ,@DININGCAR
 121:             ,@MWCOMPARTMENTS
 122:             ,@LUGGAGEVAN
 123:             ,@COMPARTMENTCARRIAGE
 124:             ,@CARRIAGEWITHNUMBEREDSEATS
 125:             ,@SITTINGCAR
 126:             ,@PUBLIC1
 127:             ,@LUXURY
 128:             ,@SOFTSEATED
 129:             ,@KINDTHREAD
 130:             ,@RELEASESTATIONNAME
 131:             ,@RELEASESTATIONCODE
 132:             ,@HOOKINGSTATIONNAME
 133:             ,@HOOKINGSTATIONCODE
 134:             ,@RELEASETRAIN
 135:             ,@DEPARTURE_STATIONCODE_RT
 136:             ,@DEPARTURESTATIONNAME_RT
 137:             ,@ARRIVAL_STATIONCODE_RT
 138:             ,@ARRIVAL_STATIONNAME_RT
 139:             ,@BASICTRAIN
 140:             ,@DEPARTURESTATIONCODE_BT
 141:             ,@DEPARTURESTATIONNAME_BT
 142:             ,@ARRIVALSTATIONCODE_BT
 143:             ,@ARRIVALSTATIONNAME_BT
 144:             ,@DATE_KURS
 145:             ,@MONTH1
 146:             ,@MONTH2
 147:             ,@MONTH3
 148:             ,@MONTH4
 149:             ,@MONTH5
 150:             ,@MONTH6
 151:             ,@MONTH7
 152:             ,@MONTH8
 153:             ,@MONTH9
 154:             ,@MONTH10
 155:             ,@MONTH11
 156:             ,@MONTH12)</value>
 157:              </setting>
 158:              <setting name="ErrorMSG" serializeAs="String">
 159:                  <value>INSERT INTO [Train].[dbo].[Error] ([crDate] ,[TXT]) VALUES (GETDATE() ,@TXT)</value>
 160:              </setting>
 161:          </TimeTable.My.MySettings>
 162:      </applicationSettings>
 163:  </configuration>

Если вам интересно, как работать с РЖД-топологией, описывающей все станции и связи между ними - вы можете почитать вот этот топик - Хранение в MS SQL сетевой топологии и отборы маршрутов рекурсивными CTE-процедурами. Также вы можете увидеть на моем сайте древнейший мой скрипт, который позволяет загрузить расписание (которые бабушки готовят вручную) в базу VBA - язык автоматизации Excel. А также вы можете посмотреть на один из моих сайтов http://rzd-test.vb-net.com/, которые работают в локалке РЖД для тестирования знаний ДСП (у меня на хостинге остался его некий клон и на моей версии этого сайта есть тестовый вход). Вы можете также подергать SOAP/WSDL-сервисы, которые я выпускал из РЖД внаружу для информирования населения более удобным путем, чем так, как это сделало АСУ Экспресс - http://rzd-service.vb-net.com/RZD1.svc?wsdl - однако этот вариант в боевую эксплуатацию в РЖД введен не был.



Comments ( )
Link to this page: //www.vb-net.com/TimeTable/index.htm
< THANKS ME>