Форум программистов, компьютерный форум, киберфорум
Наши страницы
ut7du
Войти
Регистрация
Восстановить пароль
Оценить эту запись

Fast save

Запись от ut7du размещена 24.12.2018 в 19:28

using System;
using System.Data;
using System.Data.SQLite;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
private SQLiteConnection db;

public Form1()
{
InitializeComponent();
}

private void ConnectToDB()
{
string dbPath = Path.Combine(Environment.CurrentDirectory, "testdb.sqlite");
string connString = string.Format("Data Source={0}", dbPath);

db = new SQLiteConnection(connString);
db.Open();

// удалить, если нужно чтобы информация добавлялась к существующей...
SQLiteCommand command = new SQLiteCommand("DROP TABLE IF EXISTS Log;", db);
command.ExecuteNonQuery();

SQLiteCommand command2 = new SQLiteCommand("CREATE TABLE IF NOT EXISTS Log (callsign TEXT NOT NULL, data TEXT NOT NULL, time TEXT NOT NULL, op TEXT NOT NULL, qth TEXT NOT NULL, rstin TEXT NOT NULL, rstout TEXT NOT NULL, mode TEXT NOT NULL, freq TEXT NOT NULL, qslin TEXT NOT NULL, qslout TEXT NOT NULL, qsltype TEXT NOT NULL, locator TEXT NOT NULL, state TEXT NOT NULL, iota TEXT NOT NULL, notes TEXT NOT NULL);", db);
command2.ExecuteNonQuery();
}

private async void button1_Click(object sender, EventArgs e)
{
const string InsertDataString = "INSERT INTO [Log] (callsign, data, time, op, qth, rstin, rstout, mode, freq, qslin, qslout, qsltype, locator, state, iota, notes) VALUES (@callsign, @data, @time, @op, @qth, @rstin, @rstout, @mode, @freq, @qslin, @qslout, @qsltype, @locator, @state, @iota, @notes)";

if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
button1.Enabled = false;

Stopwatch sw = new Stopwatch();
sw.Start();

IProgress<int> progress = new Progress<int>(p => progressBar1.Value = p);

await Task.Run(async () =>
{
// to make .NET Core happy about encodings
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

string[] load = File.ReadAllLines(openFileDialog1.FileName, Encoding.GetEncoding("Windows-1251"));

ConnectToDB();

SQLiteCommand cmd = db.CreateCommand();
cmd.CommandText = InsertDataString;

Regex regex = new Regex(@"(?<=>).*?(?=<)", RegexOptions.Compiled);

using (SQLiteTransaction trans = db.BeginTransaction())
{
for (int i = 0; i < load.Length; i++)
{
var matches = regex.Matches(load[i]);

if (matches.Count >= 10) // prevent crash
{
string mycal = matches[0].Value;
string call = matches[1].Value;
string date = matches[2].Value;
string time = matches[3].Value;
string band = matches[4].Value;
string mode = matches[5].Value;
string rx = matches[6].Value;
string tx = matches[7].Value;
string name = matches[8].Value;
string qth = matches[9].Value;

string data_save = DateTime.ParseExact(date, "yyyyMMdd", CultureInfo.InvariantCulture).ToString("dd.MM.yyyy");
string corr_time = DateTime.ParseExact(time, "HHmm", CultureInfo.InvariantCulture).ToString("HH:mm");

cmd.Parameters.Add("@callsign", DbType.String).Value = call;
cmd.Parameters.Add("@data", DbType.String).Value = data_save;
cmd.Parameters.Add("@time", DbType.String).Value = corr_time;
cmd.Parameters.Add("@op", DbType.String).Value = name;
cmd.Parameters.Add("@qth", DbType.String).Value = qth;
cmd.Parameters.Add("@rstin", DbType.String).Value = rx;
cmd.Parameters.Add("@rstout", DbType.String).Value = tx;
cmd.Parameters.Add("@mode", DbType.String).Value = mode;
cmd.Parameters.Add("@freq", DbType.String).Value = band;
cmd.Parameters.Add("@qslin", DbType.String).Value = "";
cmd.Parameters.Add("@qslout", DbType.String).Value = "Send";
cmd.Parameters.Add("@qsltype", DbType.String).Value = "E-QSL";
cmd.Parameters.Add("@locator", DbType.String).Value = "";
cmd.Parameters.Add("@state", DbType.String).Value = "";
cmd.Parameters.Add("@iota", DbType.String).Value = "";
cmd.Parameters.Add("@notes", DbType.String).Value = "";
await cmd.ExecuteNonQueryAsync();
progress.Report((int)((i + 1) * 100f / load.Length));
}
}

trans.Commit();
}
});

// просто вывод отладочной инфы..
sw.Stop();
textBox1.AppendText("Added data to Table [Log], spent " + sw.Elapsed + Environment.NewLine);

SQLiteCommand cmd2 = db.CreateCommand();
cmd2.CommandText = "SELECT COUNT(*) from Log";

textBox1.AppendText("Table [Log] now has " + cmd2.ExecuteScalar() + " rows" + Environment.NewLine);

db.Close();
}
//Application.Restart();
}
}
}
Размещено в Без категории
Просмотров 148 Комментарии 2
Всего комментариев 2
Комментарии
  1. Старый комментарий
    Аватар для Usaga
    Для таких вещей есть gist.github.com
    Запись от Usaga размещена 25.12.2018 в 12:38 Usaga вне форума
  2. Старый комментарий
    Аватар для Jlovenpk1
    Оформи код
    читать удобнее будет
    Запись от Jlovenpk1 размещена 25.12.2018 в 13:41 Jlovenpk1 вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru