ASP.NET MongoDB資料庫操作類

暖楓無敵發表於2017-08-09

1、Web.config檔案中配置資料庫連線資訊,如下程式碼:

<appSettings>
    <!--連線MongoDB資料庫連線字串開始-->
    <add key="MongoIP" value="192.168.33.162" />
    <add key="MongoDatabase" value="ADS5_HNXY" />
    <!--MongoDB叢集名稱,單臺MongoDB時請註釋掉下面行的配置-->
    <!--<add key="ReplicaSetName" value="atrepl"/>-->
    <add key="MongoUser" value=""/>
    <add key="MongoPassword" value=""/>
    <!--連線MongoDB資料庫連線字串結束 -->
</appSettings>


2、MongoDBHelper操作類,如下程式碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using MongoDB.Bson;
using MongoDB.Driver;
using MongoDB.Driver.Builders;
using MongoDB.Driver.GridFS;
using MongoDB.Driver.Linq;
using AT.Business.IDAO;
using AT.Business.DAL;
using AT_DataShiftService;


namespace BAL.DBHelper
{
    /// <summary>
    /// MongoDB資料庫操作類
    /// </summary>
    public class MongoData
    {


        #region 屬性列表


        private static string ip = System.Configuration.ConfigurationManager.AppSettings["MongoIP"];
        private static string dbname = System.Configuration.ConfigurationManager.AppSettings["MongoDatabase"];
        private static string user = System.Configuration.ConfigurationManager.AppSettings["MongoUser"];
        private static string pwd = System.Configuration.ConfigurationManager.AppSettings["MongoPassword"];
        private static string myReplicaSetName = System.Configuration.ConfigurationManager.AppSettings["ReplicaSetName"];


        private static ReadPreference myReadPreference = ReadPreference.SecondaryPreferred;


        //兩個不同的表名
        private const string _ADS5 = "ads5";
        private const string _POWERPARAMETERS = "PowerParameters";


        private static AT_System_IDAO systemidao = new AT_System_Dal();


        #endregion


        #region MongoDB許可權認證


        /// <summary>
        ///  MongoDB許可權認證
        /// </summary>
        /// <returns></returns>
        public static MongoDatabase getDatabase()
        {
            MongoClientSettings setting = new MongoClientSettings();
            if (!string.IsNullOrEmpty(user) && !string.IsNullOrEmpty(pwd))
            {
                //Logger.Log.Info("MongoDB開啟許可權訪問 " + user + ":" + pwd);
                List<MongoCredential> lstCredential = new List<MongoCredential>();
                lstCredential.Add(MongoCredential.CreateCredential(dbname, user, pwd));
                setting.Credentials = lstCredential;
            }
            setting.Server = new MongoServerAddress(ip);
            if (!string.IsNullOrEmpty(myReplicaSetName))
            {
                //Logger.Log.Info("MongoDB開啟叢集模式 " + myReplicaSetName);
                setting.ConnectionMode = ConnectionMode.ReplicaSet;
                setting.ReplicaSetName = myReplicaSetName;
                setting.ReadPreference = myReadPreference;
            }
            //MongoClient client = new MongoClient(QJBL.MongoDBConn);
            var client = new MongoClient(setting);
            MongoServer server = client.GetServer();
            MongoDatabase database = server.GetDatabase(dbname);
            return database;
        }


        #endregion


        #region 獲取MySQL中對應表具列表資訊 2017-05-17


        /// <summary>
        ///  獲取MySQL中對應表具列表資訊
        /// </summary>
        /// <returns></returns>
        public static DataTable GetMeterList()
        {
            return systemidao.GetMeterList();
        }


        #endregion


        #region 獲取每個整點需要上傳的表具讀數 2017-05-17


        /// <summary>
        /// 獲取每個整點需要上傳的表具讀數
        /// </summary>
        /// <param name="datetime"></param>
        /// <returns></returns>
        public static DataTable AT_Up_EnergyValue4WJW(string datetime)
        {
            DataTable dt = GetMeterList();
            DataTable newDT = new DataTable();
            newDT.Columns.Add("BuildID", typeof(string));
            newDT.Columns.Add("CollectionID", typeof(string));
            newDT.Columns.Add("MeterID", typeof(string));
            newDT.Columns.Add("EnergyValue", typeof(double));
            foreach (DataRowView drv in dt.DefaultView)
            {
                DataRow row = newDT.NewRow();
                if (drv["F_MeasureClassify"].ToString() == "04" || drv["F_MeasureClassify"].ToString() == "14")
                {
                    //從MongoDB中的PowerParameters中取數
                    row["BuildID"] = drv["BuildID"].ToString();
                    row["CollectionID"] = drv["CollectionID"].ToString();
                    row["MeterID"] = drv["MeterID"].ToString();
                    double rawValue = GetDataFromPowerParameters(drv["F_MeterID"].ToString(), DateTime.Parse(datetime), drv["F_ValueType"].ToString());
                    //這裡去除的可能是負數,要做絕對值轉換
                    double absValue = Math.Abs(rawValue);
                    row["EnergyValue"] = double.Parse(drv["F_Ratio"].ToString()) * absValue * 0.0036;
                    WriteLog(drv["F_MeterID"].ToString() + "\t" + datetime + "\t" + (double.Parse(drv["F_Ratio"].ToString()) * absValue * 0.0036) + "\r");
                    newDT.Rows.Add(row);
                }
                else
                {
                    //從MongoDB中的ADS5中取數
                    row["BuildID"] = drv["BuildID"].ToString();
                    row["CollectionID"] = drv["CollectionID"].ToString();
                    row["MeterID"] = drv["MeterID"].ToString();
                    double rawValue = GetDataFromADS5(drv["F_TagName"].ToString(), DateTime.Parse(datetime));


                    double absValue = Math.Abs(rawValue);
                    row["EnergyValue"] = double.Parse(drv["F_Ratio"].ToString()) * absValue;
                    WriteLog(drv["F_TagName"].ToString() + "\t" + datetime + "\t" + double.Parse(drv["F_Ratio"].ToString()) * absValue + "\r");
                    newDT.Rows.Add(row);
                }
            }
            return newDT;
        }


