在撰寫 Store Procudure 時, 因需求關係可能會在其中依據條件的不同來組成 T-SQL 陳述式, 再加以執行。
在一般的條件下, 只需要下 sp_executesql @陳述式變數即可完成執行動作。
但若 T-SQL 陳述式中, 有特殊文字如 "綉", 不論是寫在條件式中或是查詢欄位, 這種特殊文字是無法正常呈現的。
先看下 SQL Server 是如何呈現特殊文字的, 如下, 若直接查詢 " 綉" 這個字, 我們看到的結果會是 "?"。
既然知道了如何以呈現 Unicode 來呈現特殊文字, 那麼若是要在 Store Procedure 中使用 T-SQL 陳述式來查詢特殊文字呢?以下幾點請注意:
1. Unicode 參數請使用 nvarchar 型別
2. 若是使用 T-SQL 陳述式, 請使用 sp_executesql 來配合執行。
以下示範如何在 Stror Procedure 中使用 T-SQL 陳述式並相容 Unicode的作法。
先定義兩個主要參數, @sqlStr 為要存放 T-SQL 陳述式之變數, @pDefinition 為定義參數型別時使用。
定義陳述式及參數型別, 該參數可能會放置特殊文字, 故指定型別為 Nvarchar, 長度則依需求調整。
執行此 T-SQL 陳述式語法如下, @unicodeWord 是定義在 T-SQL 陳述式中的參數, @queryWord 為欲查詢參數(注意: 傳遞此參數時須注意要以 Unicode 傳遞)。
以上, 即可跟特殊文字的問題說再見啦!
流風羽 發表在 痞客邦 留言(0) 人氣(414)
前陣子使用 WebSecurity 產生使用者 Table, 接著再使用 Entity Framework 5.0 由資料庫產生程式碼, 好玩的事情發生了, 在編譯時沒有錯誤, 當有使用到那一些由 Entity Framework T4 產生的 Domain Model 時, 就發生 Run Time Error...
這錯誤訊息是說, 未定義 Entity Key, 也就是 Table 的 Primary Key, 說也奇怪, 檢查一下 Entity Framework Diagram, 奇怪..., 明明有確實是有 Entity Key, 竟然沒有跟著產生出來...
搞了半天, 原來使用 Entity Framework 在 Domain Model 操作時會去尋找他的 Entity Key, 而且它預設只認得 Id 或 EntityNameId 是該 Table 的 Key, 如果使用的 Primary Key 名稱不是以上兩個, 很抱歉, 只能自己加了..., 也就是 Domain Model 的 Entity Key 一個 Key Attribute.
如上, 在 Domain Model using System.ComponentModel.DataAnnotations, 並給予 Entitty Key 一個 Key Attribute.
P.S. 為何 WebSecurity 預設產生的 Table Primary Key 不是用 Id 或 EntityNameId 呢..., 這樣不就每次用 Entity Framework Update 時就要在改一次哩... Orz...
流風羽 發表在 痞客邦 留言(0) 人氣(113)
CSRF(跨網站請求偽造),簡單的說就是尤其他的位置Post偽造資料請求的攻擊,較詳細的解說可參考http://en.wikipedia.org/wiki/Cross-site_request_forgery。
NET MVC 4可使用ValidateAntiForgery來防止CSRF攻擊,僅限Post,其原理只是在Return View時計算出一組Token並帶到頁面上,在Post時會去比對這組Token,使用方法很簡單。
在View(or Templates or Partial)中的Form裡面加入@Html.AntiForgeryToken(在此使用的是Razor語法,若是使用Aspx只要將@去掉並以<% ... %>包起來即可)。
接著在Form Sumit的目標Action上加上[ValidateAntiForgeryToken]這個屬性(若是Action上有這個屬性,但View沒有,會出現Error)。
以上兩個步驟即完成針對CSRF攻擊安全性的提升。
流風羽 發表在 痞客邦 留言(0) 人氣(212)
.NET MVC多國語系,可以利用Resource檔來達到目的。
首先,先在MVC專案底下建立一個「App_LocalResources」資料夾,其主要目的是放置各國語系的Resource檔。
接著,在「App_LocalResources」中建立一個Resource檔。
本範例將這個Resource檔取名為「Resource.resx」(若未指定語系,則以此檔案為主),檔案建立完成後,開啟即可編輯,將所需要的資訊輸入,如下圖,Name是Resource檔的屬性名稱,而Value是該屬性內容,Comment是註解(這不是廢話嗎?);很重要的一點是,Access Modifer記得要設為Public,不然會怎麼叫都叫不到。
編輯完檔案後,開啟檔案屬性,如下圖,Build Action要設為Embedded Resource,Copy to Output Directory設為Copy always,Custom Tool Namespace即為命名空間(Namespace),要呼叫時會用到,請自訂(由於是使用英文版VS,就不在此做翻譯,請使用中文版的朋友稍微自己翻譯一下)。
此時,我們一樣在「App_LocalResources」建立另一個Resource檔,取名為Resource.zh-TW.resx,這邊注意一下zh-TW為繁體中文語系的代碼,若要使用其他語系請自行查詢代碼,另外一個重點是,檔名也務必取為「Resource.語系代碼.resx」,這樣才會被當成同一組;檔案建立完成後,一樣我們給它填寫一些內容(這邊的意思是,Resource.resx有什麼,這邊就應該要有什麼),之後的設定請參照上面流程。
接著,專案建置後即可直接使用,使用方法如下圖,呼叫Resource底下的Practice做呈現(預設是會依照瀏覽器語系呈現),也就是直接呼叫Namespace底下的Resource,呼叫方式為「Namespace.Resource檔名.Resource屬性」,大功告成。
流風羽 發表在 痞客邦 留言(0) 人氣(1,824)
Apple Push Notification service(APNs),要建立Push Server的條件下,就是要有一組Key讓APNs做驗證,以下指令可以製作出Push Server on PHP所需要的Key。
openssl pkcs12 -clcerts -nokeys -out cert.pem -in Certificates.p12
openssl pkcs12 -nocerts -out key.pem -in Certificates.p12
openssl rsa -in key.pem -out key.unencrypted.pem
cat cert.pem key.unencrypted.pem > ck.pem
Certificates.p12 - 從你的Apple鑰匙圈取出的Key
注意:此製作過程必須全部都在該Push Server底下製作,否則解出來的Key是無法使用的。
流風羽 發表在 痞客邦 留言(0) 人氣(292)
SQL Server Backup產出的bak檔,版本是無法向下相容的,如2008產出的bak就無法拿到2005使用,但若是有此需求,有另一解法,可參考以下網址。
此方式就不是透過bak備份檔案還原,而是透過產出指定版本script的方式,透過該script,拿到該指定版本的資料庫做還原。可見路有好幾條,只是看看官們有沒有找到而已呀。
流風羽 發表在 痞客邦 留言(0) 人氣(12,165)
在開發網頁時,時常會將Javascript寫在外部的js檔並直接呼叫使用。在實用面上,如何傳遞參數給該外部js檔使用呢?除了預先在頁面的Javascript區段定義好全域變數供其使用(此方法若全域變數名稱有變動,js亦需要跟著變動),還有另一種利用屬性帶值的方式,以下程式碼簡單示範一下。
HTML
<!--引用外部js 檔-->
<script src ='demo.js' type='text/javascript' data ='data' ></script>
js
// 取得所有 tag名稱為script的 element
var scripts = document.getElementsByTagName('script' );
// 取得最後一個 (也就是現在執行的這一個 )element
var currentScript = scripts[ scripts.length - 1];
// 將data屬性的值取出
var data = currentScript.getAttribute('data' );
利用data這個屬性,我們可以透過簡單的Javascript,取得最後一個tag為script的element,也就是目前HTML執行呼叫的該element,直接取得該data屬性(data屬性只是demo用,名稱可以隨意取。)即可當作參數使用,不需在HTML裡面再撰寫Javascript,是不是很方便呢?
流風羽 發表在 痞客邦 留言(0) 人氣(3,569)
為了還原一個bak檔,使用GUI搞了半天,一直回報錯誤而無法還原,最後只好嘗試自己下語法還原,短短兩行就把問題解決了。
RESTORE DATABASE DatabaseName
FROM DISK = 'BakFilePath' ;
其中DatabaseName就是要還原的資料庫名稱,而BakFilePath就是要還原的bak檔案路徑(含檔名),如C:\db.bak,以上。這個故事告訴我們不要太依賴GUI(嘆)。
另外,更詳細的SQL Server Restore語法可參考以下網址:
流風羽 發表在 痞客邦 留言(0) 人氣(2,570)
以下程式碼將示範如何將Bitmap轉為指定格式的圖片並儲存至外部儲存裝置SDCard。
若要寫入SDCard,必須先將寫入外部儲存裝置的權限打開,於Android專案的AndroidMaifest.xml中加入以下敘述。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
try {
// 取得外部儲存裝置路徑
String path = Environment.getExternalStorageDirectory().toString ();
// 開啟檔案
File file = new File( path, "Image.png");
// 開啟檔案串流
FileOutputStrea out = new FileOutputStream(file );
// 將 Bitmap壓縮成指定格式的圖片並寫入檔案串流
bmp.compress ( Bitmap. CompressFormat.PNG , 90 , out);
// 刷新並關閉檔案串流
out.flush ();
out.close ();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace ();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace ();
}
流風羽 發表在 痞客邦 留言(0) 人氣(7,085)
如果在主要Activity中setContentView,所指定的View為自訂的extends View class的話,該如何在該extends View class中呼叫finish()來關閉App呢?以下簡單程式碼即可達成目的。
// 主要Activity
setContentView(new FdView(this));
// Extents View class
(( Activity)context).finish ();
注意,extends View class中context即為主要Activity,在extends View class的constructor中可assign給class中的自訂變數,故要將其轉型成Activity方可使用finish()將App結束。
流風羽 發表在 痞客邦 留言(0) 人氣(311)