プログラミングでアイデアを具現化したい

あらゆるものを具現化するためにプログラミングを始めました。主にC#

SQLiteをやめてSQLServerにプライスを格納することにしたので・・

個人用メモ

実装が楽だしDBの引越しも超楽だからってことで
仮想通貨のプライスを格納するDBにSQLiteを採用していたのだが、
SQLiteのマネージャーツールで良いものがない。
MS様のツールでしかプログラムを書けない私は
コードスニペットや諸々親切な機能から卒業できない)
結局、SQLServerでプライスを保存するように路線変更することにして、
金曜帰宅後着手していたらこんな時間に・・

といってもハリボテだし、アプリの稼働場所(VPS)などの問題もあるので、
アプリから一旦はSQLiteに書き込んで、週に1回csvSQLServer
インサートするという構想(笑)


久しぶりで少し忘れているところもあったので、諸々コード記録。

データベース接続クラス

using System;
using System.Configuration;
using System.Data.SqlClient;
using System.Threading;
using System.Windows.Forms;

namespace VCTS_DB_InsertApp {
    class DBConnection {
        public static DBConnection Provider = new DBConnection();

        private SqlConnection _conn;
        private SqlCommand _cpPrice;

        private int _retry;
        private int _retrySleep;

        private DBConnection() {
            _retry = int.Parse(ConfigurationManager.AppSettings["retry"].ToString());
            _retrySleep = int.Parse(ConfigurationManager.AppSettings["retry_sleep"].ToString());
            _conn = new SqlConnection(ConfigurationManager.ConnectionStrings["DBConn"].ConnectionString);
            _cpPrice = new SqlCommand("[dbo].[price_insert]", _conn);
            _cpPrice.CommandType = System.Data.CommandType.StoredProcedure;

            _cpPrice.Parameters.Add(new SqlParameter("@in_TickTime", System.Data.SqlDbType.DateTime));
            _cpPrice.Parameters.Add(new SqlParameter("@in_Broker", System.Data.SqlDbType.VarChar,50));
            _cpPrice.Parameters.Add(new SqlParameter("@in_Ccy", System.Data.SqlDbType.VarChar,50));
            _cpPrice.Parameters.Add(new SqlParameter("@in_Bid", System.Data.SqlDbType.Decimal));
            _cpPrice.Parameters.Add(new SqlParameter("@in_Ask", System.Data.SqlDbType.Decimal));
            _cpPrice.Parameters.Add(new SqlParameter("@in_SP", System.Data.SqlDbType.Decimal));
            _cpPrice.Parameters.Add(new SqlParameter("@in_Volume", System.Data.SqlDbType.Decimal));
        }

        public void Close() {
            if (_conn != null) _conn.Close();
        }

        public void WritePrice(Price price) {
            _cpPrice.Parameters["@in_TickTime"].Value = price.TickTime;
            _cpPrice.Parameters["@in_Broker"].Value = price.Broker;
            _cpPrice.Parameters["@in_Ccy"].Value = price.CCY;
            _cpPrice.Parameters["@in_Bid"].Value = price.Bid;
            _cpPrice.Parameters["@in_Ask"].Value = price.Ask;
            _cpPrice.Parameters["@in_SP"].Value = price.SP;
            _cpPrice.Parameters["@in_Volume"].Value = price.Volume;

            int cnt = 0;
            while (true) {
                try {
                    _conn.Open();
                    _cpPrice.ExecuteNonQuery();
                    break;
                }
                catch(Exception ex){
                    cnt++;
                    if (cnt > _retry) throw;
                    MessageBox.Show(ex.ToString());
                    Thread.Sleep(_retrySleep);
                }
                finally {
                    if (_conn != null) _conn.Close();
                }
            }
        }
    }
}

データベース書き込み処理

private void ReadCsv(string filePath) {
  var lines = File.ReadLines(filePath);
    foreach (string line in lines) {
      string[] items = line.Split(',');
        try {
          Price price = new Price {
              TickTime = DateTime.Parse(items[0]),
                Broker = items[1],
                CCY = items[2],
                Bid = decimal.Parse(items[3]),
                Ask = decimal.Parse(items[4]),
                SP = decimal.Parse(items[5]),
                Volume = decimal.Parse(items[6]),
          };
          DBConnection.Provider.WritePrice(price);
            DBConnection.Provider.Close();
        }
         catch {
           continue;
         }
   }
}

f:id:tos5511:20170923024346p:plain

無事、SQLServer引越しツールが完成。