        #endregion


        #region 當F_MeasureClassify不為‘04’和‘14’時,從ADS5表中獲取表頭示數 2017-08-03


        /// <summary>
        /// F_CaclType = 0 ,從ADS5表中獲取資料
        /// </summary>
        /// <param name="TagName"></param>
        /// <param name="DateTime"></param>
        /// <returns></returns>
        public static double GetDataFromADS5(string TagName, DateTime DateTime)
        {
            MongoDatabase db = MongoData.getDatabase();
            //獲得Users集合,如果資料庫中沒有,先新建一個
            MongoCollection col = db.GetCollection(_ADS5);


            var query = Query.And(
            Query.EQ("TagName", TagName),
            Query.EQ("DateTime", DateTime)
            );
            List<BsonDocument> documents = col.FindAs<BsonDocument>(query).ToList();
            //做異常處理
            if (documents.Count != 0)
            {
                BsonElement element = documents[0].GetElement("Value");
                return double.Parse(element.Value.ToString());
            }
            else
            {
                //直至可以獲取到上一個有資料的時刻 2017-08-03
                int index = 0;
                do
                {
                    index++;
                    DateTime NewDateTime = DateTime.AddHours(-1 * index);
                    query = Query.And(
                        Query.EQ("TagName", TagName),
                        Query.EQ("DateTime", NewDateTime)
                     );
                    documents = col.FindAs<BsonDocument>(query).ToList();
                } while (documents.Count == 0);


                BsonElement element = documents[0].GetElement("Value");
                return double.Parse(element.Value.ToString());
            }
        }


        #endregion


        #region 當F_MeasureClassify為‘04’或‘14’時,從PowerParameters表中獲取表頭示數 2017-08-03


        /// <summary>
        /// 從PowerParameters表中獲取資料
        /// </summary>
        /// <param name="TagName"></param>
        /// <param name="DateTime"></param>
        /// <returns></returns>
        public static double GetDataFromPowerParameters(string MeterID, DateTime DateTime, string ValueType)
        {
            MongoDatabase db = MongoData.getDatabase();
            //獲得Users集合,如果資料庫中沒有,先新建一個
            MongoCollection col = db.GetCollection(_POWERPARAMETERS);
            var query = Query.And(
             Query.EQ("MeterID", MeterID),
             Query.EQ("DateTime", DateTime)
             );
            List<BsonDocument> documents = col.FindAs<BsonDocument>(query).ToList();
            //做異常處理
            if (documents.Count != 0)
            {
                BsonElement element = documents[0].GetElement(ValueType);
                return double.Parse(element.Value.ToString());
            }
            else
            {
                //直至可以獲取到上一個有資料的時刻 2017-08-03
                int index = 0;
                do
                {
                    index ++;
                    DateTime NewDateTime = DateTime.AddHours(-1 * index);
                    query = Query.And(
                         Query.EQ("MeterID", MeterID),
                         Query.EQ("DateTime", NewDateTime)
                    );
                    documents = col.FindAs<BsonDocument>(query).ToList();
                } while (documents.Count == 0);


                BsonElement element = documents[0].GetElement(ValueType);
                return double.Parse(element.Value.ToString());
            }
        }


        #endregion


        #region 日誌記錄


        /// <summary>
        /// 
        /// </summary>
        /// <param name="log"></param>
        public static void WriteLog(string log)
        {
            string spath1 = System.AppDomain.CurrentDomain.BaseDirectory + @"\GetInterupt.Log";
            string spath = System.AppDomain.CurrentDomain.BaseDirectory + @"\" + DateTime.Now.ToString("yyyy") + @"\GetInterupt" + DateTime.Now.ToString("MM") + ".Log";
            if (!FileC.IsExistFile(spath))
            {
                FileC.CreateDirectory(FileC.GetDirectoryName(spath));
                FileC.CreateFile(spath);
                FileC.WriteText(spath1, "");
            }
            FileC.AppendText(spath, log + "\r\n");
            FileC.AppendText(spath1, log + "\r\n");
        }

        #endregion

    }
}



    

相關文章