2016年10月12日 星期三

[筆記]Json Post 限制

參考:

如果要加大長度,在web.config中使用:

<appSettings>
  <add key="aspnet:MaxJsonDeserializerMembers" value="150000" />
</appSettings>

2016年9月18日 星期日

透過Email寫入OneNote(設定電子郵件至OneNote)

參考:

設定方式:

點擊[設定電子郵件至OneNote]

image[3]

上方會出現email地址,請勾選要使用的email,如果想透過其它email,可以選新增其他地址。

SNAGHTML279f8e

進入介面後,選擇新增電子郵件。

SNAGHTML214313

新增電子郵件(新增別名),可以建立新的email帳號,或是使用GMail等帳號。

image

新增別名後,會需要驗證。

SNAGHTML25ba91

驗證之後,再回到地址頁面,可以看到介面上多出了其他email地址。

SNAGHTML2019c6

再來選擇你要發布的筆記本位置,並按下儲存,完成設定。

image

使用方式:

以Gmail為例,以收件人填上 me@ onenote.com,填上主旨與內文,並發送。

image

此時,就可以在onenote筆記上收到發送的文章。

image

2016年9月9日 星期五

[筆記]資料庫寫入中文變成亂碼

參考文章:

問題描述:

  • 在輸入文字「憙」時,發現中文字變成亂碼。

解法一:

  • 在寫入欄位時,使用TSQL 前綴N'憙',EX:Set Name=N'憙'

解法二:

  • 查了當初寫入資料庫的語法,發現了問題點。
    • SqlParameter tParam1 = new SqlParameter("@Name", SqlDbType.VarChar);
      tParam1.Value = "憙";
  • 資料庫中欄位的型態,設定是NVARCHAR;程式端設定為NVARCHAR,中文就可以正確寫入。
    • SqlParameter tParam1 = new SqlParameter("@Name", SqlDbType.NVarChar);
      tParam1.Value = "憙";

2016年9月5日 星期一

[筆記]商家商品引用分享

<div id="portfoliolist"></div>
<script src="http://code.jquery.com/jquery-1.10.2.js"></script>
<script src="http://web2.systemlead.com/iticket/scripts/jquery.tmpl.js"></script>
<!--產品範本定義-->
<script id="myTemplate" type="text/x-jquery-tmpl">
<li class='product-div-wrap ${$data.ACTLBL} TOTAL' data-cat=''>
<div class='product-div' id='divTask${$data.ACTID}'>
<div class='img-wrap'>
<a style='display:block;' href='/eventdetail.html?actid=${$data.ACTID}'>
<img class='ACTPIC1' filename='${$data.ACTPIC1}' src='${$data.photoUrl }' />
</a>
<span class='sArea' style="display:none">
<i class='fa fa-map-marker'></i>
<span>
<a href='/Event.html?type=all&AREA=${$data.ACTADCTY}'>${$data.AreaNa}</a>
</span>
</span>
<span class='type-tag typeE'>
${$data.ACTKIND}
</span>
</div><!--//img-wrap-->
<div class='tags'>
<span class='typeP' >
<a href='/Event.html?type=all&AREA=${$data.ACTADCTY}'>${$data.AreaNa}</a>
</span>
<span class="actdtlad">${$data.ACTDTLAD}</span>
</div><!--//divTag-->
<!--<div class='tags' id='divTag${$data.ACTID}' >
<span class='typeP' style='display:none'>
<a href='/Event.html?type=all&tag=${$data.tag}'>${$data.ClassNa}</a>
</span>
</div> //divTag-->
<div class='info-wrap'>
<a style='display:block;' href='/eventdetail.html?actid=${$data.ACTID}'>
<h3>${$data.ACTNAME}</h3>
</a>
<div class='price'>
<span class='price1'>${$data.TOTCOUNT}
</span>
<span class='price2'>${$data.PRICE}
</span>
</div>
<button class='btn btn-main jsorderadd' id='${$data.ACTID}' price='${$data.PRICE}' jsordername='${$data.ProductName}' actpic1='${$data.ACTPIC1}'>
購買
</button>
</div><!--//info-wrap-->
</div>
</li>
</script>
<script>
$(function () {
SearchResult();
});
//精選特惠
function SearchResult() {
var pagesize='24';
var pageindex = '1';
var apiUrl ='https://aas.systemlead.com/api/values/?method=getaashmasdealsdata&params=40009993,'
+pageindex+','
+pagesize;
//console.log(apiUrl);
// $('#portfoliolist').html('');
$.ajax({
url: apiUrl,
//data: null,
success: function (obj) {
var newobj = ($.parseJSON(obj));
$.each(newobj,function(i,item)
{
item.Tag = '';//首頁暫不放標籤排不下
item.ProductName = item.ACTNAME;//商品名稱
item.AreaNa = item.ACTADCTY;
//var classcode = item.ACTLBL.split(' ')[0].split('-')[1];
item.ClassNa = "";//classcode;
item.photoUrl = 'http://iticket.s3.hicloud.net.tw/'+item.ACTPIC1;
});
try{
$('#myTemplate').tmpl(newobj, {
getTags: function (separator) {
return this.data.tags.join(separator);
}
}).appendTo($('#portfoliolist'));
}
catch(err){alert(err);}
//標籤
$.each(newobj, function (i, item) {
//var targetObjId='#divTag'+item.ACTID;
//RetrieveActLbl($(targetObjId), item.ACTID);
});
},fail: function (err) {
alert(err);
},
dataType: 'JSON'
});
}
</script>
DEMO:

