Log.Logger = new LoggerConfiguration() .Enrich.FromLogContext() .MinimumLevel.Debug() .MinimumLevel.Override("Microsoft", LogEventLevel.Warning) .Enrich.WithFunction("SystemUserName", () => Environment.UserName) .Enrich.WithFunction("SystemName", () => sysetmName) .Enrich.WithFunction("OSVersion", () => Environment.OSVersion.VersionString) .Enrich.WithFunction("CurrentManagedThreadId", () => Environment.CurrentManagedThreadId.ToString()) .Enrich.WithFunction("CurrentTimeZone", () => TimeZone.CurrentTimeZone.StandardName) // 時間戳 .Enrich.WithFunction("TimeStamp", () => { System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); // 當地時區 return ((long)(DateTime.Now - startTime).TotalSeconds).ToString(); // 相差秒數 }) .Enrich.WithFunction("LogGuid", () => Guid.NewGuid().ToString("N")) .WriteTo.AmazonS3( new JsonFormatter(), "log.log", "logforservice", Amazon.RegionEndpoint.APNortheast1, "KeyId", "Key", fileSizeLimitBytes: 10, autoUploadEvents: true, rollingInterval: Serilog.Sinks.AmazonS3.RollingInterval.Minute, bucketPath: $"{sysetmName}/{DateTime.Now.Year}/{DateTime.Now.Month}/{DateTime.Now.Day}/{DateTime.Now.Hour}" ) .CreateLogger();
2021年3月2日 星期二
Serial Log - Write to AWS Setting
2021年3月1日 星期一
NLOG Setting - write to Sql,File
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
autoReload="true"
throwExceptions="false"
internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log">
<variable name="myvar" value="myvalue"/>
<targets>
<target name="MessageLogFile" xsi:type="File" fileName="C://logs/CampaignFlow/SendMessageLog_${shortdate}.log"
layout="${longdate} | ${level:uppercase=true} | ${message} ${newline}" />
<target name="coloredConsole" xsi:type="ColoredConsole" useDefaultRowHighlightingRules="false"
layout="${longdate}|${pad:padding=5:inner=${level:uppercase=true}}|${message}" >
<highlight-row condition="level == LogLevel.Debug" foregroundColor="DarkGray" />
<highlight-row condition="level == LogLevel.Info" foregroundColor="Gray" />
<highlight-row condition="level == LogLevel.Warn" foregroundColor="Yellow" />
<highlight-row condition="level == LogLevel.Error" foregroundColor="Red" />
<highlight-row condition="level == LogLevel.Fatal" foregroundColor="Red" backgroundColor="White" />
</target>
<target name="tracelogguid" xsi:type="database" connectionstring="${dbconnectionstring}" commandtext="insert into [dbo].[tracelog] 
 ([controller] ,[action] ,[request] ,[response] ,[createtime] ,[issuccess] ,[requestid] ,[exceptionresult],[errorcode],[stringkeyword],[intkeyword],[guidkeyword]) 
 values (@controller, @action, @request, @response, @createtime, @issuccess, @requestid, @exceptionresult,@errorcode,@stringkeyword,@intkeyword,@guidkeyword);">
<parameter name="@controller" layout="${event-properties:item=controller}" />
<parameter name="@action" layout="${event-properties:item=action}" />
<parameter name="@request" layout="${event-properties:item=request}" />
<parameter name="@response" layout="${event-properties:item=response}" />
<parameter name="@createtime" layout="${event-properties:item=createtime}" />
<parameter name="@issuccess" layout="${event-properties:item=issuccess}" />
<parameter name="@requestid" layout="${event-properties:item=requestid}" />
<parameter name="@request" layout="${event-properties:item=request}" />
<parameter name="@errorcode" layout="${event-properties:item=errorcode}" />
<parameter name="@exceptionresult" layout="${exception:tostring}" />
<parameter name="@stringkeyword" layout="${event-properties:item=stringkeyword}" />
<parameter name="@intkeyword" layout="${event-properties:item=intkeyword}" />
<parameter name="@guidkeyword" layout="${event-properties:item=guidkeyword}" />
</target>
</targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="tracelogguid" />
<logger name="*" levels="Trace,Debug,Warn" writeTo="MessageLogFile,coloredConsole" />
</rules>
</nlog>
2020年5月27日 星期三
[ODA.NET] C# Connect Oracle 9i
目前最推薦的就是利用 Oracle.ManagedDataAccess
但是此套件不支援舊版
所以要連接較舊版本的Oracle可以利用 Oracle.DataAccess.dll
開發工具: Microsoft Visual Studio 2019
資料庫: Oracle9i
1.到Oracle 官網安裝 (以下有傳送門)
要注意版本,如果下載到新版(12.X)會不能用
安裝完成到安裝的資料夾下~\product\11.2.0\client_1\odp.net\bin\4 取出Oracle.DataAccess.dll
再加入專案就完成了

