git_bsmd/AIS/puls200.AIS2Excel/AISVessel.cs

80 lines
3.1 KiB
C#

// Copyright (c) 2008-2019 schick Informatik
// Description: Erzeugt eine CSV Datei aus dem Query
//
using System;
using System.Data;
using System.Data.SqlClient;
using System.IO;
namespace puls200.AIS2Excel
{
public static class AISVessel
{
const string ExportQuery = "SELECT ap.MMSI, ap.timestamp, ap.latitude, ap.longitude, ap.ROT, ap.COG, ap.SOG, ap.Accuracy, ap.heading, ap.NavStatus, ap.CommState, ap.Raim, " +
"sd.aisversion, sd.imoNumber, sd.callsign, sd.name, sd.shiptype, sd.dimension, sd.typeofdevice, sd.maxpresetstaticdraught, sd.dte, sd.classb, sd.breadth, sd.length " +
"FROM aisstaticdata sd JOIN aisposreport ap ON ap.mmsi = sd.mmsi " +
"WHERE ap.Latitude > @LRLAT AND ap.Latitude < @ULLAT AND ap.Longitude > @ULLON AND ap.Longitude < @LRLON AND ap.Timestamp > @FROM AND ap.Timestamp < @TO " +
"ORDER BY ap.Timestamp";
public static void Export(DateTime from, DateTime to, double ulLat, double ulLon, double lrLat, double lrLon, string filename)
{
using (StreamWriter sw = new StreamWriter(filename))
{
SqlConnection con = new SqlConnection(Properties.Settings.Default.ConnectionString);
con.Open();
SqlCommand cmd = new SqlCommand(ExportQuery, con);
cmd.Parameters.AddWithValue("FROM", from);
cmd.Parameters.AddWithValue("TO", to);
cmd.Parameters.AddWithValue("ULLAT", ulLat * 600000);
cmd.Parameters.AddWithValue("ULLON", ulLon * 600000);
cmd.Parameters.AddWithValue("LRLAT", lrLat * 600000);
cmd.Parameters.AddWithValue("LRLON", lrLon * 600000);
IDataReader reader = cmd.ExecuteReader();
createCsvFile(reader, sw);
reader.Close();
con.Close();
}
}
public static void createCsvFile(IDataReader reader, StreamWriter writer)
{
const string Delimiter = "\"";
const string Separator = ";";
// write header row
for (int columnCounter = 0; columnCounter < reader.FieldCount; columnCounter++)
{
if (columnCounter > 0)
{
writer.Write(Separator);
}
writer.Write(Delimiter + reader.GetName(columnCounter) + Delimiter);
}
writer.WriteLine(string.Empty);
// data loop
while (reader.Read())
{
// column loop
for (int columnCounter = 0; columnCounter < reader.FieldCount; columnCounter++)
{
if (columnCounter > 0)
{
writer.Write(Separator);
}
writer.Write(Delimiter + reader.GetValue(columnCounter).ToString().Replace('"', '\'') + Delimiter);
} // end of column loop
writer.WriteLine(string.Empty);
} // data loop
writer.Flush();
}
}
}