Скачка, раззиповка, перекодирование, парсинг и укладка в базу ЖД-расписания из АСУ Экспресс-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 - однако этот вариант в боевую эксплуатацию в РЖД введен не был.
|