2015年8月15日土曜日

SQLiteを読む

SDR#のFrequency Managerは周波数をXMLで保存しているので、これを書き換えるにはExcelで十分なのだが、スキャンをしようとするとFrequency Manager + Scannerが必要で、こいつはXMLではなくData Base Fileで周波数などを保存している。そしてこれはSQLiteというモノらしい。
Frequency Manager + ScannerのUIは非常に使いづらく、周波数を5個入力するだけでも大変。ということでどうにかできないかと模索中。とりあえずSQLiteは読めるようになった。大抵の場合読めれば書くのは楽だが、Data Baseはどうなんだろう?

C#でSQLiteを読むにはここからsqlite-netFx45-setup-bundle-x64-2012-1.0.97.0.exeをダウンロードしてくる。今回はx64を使ったが、x32のほうが使い回しできていいと思う。またC#の参照に追加するにはインストールディレクトリから探してこないとダメみたい。僕の環境ではC:\Program Files\System.Data.SQLite\2012\binにSystem.Data.SQLite.dllが入っているので、こいつを追加した。またVisual StudioはExpress 2015を使ったが、Any CPUでは警告が出るために構成マネージャでx64のプラットフォームを設定した。これは2013とかでも同じ。

以下、SQLiteのデータベースを読むためのコード。

using System;
using System.Collections.Generic;
using System.Data.SQLite;
using System.Text;
using System.Windows.Forms;

namespace FreqMgr
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void OpenButton_Click(object sender, EventArgs e)
        {
            string Path = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + @"\SDRSFM";
            string[] FileNames = FileSelect(Path, "FreqMgr.db", "Data Base File|*.db|All File|*.*");

            if (FileNames == null)
            {
                return;
            }

            List<string> tList = new List<string>();

            string[] DataNames = {
                "Id", "Frequency", "Center", "Description", "Mode", "Protocol", "Call Sign", "Service",
                "Shift Enabled", "Shift", "Filter Type", "Filter Bandwidth", "Filter Order",
                "Squelch Enabled", "Squelch", "CW Shift", "Notes", "Date", "Locked", "Flagged"
            };

            StringBuilder sb = new StringBuilder();

            using (SQLiteConnection conn = new SQLiteConnection("Data Source=" + FileNames[0]))
            {
                conn.Open();

                using (SQLiteCommand command = conn.CreateCommand())
                {
                    command.CommandText = "SELECT * FROM Data";

                    using (SQLiteDataReader reader = command.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            sb.Clear();
                            foreach (string DataName in DataNames)
                            {
                                sb.Append(reader[DataName].ToString() + ",");
                            }
                            tList.Add(sb.ToString().Substring(0, sb.Length - 1));
                        }
                    }
                }

                conn.Close();
            }

            sb.Clear();

            foreach (string DataName in DataNames)
            {
                sb.Append(DataName + ",");
            }
            sb.Remove(sb.Length - 1, 1);

            for (int i = 0; i < tList.Count; i++)
            {
                sb.Append("\n" + tList[i]);
            }

            //MessageBox.Show(sb.ToString());
            Clipboard.SetText(sb.ToString().Replace(',', '\t'));
        }

        private string[] FileSelect(string InitialDirectory, string FileName, string Filter, bool Multiselect = false)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.InitialDirectory = InitialDirectory;
            ofd.FileName = FileName;
            ofd.Filter = Filter;
            ofd.Multiselect = Multiselect;

            if (ofd.ShowDialog() != DialogResult.OK)
            {
                return (null);
            }

            return (ofd.FileNames);
        }
    }
}

データを表示するとこうなる。

とりあえずFrequency,Center,Description,Mode,Filter Bandwidthがあれば事足りそう。Dateは謎なデータだ。日しか使われていないし、UTCではなくローカルタイムのようだ。Tと書いてあるからといってUTC-07でもないらしい。おそらくDateは追加日で表示をソートするのに使ってる程度だと思うので、あんまり気にしなくても良さそう。

あとはSQLiteにデータを書き込むことができれば何とかなりそうだ。

0 件のコメント:

コメントを投稿