static void Main(string[] args) { string connstring = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=xxxx)(PORT=xxxx))" + "(CONNECT_DATA=(SERVICE_NAME=xxxx)));User Id=xxxx;Password=xxxx;"; using (OracleConnection conn = new OracleConnection(connstring)) { conn.Open(); string sql = "select * from xxxx where ROWNUM = 1"; using (OracleCommand comm = new OracleCommand(sql, conn)) { using (OracleDataReader rdr = comm.ExecuteReader()) { while (rdr.Read()) { Console.WriteLine(rdr.GetString(0)); } } } } }
參考:
C#連Oracle連線字串
Oracle ODAC with Oracle Developer Tools for Visual Studio
2019年11月29日 星期五
[C#] Lambda All() check ListA all in ListB
public static bool ContainsAll<T>(IEnumerable<T> source, IEnumerable<T> values)
{
return values.All(value => source.Contains(value));
}
2019年11月26日 星期二
新增 net core project
$ dotnet new web -o <專案名稱>
dotnet help 可以查看專案型態的參數
安裝npm $ npm install 檢查npm安裝版本
$ npm -v
init npm
$npm init
如果沒有要設定專案資訊 直接Enter到底
結束之後 會再package.json寫入設定
npm安裝套件 ex jquery
$ npm install jquery
安裝LibMan
$ dotnet tool install -g Microsoft.Web.LibraryManager.Cli
Run
$ dotnet run
Ref microsoft microsoft-SingleR install
2019年11月24日 星期日
.Net Core Console使用依賴注入
public static async Task Main(string[] args) { // 取得設定檔 IConfiguration config = new ConfigurationBuilder() .AddJsonFile("appsettings.json", true, true) .Build(); // 建立容器 var serviceCollection = new ServiceCollection(); // 註冊服務 serviceCollection.AddTransient(); serviceCollection.AddTransient (); // 加入SqlServer 連線字串 serviceCollection.AddDbContext (options => options.UseSqlServer(config["ConnectionStrings:DefaultConnection"])); // 建立依賴服務提供者 var serviceProvider = serviceCollection.BuildServiceProvider(); // 執行 await serviceProvider.GetRequiredService ().Run(); }
C# 比較字串不分大小寫
還可以用 String.Compare()
//最後一個參數改成true 就可以忽略大小寫 String.Compare(strSource, strTarget, true)回傳為0 即相等
而另外一種我最常用來做搜尋的方法是Contains()
sourceString.Contains("Search-Word", StringComparison.InvariantCultureIgnoreCase, new System.Globalization.CultureInfo("en-US")));
2019年3月4日 星期一
移除警告
如果要讓警告消失,用NotePad++ 開啟專案檔編輯,
加入 <DependsOnNETStandard>true</DependsOnNETStandard>
這樣一來 警告就不會再出現了
2016年6月7日 星期二
2016年6月2日 星期四
[asp.net]一些日期應用
//取得 上個月月底的天數 string lastMonth = DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.AddMonths(-1).Month).ToString() //取得現在時間的日期 int nowDate = DateTime.Now.Day
2016年5月11日 星期三
[MVC] 簡易分頁 PagedList
2. Controller
using PagedList; using PageList.Models;
public ActionResult Index(int page =1) { //page用來記憶目前是哪一頁 int currentPage = page < 1 ? 1 : page; //資料必須先經過排序 var product = db.Product.Where(x => x.Status == 1).OrderBy(x => x.ID); //分頁資料使用 ToPagedList() //參數分別是傳入所要分頁的頁碼以及分頁資料量 //此範例就是每一頁會有10筆資料 var PageResult = product.ToPagedList(currentPage, 10); return View(PageResult); }
3. View
需要using PagedList.Mvc 和 PagedList
取得分頁:
@Html.PagedListPager((IPagedList)Model, page => Url.Action("Index", new { page = page}))
//設定PagedListRenderOptions 可更改樣式 @Html.PagedListPager((IPagedList)Model, page => Url.Action("Index", new { page = page}) ,PagedListRenderOptions.MinimalWithPageCountText)

//也可以自由設定顯示物件 @Html.PagedListPager((IPagedList)Model, page => Url.Action("Index", new { page = page}), new PagedListRenderOptions { DisplayLinkToIndividualPages=false, DisplayLinkToFirstPage =PagedListDisplayMode.IfNeeded, DisplayLinkToLastPage= PagedListDisplayMode.IfNeeded, DisplayLinkToNextPage = PagedListDisplayMode.IfNeeded, DisplayLinkToPreviousPage = PagedListDisplayMode.IfNeeded, DisplayPageCountAndCurrentLocation = true, PageCountAndCurrentLocationFormat ="第{0}頁 / 共{1}頁" })
https://github.com/TroyGoode/PagedList
2016年5月3日 星期二
[C#][EXIFextractor] Mobile Web 上傳圖片,照片翻轉90度 rotateImage
遇到這種問題 有點傻眼
不知道怎麼解決,測了也沒發現什麼規律性的原因(偏偏我就是拿偏偏我就是用iphone safari)
頓時有了希望全世界都生活在智障型手機的時代是多麼美好,多麼幸福,多麼......方便 ORZ
不過感嘆歸感嘆,希望歸希望,身為21世紀現代人類,還是要追求一下科技進步、社會發展
不用你們提醒我,我知道我現在很難得的正在囉嗦.............
[問題原因] 貌似是瀏覽器吃不到照片的一些tag
這裡有針對IOS詳細介紹照片方向的問題
解決之前 還要加入參考
點我連結下載頁面 進去之後點 Donload Source files
code在這
方便大家 也為了防止頁面被404狙擊 我還是備份一下
HttpPostedFile file = HttpContext.Current.Request.Files["file"]; //Create bitmap image from posted file System.Drawing.Bitmap bmpImg = new System.Drawing.Bitmap(file.InputStream); //rotate if needed bmpImg = rotateImage(bmpImg); //save image targetFilePath = "somewhere..."; bmpImg.Save(targetFilePath, ImageFormat.Jpeg);
public Bitmap rotateImage(System.Drawing.Bitmap img) { try { RotateFlipType rft = RotateFlipType.RotateNoneFlipNone; System.Drawing.Imaging.PropertyItem[] properties = img.PropertyItems; foreach (System.Drawing.Imaging.PropertyItem p in properties) { if (p.Id == 274 || p.Id == 5029) { short orientation = BitConverter.ToInt16(p.Value, 0); switch (orientation) { case 1: rft = RotateFlipType.RotateNoneFlipNone; break; case 3: rft = RotateFlipType.Rotate180FlipNone; break; case 6: rft = RotateFlipType.Rotate90FlipNone; break; case 8: rft = RotateFlipType.Rotate270FlipNone; break; } } } if (rft != RotateFlipType.RotateNoneFlipNone) { img.RotateFlip(rft); } } catch { } return img; }
2016年4月12日 星期二
[C#]string[] convert to int[]
string[] tempRGB = str.Replace("rgb(", "").Replace(")", "").Split(','); int[] RGB = Array.ConvertAll(tempRGB, x => int.Parse(x));
2016年2月16日 星期二
在ActionResult中呼叫ActionResult的Function,並接到Json
就是吧! 當我要新增資料 發現 資料庫已經有這筆資料存在時,就改作Update的動作
Update這個Function 已經存在了,所以就想著直接CALL....
喔!!! 這件事就這麼發生了
介紹一下兩個Funtion
新增 --> ActionResult AddNewProduct ,傳回 bool success, String ErroMsg
Update --> ActionResult ProductUpdate 傳回 bool iResult , String Msg
傳回的東西都是 JsonResult , 我想要抓到 ProductUpdate 的Json 回到 AddNewProduct 傳出去
具體怎麼做剛開始還覺得有可能嗎?真的能成嗎?
一方面又覺得若不行 那真的太笨了 =__=
然後我就問了...行呀! 真的能~~
看看片段的實作 CODE
[HttpPost] public ActionResult AddNewProduct(string ID) { bool iResult = true; string msg=""; bool update = true; if (update) { //把要呼叫的Function ActionResult 轉型成 JsonResult JsonResult r = (JsonResult)ProductUpdate(ID,true); //因為拿到的r是object 所以再轉一次 dynamic resultData = r.Data; //要用的時候,也要給他型別才行 iResult = (bool)resultData.success; if(iResult) { msg = (String)resultData.FinishMsg; msg = msg.Replace("更新", "匯入"); }else { msg = (String)resultData.ErrorMsg; msg = msg.Replace("更新", "匯入") + "請重新新增商品"; } } else { //新增資料 } return new JsonResult() { Data = new { success = iResult , Msg = msg } }; }
附上 stackoverflow
還是GOOGLE的高亮程式碼漂亮阿!
其實每次要把CODE放上來我都會腦抽忘了怎麼弄ORZ
2016年2月4日 星期四
[Lambda]Contains 一次搜尋多筆資料
string[] ArrayNo = {"A111", "B222" , "C333" }; var tmp = db.Product.Where(x => x.Status == 1 && ArrayNo.Contains(x.No)).ToList();
2016年1月6日 星期三
[MVC]CheckBox複選、全選、取消
JQUERY
// Tab名稱的全選和取消 $("#AllTab").change(function () { if ($(this).is(":checked")) { $("[id*=chkTab] input").prop("checked", true); } else { $("[id*=chkTab] input").removeAttr("checked"); } }); $("[id*=chkTab] input").on("change", function () { //全部都選到了,"全部"這個選項打勾,反之,則取消 if ($("[id*=chkTab] input").length == $("[id*=chkTab] input:checked").length) { $("#AllTab").prop("checked", true); } else { $("#AllTab").removeAttr("checked"); } });View 順便講一下好了,checkList 這個是用來記錄CheckBox選取的狀態 MVC 才可以這樣用......
//這段程式碼可以不用理他,是POSTBACK 回來時 //想讓畫面保留勾選的項目 @{ string[] checkList = new string[7];//最後一個存放 全部 的狀態 if (splitFilter[1] != null) { string[] splitck = splitFilter[1].TrimEnd(',').Split(','); if (splitck[0] != "-1") { foreach (string i in splitck) { checkList[int.Parse(i) - 1] = "checked"; } } } }
Checkbox是長這樣的
<input type="checkbox" value="1" @checkList[1]><label>AA</label>
Controller
接到勾選的Tab後,去DB搜尋
之前寫的不太簡潔,順帶記錄一下新寫法
if (Tag != "-1") { ListTagCondition = new List (); foreach (var t in Tag.Substring(0, Tag.Length - 1).Split(',')) { TagCondition.Add(Convert.ToInt32(t)); } product = product.Where(x =>TagCondition.Contains(x.TabName)); }
2015年10月27日 星期二
[C#] DataTable 實現SQL Distinct
DataTable BoardbyMenu = MyDataTable.DefaultView.ToTable(true, "Menu_ID");
來看一下 ToTable的參數:
ToTable ( bool distinct , params string[] columnNames ) ;
第一個true 過濾重複資料
第二個是欄位名稱,可放多個欄位 寫法:
new
string
[] {
"Menu_ID , name"
}
2015年10月12日 星期一
[C#][MVC] 資料寫進DB時,檢查是否有Null
IListproperties = typeof(ProductSize).GetProperties().ToList(); foreach (var p in properties) { if (p.GetValue(create) == null && p.PropertyType == typeof(string)) { p.SetValue(create, ""); } }
2015年10月5日 星期一
[C#]MVC 關於刪除資料RemoveRange Remove
var PTryReport = db.ProductTryReport.Where(x => x.ProductSize_ID == Check.ID); if (PTryReport.Any()) { //原本這樣寫 會出錯交易失敗錯誤 //因為刪除del就會改變PTryReport的值 foreach (var del in PTryReport) { db.ProductTryReport.Remove(del); db.SaveChanges(); } } //理想的寫法 用 RemoveRange 一次刪除全部資料 if (PTryReport.Any()) { db.ProductTryReport.RemoveRange(PTryReport); db.SaveChanges(); }
2015年9月17日 星期四
[C#] Split 分割字串
string tmp = "AA#BB#CC"; string[] strSplit = tmp.Split('#'); string GetValue = strSplit[0]; // 拿到 AA GetValue = tmp.Split('#')[1]; //直接拿到字串 BB //多字元分割 string tmp2 = "AA#|BB$$CC#|"; string[] strSplit2 = tmp2.Split(new string[] { "#|","$$" }, StringSplitOptions.RemoveEmptyEntries); string GetValue2 = ""; foreach(string s in strSplit2) { GetValue2 += s + " "; //拿到 AA BB CC } //20160311 新增 分割換行的寫法 string[] NewLine = tmp.Split(new string[] { Environment.NewLine }, StringSplitOptions.None); //textarea 會把換行符號轉成\n 所以也可以這樣寫 string[] NewLine2 = tmp.products.Replace("\n","|").Split('|');