ASP.NET MongoDB資料庫操作類
阿新 • • 發佈:2018-12-23
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 } }