http://kylesheng.blogspot.com/p/testiticket.html

2016年7月1日 星期五

[筆記]ScriptManager.AsyncPostBackTimeout 屬性

snip_20160701103353

有些程式執行會超過1分多鐘,postback運行後,發生timeout的情況。

有一部分是受到這個屬性的影響。這個屬性如過沒有設定,預設值是90秒。所以把此設定屬性拉長就可以。(通常ScriptManager會放在MasterPage中)

EX:
     AsyncPostBackTimeout=”5000”

 

參考:

https://msdn.microsoft.com/zh-tw/library/system.web.ui.scriptmanager.asyncpostbacktimeout(v=vs.110).aspx

2016年6月29日 星期三

讀取GoogleSheet資料,並透過範本排版

讀取Googe Sheet的JSON資料,並透過JQuery.tmpl範本來進行排版。

<script src="http://code.jquery.com/jquery-1.10.2.js"></script>
<script src='http://web2.systemlead.com/iticket/scripts/jquery.tmpl.js'></script>
<script id="myTemplate" type="text/x-jquery-tmpl">
<li class='product-div-wrap>
<div class='product-div'>${getColumData($data,'相關連結')} ${getColumData($data,'專案名稱')}</div>
</li>
</script>
<script>
$(function(){
});
function showsheetfeedcontent(data){
try{
$('#myTemplate').tmpl(data.feed.entry, {
getTags: function (separator) {
return this.data.tags.join(separator);
}
}).appendTo($('#portfoliolist'));
}
catch(err){alert(err);}
}
function getColumData(item,colName)
{
var result='nodata';
var searchStr = 'gsx$'+colName;
$.each(item, function (ii, iitem) {
if (ii.indexOf(searchStr ) > -1)
result= iitem.$t;
});
return result;
}
</script>
<div id='portfoliolist'>
</div>
<!--google表單統計-->
<script type="text/javascript" src="https://spreadsheets.google.com/feeds/list/1cRGyaNQq0mUlSgTRmWKEXeFRID_tmATEe28h0Tno2cY/od6/public/full?alt=json-in-script&amp;callback=showsheetfeedcontent"></script>

結果

補充:Google Sheet須發佈到網路,才可以使用JSON。

snip_20160629174502

2016年6月28日 星期二

2016年6月12日 星期日

[筆記]asp.net postback後JQuery註冊事件失效

Asp.NET中,postback後會導致,JQuery註冊的事件失效。

參考

<script src="http://code.jquery.com/jquery-1.10.2.js"></script>
<script type="text/javascript" language="javascript">
//postback,jquery事件會失效
//重新註冊按鈕事件
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);
function EndRequestHandler(sender, args)
{
initailEvent();
}
$(function(){
initailEvent();
});
//重新註冊事件
function initailEvent(){
$('#btnSend').click(function(){
alert('OK');
});
}
</script>
<input id='btnSend' type='button' value='Send' />

[筆記]asp.net 防止double click

add_beginRequest事件會發生在請求之前,以下面例子,
當發生postback時,會先把觸發postback事件的物件(如按鈕)隱藏,
之後在畫面上面寫入【作業處理中,請稍候...】字樣,
之後執行完postback後要處理的功能後,畫面就會刷新還原。

