2020年2月7日 星期五
[SQL] 新增大量資料 - SqlBulkCopy
最近在用一物一碼,所以會需要產生大批編號
如果使用一筆一筆insert的話, 100萬筆資料不知道要存到哪一天了
這時候建議還是直接用sql bulk insert
ex.
using (SqlConnection conn = new SqlConnection(oneGoodsCS))
{
conn.Open();
using (SqlBulkCopy copy = new SqlBulkCopy(conn))
{
copy.DestinationTableName = "DemoTable";
DataTable dt = new DataTable("DemoTable");
dt.Columns.Add("ID", typeof(string));
dt.Columns.Add("TraceCodeID", typeof(int));
#region sub
for (var i = 0; i < request.Count; i++)
{
var code = Guid.NewGuid().ToString().ToLower();
dt.Rows.Add(code, "traceCodeID");
}
copy.WriteToServer(dt);
#endregion
}
}
2020年1月31日 星期五
[C#] 非同步觀念紀錄
1.偏向處理IO bound(讀取記憶體/硬碟密集),但CPU Loading較低的工作,
如:讀文件、資料庫、網路要求資料(webservice)
2.是並行處理 concurrent, 與平行處理不同
3.一般建議任何方法(method)超過50ms才能完成,建議改非同步
4.4~5條thread就很夠處理一般程式(ex.賽車換輪胎範例)
5.非同步目的是提高執行效能與回應速度
6.thread safey : 多執行序環境下也可以確保得到預期結果
7.Critical Section: 任意一段程式碼,不允許多執行緒同時執行這段程式碼 ex.lock
8.Deadlock: 當兩個執行緒都嘗試鎖定另一個執行緒已經鎖定的資源時,就會發生死結,導致兩個執行緒都不能繼續執行
9.Context Switch: thread 記錄當下狀態,並換成其他thread(是會消耗成本)
10.非同步進程 : APM, EAP, TPL, TAP
11.blocking thread, 建議不用 .result wait waitall .thread join等會讓執行等待的方式, 改用WhenAll(tasks),await
12.不要混用同步與非同步方法
13.正常情況,不要使用 async void MethodAsync(){}, 改用回傳Task才能捕捉異常與執行結果
14.await Task.Delay 替代 Thread.Sleep
如:讀文件、資料庫、網路要求資料(webservice)
2.是並行處理 concurrent, 與平行處理不同
3.一般建議任何方法(method)超過50ms才能完成,建議改非同步
4.4~5條thread就很夠處理一般程式(ex.賽車換輪胎範例)
5.非同步目的是提高執行效能與回應速度
6.thread safey : 多執行序環境下也可以確保得到預期結果
7.Critical Section: 任意一段程式碼,不允許多執行緒同時執行這段程式碼 ex.lock
8.Deadlock: 當兩個執行緒都嘗試鎖定另一個執行緒已經鎖定的資源時,就會發生死結,導致兩個執行緒都不能繼續執行
9.Context Switch: thread 記錄當下狀態,並換成其他thread(是會消耗成本)
10.非同步進程 : APM, EAP, TPL, TAP
11.blocking thread, 建議不用 .result wait waitall .thread join等會讓執行等待的方式, 改用WhenAll(tasks),await
12.不要混用同步與非同步方法
13.正常情況,不要使用 async void MethodAsync(){}, 改用回傳Task才能捕捉異常與執行結果
14.await Task.Delay 替代 Thread.Sleep
2020年1月16日 星期四
[MVC] 自訂Authentication
複習一下 :
public class CustomAuthenticationFilter : IAuthenticationFilter
{
public void OnAuthentication(AuthenticationContext filterContext)
{
if (filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), inherit: true)
|| filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), inherit: true))
{
return;
}
if (filterContext.Principal.Identity.IsAuthenticated && filterContext.Principal.Identity is FormsIdentity)
{
}
else
{
filterContext.Result = new HttpUnauthorizedResult();
}
}
public void OnAuthenticationChallenge(AuthenticationChallengeContext filterContext)
{
if (filterContext.Result == null || filterContext.Result is HttpUnauthorizedResult)
{
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary
{
{"controller","Default"},
{"action","Logon"},
{"returnUrl",filterContext.HttpContext.Request.RawUrl }
});
}
//or do something , add challenge to response
}
}
參考:https://dotblogs.com.tw/libtong/2017/10/03/105527
public class CustomAuthenticationFilter : IAuthenticationFilter
{
public void OnAuthentication(AuthenticationContext filterContext)
{
if (filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), inherit: true)
|| filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), inherit: true))
{
return;
}
if (filterContext.Principal.Identity.IsAuthenticated && filterContext.Principal.Identity is FormsIdentity)
{
}
else
{
filterContext.Result = new HttpUnauthorizedResult();
}
}
public void OnAuthenticationChallenge(AuthenticationChallengeContext filterContext)
{
if (filterContext.Result == null || filterContext.Result is HttpUnauthorizedResult)
{
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary
{
{"controller","Default"},
{"action","Logon"},
{"returnUrl",filterContext.HttpContext.Request.RawUrl }
});
}
//or do something , add challenge to response
}
}
參考:https://dotblogs.com.tw/libtong/2017/10/03/105527
2020年1月12日 星期日
[SQL] 學習 IN和EXISTS用法的差別
引用:https://www.jianshu.com/p/f212527d76ff
引用 :https://read01.com/zh-tw/ggKA5P.html#.Xhq8usgkuUk
exist會針對子查詢的表使用索引.
not exist會對主子查詢都會使用索引.
in與子查詢一起使用的時候,只能針對主查詢使用索引.
not in則不會使用任何索引. 注意,一直以來認為exists比in效率高的說法是不準確的
紀錄一下
2019年12月31日 星期二
[ng] Angular note
Angular note
Angular CLI 實用指令
npm install -g angular-cli 安裝
ng --help 說明
ng new 建立新專案
ng g c 建立component
ng g p 建立pipe
...常用<schematic>:
class component directive enum guard interface module pipe service
ng serve --open 啟用網站
基本內容建立格式
1. Import
2. 修飾詞
3. Output
資料綁定 4種
{{}}
[property] = "value" : 屬性綁定
(event) = "hander" : 事件綁定
[(ngModel)] = "property" : 雙向綁定
<!-- 雙向綁定 -->
<input [(ngModel)]="property">
<!-- 屬性綁定 -->
<input [ngModel]="property">
<!-- 事件綁定 -->
<input (ngModelChange)="handler($event)">
裝飾結構說明
@Component :
@Pipes
@Directive :
結構型Structural Directives:*ngfor,
屬性型Attribute Directives:[(ngModel)]
@Injectable : Service 的裝飾器
Routing說明
forRoot
forChild
路由在查找的時候是有順序性:AppRoutingModule放後面
模組延遲載入 : ex.loadChildren: './feature/feature.module#FeatureModule'
預先載入 :頁面初始化的時候就把所有可延遲載入的模組透過背景非同步地下載
負責重新配置頁面中應該顯示哪些 Component
[routerLink]="['..', path.checkoutFlow.paymentInfo]" 回上層
其他:
Angular JIT vs AOT
Component 只負責處理畫面、資料綁定
Service 則負責像是取得資料、表單驗證等等的邏輯處理,
ref :
[Angular 深入淺出三十天] https://ithelp.ithome.com.tw/articles/10205808
custom pipes https://angular.io/guide/pipes#custom-pipes
[Angular 大師之路] https://ithelp.ithome.com.tw/articles/10203550
[Angular2速成班]用Angular CLI節省你的開發時間 https://dotblogs.com.tw/wellwind/2016/09/30/angular2-angular-cli
HTTP Cache 機制 https://blog.techbridge.cc/2017/06/17/cache-introduction/
好用擴充:
angular2-prettyjson
Angular CLI 實用指令
npm install -g angular-cli 安裝
ng --help 說明
ng new 建立新專案
ng g c 建立component
ng g p 建立pipe
...常用<schematic>:
class component directive enum guard interface module pipe service
ng serve --open 啟用網站
基本內容建立格式
1. Import
2. 修飾詞
3. Output
資料綁定 4種
{{}}
[property] = "value" : 屬性綁定
(event) = "hander" : 事件綁定
[(ngModel)] = "property" : 雙向綁定
<!-- 雙向綁定 -->
<input [(ngModel)]="property">
<!-- 屬性綁定 -->
<input [ngModel]="property">
<!-- 事件綁定 -->
<input (ngModelChange)="handler($event)">
裝飾結構說明
@Component :
@Pipes
@Directive :
結構型Structural Directives:*ngfor,
屬性型Attribute Directives:[(ngModel)]
@Injectable : Service 的裝飾器
Routing說明
forRoot
forChild
路由在查找的時候是有順序性:AppRoutingModule放後面
模組延遲載入 : ex.loadChildren: './feature/feature.module#FeatureModule'
預先載入 :頁面初始化的時候就把所有可延遲載入的模組透過背景非同步地下載
負責重新配置頁面中應該顯示哪些 Component
[routerLink]="['..', path.checkoutFlow.paymentInfo]" 回上層
其他:
Angular JIT vs AOT
Component 只負責處理畫面、資料綁定
Service 則負責像是取得資料、表單驗證等等的邏輯處理,
ref :
[Angular 深入淺出三十天] https://ithelp.ithome.com.tw/articles/10205808
custom pipes https://angular.io/guide/pipes#custom-pipes
[Angular 大師之路] https://ithelp.ithome.com.tw/articles/10203550
[Angular2速成班]用Angular CLI節省你的開發時間 https://dotblogs.com.tw/wellwind/2016/09/30/angular2-angular-cli
HTTP Cache 機制 https://blog.techbridge.cc/2017/06/17/cache-introduction/
好用擴充:
angular2-prettyjson
2019年12月20日 星期五
[C#] 推薦分析程式工具
推薦暗黑大筆記 : 重構筆記 - .NET 壞味道補充包
裡面有NDepend 套件內的依些壞味道rule
一些常見的壞味道
1.一個類別太大 200行以上
2.方法太大太複雜
3.方法參數過多
還有很多值得學習與思考的地方
強烈推薦可以去研究看看
2019年12月19日 星期四
[sql] 將特定欄位當作 column
最近遇到要把 資料庫某個欄位當作 column 使用
所以就查詢了一下,目前有兩種方式
1.使用PIVOT, 轉置table, 但是原始column name 不能跟欄位裡面的值重複, 不然會出錯
說明: 先動態取得要轉置成column的欄位, ColumnGroup , 組成需要的字串, 再用PIVOT轉置TABLE
所以就查詢了一下,目前有兩種方式
1.使用PIVOT, 轉置table, 但是原始column name 不能跟欄位裡面的值重複, 不然會出錯
說明: 先動態取得要轉置成column的欄位, ColumnGroup , 組成需要的字串, 再用PIVOT轉置TABLE
訂閱:
文章 (Atom)