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にデータを書き込むことができれば何とかなりそうだ。