<script src="http://code.jquery.com/jquery-1.10.2.js"></script>
<script type="text/javascript" language="javascript">
//postback,先處理按鈕
Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(BeginRequestHandler);
function BeginRequestHandler(sender, args)
{
var oControl = args.get_postBackElement();
$(oControl).hide();
$('#sMsg').html('作業處理中,請稍候...');
}
</script>
<span id='sMsg'></span>

2016年6月6日 星期一

[筆記]動態載入js

var apiurl = ‘abc.js';
var jsFile = document.createElement("script");
jsFile.setAttribute("type","text/javascript");
jsFile.setAttribute("src", apiurl);
document.getElementsByTagName("head")[0].appendChild(jsFile);

2016年4月17日 星期日

asp.net透過iframe下載檔案

網頁下載方法:常見

  • 使用<a>網址下載的方式。
  • 透過事件的方式來處理。比如click事件後,觸發下載檔案的方法。

如果要資料來源為資料庫或是要透過程式處理一些邏輯,
常見作法是使用Response.Write處理檔案的標頭內容等資訊,
但直接處理會破壞原先網頁的結構,
所以常透過泛型檔(.ashx)或另一個頁面(.aspx)來處理檔案下載的部分。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IO;
using System.Text;
namespace Web
{
/// <summary>
///downloadFile 的摘要描述
/// </summary>
public class downloadFile : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
this.TestDownloadFile();
}
/// <summary>
/// 測試下載檔案
/// </summary>
private void TestDownloadFile()
{
HttpContext.Current.Response.ContentType = "text/plain";
HttpContext.Current.Response.AddHeader("content-disposition", "attachment;filename=" + string.Format("text-{0}.txt", string.Format("{0:yyyyMMddHHmmss}", DateTime.Today)));
HttpContext.Current.Response.Clear();
using (StreamWriter writer = new StreamWriter(HttpContext.Current.Response.OutputStream, Encoding.UTF8))
{
writer.Write("This is the content");
}
HttpContext.Current.Response.End();
}
public bool IsReusable
{
get
{
return false;
}
}
}
}

在此要處理另外一個頁面處理下載檔案,可能會使用開窗或是導頁的方法。

  • 開窗:可能會受到瀏覽器設定限制,阻擋廣告等機制。
  • 導頁:會跑到另外一個頁面,但設計上可能不希望使用者離開原頁面。

網路上也提供另外一種做法,就是透過iframe的方式下載。

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Web.Default" Theme="Red" %>
<%@ Register src="usercontrol1.ascx" tagname="usercontrol1" tagprefix="uc1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ScriptManager ID="scriptmanager1" runat="server">
</asp:ScriptManager>
<asp:Button ID="btnDownload" runat="server" Text="下載" onclick="btnDownload_Click" />
<div style="display:none">
<!--iframe不可以display:none,可以在外面包div隱藏-->
<iframe id="iframeDownload" runat="server" style="width:0;height:0"></iframe>
</div>
</div>
</form>
</body>
</html>

程式碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace Web
{
public partial class Default : System.Web.UI.Page
{
/// <summary>
/// 網頁讀取
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Page_Load(object sender, EventArgs e)
{
if (Page.IsPostBack)
return;
}
/// <summary>
/// 點擊[下載]
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnDownload_Click(object sender, EventArgs e)
{
//下載網址
string downloadUrl = new Uri(new Uri(Request.Url.AbsoluteUri),"/downloadFile.ashx").AbsoluteUri;
//註冊下載網址給iframe
this.iframeDownload.Attributes.Add("src", downloadUrl);
//重整後網址是否清空,或其他邏輯再依照其他狀況處理
}
}
}

2016年2月2日 星期二

[筆記]MSSQL 限制存取

資料庫還原後,資料庫變成「限制存取」。

查了一下資料,限制存取被改動了。

【屬性】>【選項】>【限制存取】,改為MULTI_USER,即可。

image

image

參考:

[筆記]查詢SQL SEVER連線數

select  db_name(dbid) , count(*) 'connections count'
from master..sysprocesses
where 1=1
and spid > 50
group by  db_name(dbid)
order by count(*) desc

2016年1月22日 星期五

Javascript 月份轉數字

("JanFebMarAprMayJunJulAugSepOctNovDec").indexOf('Jan')/3+1

結果:

Jan=>1,Feb=>2…

2016年1月19日 星期二

取得Google OAuth 資訊

參考文章:[Asp.Net MVC] 使用Asp.Net Idetity整合Google登入
因為畫面有些許不同,在此做個筆記。

  1. 進入  https://console.developers.google.com/project
  2. 點擊【建立專案】。
    image
  3. 填入專案名稱,並選【建立】。
    image
  4. 建立完專案後,點專案名稱,進入專案管理介面【資訊主頁】,並點擊【啟用和管理API】。
    image
    image[59]
  5. 進入憑證,點擊【新增憑證】。
    image
  6. 選擇【OAuth用戶端ID】
    image
  7. 進入之後會提醒設定【設定同意畫面】。
    image
  8. 進入【OAuth同意畫面】後,請填入產品名稱,並確認。
    image
  9. 進入建立用戶端ID的畫面,選擇【網路應用程式】,並點擊【建立】。
    image
  10. 建立憑證的限制,設定授權的網址,點擊【建立】後完成。
    image
  11. 此時,即可取得OAuth的【用戶端ID】與【用戶端密鑰】。
    SNAGHTML1bf957d5
  12. 建立完成之後,憑證清單上,即可看到新增完的憑證。
    SNAGHTML1bfae386
  13. 回到API管理員的【總攬】,可以看到【Google+ API】的選項,點擊進入,
    確認API是否啟用。
    image
  14. 點擊【啟用API】。
    image

2016年1月14日 星期四

Microsoft.Jet.OLEDB.4.0' 提供者並未登錄於本機電腦上

參考文章:

  • Microsoft.Jet.OLEDB.4.0 在 64 bit 主機使用
  • Microsoft.Jet.OLEDB.4.0提供者並未登錄於本機電腦上 問題:
  • 開發環境:XP,32位元
  • 裝機環境:windows 2008,64位元
  • Microsoft Jet 不支援 64 位元的版本 解決方法:
  • 安裝 Microsoft Access Database Engine 2010 可轉散發套件 。
  • https://www.microsoft.com/zh-tw/download/details.aspx?id=13255
  • 原連線字串"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=…"
    ,改為"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=…”。
  • 安裝Microsoft Access Database Engine 2010 可轉散發套件:
    image
    image
    image
    imageimage

    2016年1月6日 星期三

    資料庫排程備份

    環境:

  • SQL Server 2008
  • 首先要先確認一下 SQL Server Agent 服務是啟動的狀態,若是上線的 SQL Server 主機建議將服務設定為自動啟動。
    以下就是登入 SQL Server Management Studio 時操作的畫面。
    開啟物件總管,SQL Server Agent > 按右鍵 >新增作業
    image
    依照左側選單依序設定,前三項是必要執行的:一般、步驟、排程。
    這個設定如下圖直接設定即可。
    image

    每一個作業中可以設定多項步驟。進入[步驟],點擊下方的 [新增]
    image
    選取:類型、資料庫
    再命令區中輸入要執行的T-SQL指令碼,可以點擊 [剖析] 測試是否可以正常執行。
    image
    T-SQL 指令建議事件撰寫好預存程序,在這個畫面上單純只是呼叫預存程序,不宜將太多程序放在這裡,避免日後要變更動作較繁瑣。
    此處輸入自行撰寫的預存程序,主要功能是進行壓縮某一個資料庫的LOG檔案,完整語法可參閱
    SQL 2008 Scheduling Backup and Shrink all db
    排程-設定
    每一個作業中可以設定多項排程。進入[排程],點擊下方的 [新增]
    image
    進入排程設定畫面,選取要執行的類型、執行頻率、時間…等。
    image
    這三個設定後,點擊下方的 [確定],就完成一項新作業,可以在[物件總管]中會看到。
    image

    補充:壓縮語法

    USE MyDB;
    GO
    -- changing the database recovery model to simple.
    ALTER DATABASE MyDB
    SET RECOVERY SIMPLE;
    GO
    -- Shrink UserDBlog file to 20 MB.
    DBCC SHRINKFILE (MyDB
    log, 20);
    GO
    -- changing the database recovery model to FULL.
    ALTER DATABASE MyDB
    SET RECOVERY FULL;
    GO