2008年12月11日 星期四

使用XmlSerializer時出現無法產生暫存類別的錯誤!

在Asp.Net使用XmlSerializer時,如果網站應用程式的身分識別,使用Network Service時,預設情況會產生下列錯誤:
無法產生暫存類別 (result=1)。
error CS2001: 找不到原始程式檔 'C:\WINDOWS\TEMP\uacaqkr_.0.cs'
error CS2008: 未指定輸入
產生錯誤原因:因為.net framework需要使用到,Windows\Temp產生暫存類別,但預設權限不足產生的錯誤。
解決方法:將網站應用程式的身分識別提升為『本機系統』或是調整Windows\Temp的Network service權限為允許寫入。

2008年7月27日 星期日

ASP.NET無接縫傳值的撰寫模式

問題說明:
所謂ASP.NET的『無接縫傳值』,是指在撰寫網頁間的傳值時,不使用queryString或Session來傳值,而是利用元件的PostBackUrl和Page的PreviousPage來完成網頁間的傳值。一般說來,queryString的方式容易使得網頁的運作參數暴露在瀏覽器的網址列,而遭有心人士利用;而session傳值的方式,容易在使用者同時開啟多個網頁時,產生資料錯置的嚴重錯誤。所以說網頁間的傳值最少必須是使用『無接縫傳值』模式,網站系統的安全性才能獲得基本的保障。

『無接縫傳值』簡易撰寫模式:
一般Asp.Net的程式設計師,大都可以輕易的完成。
首先,在父頁上部署一個具有PostBackUrl Method的元件,並設定此元件的PostBackUrl值。
例如:ImageButton1.PostBackUrl="Page2.aspx";
然後,在Page2.aspx的Page_Load event中接收傳值,語法如下:
protected void Page_Load(object sender, EventArgs e)
{
string postedValue=string.Empty();
if (Page.PreviousPage != null && Page.PreviousPage.IsCrossPagePostBack == true)
postedValue=((TextBox)Page.PreviousPage.FindControl("TextBox1")).Text;
.
.
.
}
如果你使用了MasterPage的機制,請將FindControl的方法,修改如下:
((TextBox)PreviousPage.Master.FindControl("ContentPlaceHolder1").FindControl("TextBox1")).Text;//TextBox1是主頁的控制項ID,也是傳值的控制項

『無接縫傳值』進階整合撰寫模式:
整合AjaxToolKit的HoverMenuExtender控制項,由GridView的子選單中,傳出選取資料列的Key值,並將
PostBackUrl的頁面開啟在新的window。也就是說,當使用者點選選單上的選項後,會開啟新視窗,而新視窗必須接到傳值才能顯示詳細資料,不接受QueryString或Session的方式傳值;當新視窗無法獲得Key時會自動於顯示錯誤說明後關閉視窗。
這個做法包含下列兩個問題:
1.要如何讀取GridView中HoverMenuExtender控制項LinkButton的CommandArgument
2.要如何讓PostBackUrl的網頁在新視窗開啟
如果解決了這兩個問題,再配合基本撰寫模式,網頁間的無縫傳值就可以正確運作了。

我的做法:
1.宣告LinkButton的相關屬性,例如:
<asp:LinkButton ID="lnBtnEdit" runat="server" OnCommand="lnBtnEdit_Click" PostBackUrl="~/Admin/eArticleEdit.aspx" OnClientClick="var scriptName=document.forms[0].action;window.document.forms[0].target='_blank';setTimeout(function(){window.document.forms[0].target='';document.forms[0].action=scriptName;}, 500);" CommandArgument='<%# Bind("articleId") %>'>《編修文章》</asp:LinkButton>

 有關OnClientClick和CommandArgument也可以在GridView1_RowDataBound(object sender, GridViewRowEventArgs e)中完成設定。

2.完成lnBtnEdit_Click的事件程式碼:
protected void lnBtnEdit_Click(Object sender, CommandEventArgs e)
{
HiddenField hf = (HiddenField)Page.Master.FindControl("postbackHF");
hf.Value = e.CommandArgument.ToString();
}


3.在Page2.aspx的Page_Load event中接收傳值。

以上作法就可以完成,ASP.NET無接縫傳值,讓編修資料的頁面,在新的視窗中開起。
接著問題來了,當編修資料頁面完成存檔後,可能需要讓父頁重新Binding資料,該如何做呢~?
請看下回分解!

2008年6月8日 星期日

在MasterPage模式中如何取得PostBackUrl的值?

//--範例語法(C#)
string publishName=String.Empty;
string number=String.Empty;
if (PreviousPage != null && PreviousPage.IsCrossPagePostBack)
{
HiddenField pn = (HiddenField)PreviousPage.Master.FindControl("ContentPlaceHolder1").FindControl("publishNameHF");
publishName = pn.Value;
HiddenField nu = (HiddenField)PreviousPage.Master.FindControl("ContentPlaceHolder1").FindControl("numberHF");
number = nu.Value;
}
//--使用說明
1.在本頁設定要傳值的Control,本範例是使用2個HiddenField來傳值。
2.在本頁設定Control的PostBackUlr。
3.在新頁使用PreviousPage接收來源頁的值。
//本範例適用於MasterPage模式下運作。
//非MasterPage模式範例如下(C#)
string publishName=String.Empty;
string number=String.Empty;
if (PreviousPage != null && PreviousPage.IsCrossPagePostBack)
{
HiddenField pn = (HiddenField)PreviousPage.FindControl("publishNameHF");
publishName = pn.Value;
HiddenField nu = (HiddenField)PreviousPage.FindControl("numberHF");
number = nu.Value;
}

2008年5月26日 星期一

軟體開發心情雜記-1

軟體上線後,如果遇到業主對於系統全無反應,還真的很令人緊張;不知道是系統沒問題還是有問題不知道如何回應。
最近個人就遇到這樣的情境,真是一籌莫展不知如何是好?
後來還是緊張得熬夜一再測試,繼續更新版本。(需要好好的使用測試軟體了)

軟體開發守則:
●reuse的軟體,於開發初期沒有發現問題,等一段時間後才發現問題時,修正的成本會幾何級數增加。

●溝通是非常複雜的情境,每個人都有不同的知識與生活背景,想法常與業主無法契合。




2008年4月20日 星期日

How can save full datetime when convert datetime to string in c#?

‧問題說明:
在使用日期時間函數時,有些情況下需要轉為字串再轉回來DateTime的Type,如何讓日期時間的值完整保留呢?

‧解決方法:
由日期轉字串時請參考下列語法:
DateTime now=DateTime.Now;
string saveDateTime=string.Format("{0:yyyy/MM/dd HH:mm:ss.fffffff}", now);

當我們使用下列判斷式時會得到true。
DateTime.Parse(saveDateTime).Equals(now) is true

‧重點叮嚀:
重要關鍵在於毫秒的取得字數必須是7碼,如果使用一般觀念3碼轉換時,將無法保存完整日期時間值。

2008年4月17日 星期四

在windows 2003 server中文版上安裝英文版Visual studio 2008

‧Visual studio 2008安裝心得分享
‧問題說明:
在windows 2003 server中文版上安裝英文版Visual studio 2008時,如果2003server上尚未安裝.net framework3.5時,安裝系統會自動安裝,但是可能是由於語系不同的原因,會出現錯誤,無法完成2008英文版安裝程序。
‧解決方法:
只要在下列網址自行下載中文版.net framework3.5;
http://www.microsoft.com/downloads/details.aspx?familyid=333325FD-AE52-4E35-B531-508D977D32A6&displaylang=zh-tw
並手動完成安裝後,再進行英文版VS2008安裝即可大功告成。

2008年3月29日 星期六

memo

//private void keyHook_KeyDown(object sender, KeyEventArgs e) private void queryCB_KeyDown(object sender, KeyEventArgs e) {
if (e.Control == true && e.KeyCode == Keys.C) { Clipboard.SetText(queryCB.SelectedText); e.Handled = false; e.SuppressKeyPress = true; return; } else if (e.Control == true && e.KeyCode == Keys.V) { queryCB.Text = Clipboard.GetText(); e.Handled = false; e.SuppressKeyPress = true; return; }
switch (e.KeyCode) { case Keys.RShiftKey: enabledBU_Click(this, new EventArgs()); break; case Keys.Enter: e.Handled = false; e.SuppressKeyPress = true; if(queryCB.Text.Trim().Length >0) beginQueryBU_ButtonClick(this, new EventArgs()); break; case Keys.BrowserBack: e.Handled = false; e.SuppressKeyPress = true; break; case Keys.Back: e.Handled = false; e.SuppressKeyPress = true; if (queryCB.Text.Length > 0) { try { int sLength = queryCB.SelectionLength == 0 ? 1 : queryCB.SelectionLength; int position = queryCB.SelectionLength == 0 ? queryCB.SelectionStart - 1 : queryCB.Text.IndexOf(queryCB.SelectedText); queryCB.Text = queryCB.Text.Remove(position, sLength); queryCB.SelectionStart = position > queryCB.Text.Length ? queryCB.Text.Length : position; queryCB.SelectionLength = 0; queryCB.Select(); } catch { } } break; case Keys.Delete: e.Handled = false; e.SuppressKeyPress = true; if (queryCB.Text.Length > 0 && queryCB.SelectionStart < slength =" queryCB.SelectionLength" position =" queryCB.SelectionStart;" text =" queryCB.Text.Remove(position," selectionstart =" position"> queryCB.Text.Length ? queryCB.Text.Length : position; queryCB.SelectionLength = 0; queryCB.Select(); } break; case Keys.Left: e.Handled = false; e.SuppressKeyPress = true; queryCB.SelectionLength = 0; if (queryCB.SelectionStart > 0) queryCB.SelectionStart = queryCB.SelectionStart - 1; break; case Keys.Right: e.Handled = false; e.SuppressKeyPress = true; queryCB.SelectionLength = 0; if (queryCB.SelectionStart < queryCB.Text.Length) queryCB.SelectionStart = queryCB.SelectionStart + 1; break; case Keys.Down: e.Handled = false; e.SuppressKeyPress = true; break; default: e.Handled = false; e.SuppressKeyPress = true; break; } }

2008年3月24日 星期一

如何將COM元件轉成.Net可以參考的DLL元件

COM COM+是微軟早期開發的元件,數量不在少數,如何引用這些COM元件。
本文以SHDOCVW.DLL這顆元件為例說明如何在.NET開發環境中引用參考:
首先請找到:SN.EXE(C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin)
接著產生一組新的金鑰組並將它寫入指定的檔案。
語法如下:
sn -k trObject.snk
然後利用tlbIMP.exe工具程式,將 COM 型別程式庫中的型別定義轉換為 Common Language Runtime 組件中的等效定義。
語法如下:
tlbimp c:\windows\system32\shdocvw.dll /out:c:\temp\Interop.shdocvw.dll /keyfile:trObject.snk /namespace:ShDocVw
如此就可以產生一顆含有強勢名稱的元件了。

2008年3月13日 星期四

DataTable的序列化和反序列化

來源網址:http://www.cnblogs.com/moonspell/archive/2007/07/17/821201.html
///
/// 序列化DataTable
///

/// DataTable
/// 序列化的DataTable
private static string SerializeDataTableXml(DataTable pDt) {
// 序列化DataTable
StringBuilder sb = new StringBuilder();
XmlWriter writer = XmlWriter.Create(sb);
XmlSerializer serializer = new XmlSerializer(typeof(DataTable));
serializer.Serialize(writer, pDt);
writer.Close();
return sb.ToString();
}

///
/// 反序列化DataTable
///

/// 序列化的DataTable
/// DataTable
public static DataTable DeserializeDataTable(string pXml) {

StringReader strReader = new StringReader(pXml);
XmlReader xmlReader = XmlReader.Create(strReader);
XmlSerializer serializer = new XmlSerializer(typeof(DataTable));

DataTable dt = serializer.Deserialize(xmlReader) as DataTable;

return dt;
}

2008年3月11日 星期二

Ajax Serialization Converters

(jsonserialization)
(converters)
(add type="Microsoft.Web.Preview.Script.Serialization.Converters.DataSetConverter, Microsoft.Web.Preview" name="DataSetConverter")
(add type="Microsoft.Web.Preview.Script.Serialization.Converters.DataRowConverter, Microsoft.Web.Preview" name="DataRowConverter")
(add type="Microsoft.Web.Preview.Script.Serialization.Converters.DataTableConverter, Microsoft.Web.Preview" name="DataTableConverter")
(/converters)
(/jsonserialization)

2008年2月2日 星期六

共享軟體使用協議範例

XXXX是一款共享軟體。作者享有一切權利。 您可以自由使用、複製、傳播、發布此軟體的未註冊版;未經作者書面認可,任何人不得作任何修改或用於商業用途。違者作者將追究其最大責任。

  請仔細閱讀以下使用許可,如果您不同意以下任何一點,請立即停止使用此軟體:

1.本軟體產品的版權歸XXXXX所有,受到適用版權法及其他知識產權法及條約的保護。
2.軟體作者XXXXXX授予您對此版本的最終用戶使用許可權。
3.擔保責任:使用本軟體產品是您在充分了解本軟體特性基礎上進行的,故由您自已承擔使用本軟體可能造成的風險。在適用法律所許可的最大範圍內,作者不承認任何明示或默示的擔保或條件。
4.無賠償責任:使用本軟體產品是您在充分了解本軟體特性基礎上進行的,故由您自已承擔使用本軟體可能造成的損失。在適用法律所許可的最大範圍內,作者不承擔使用此軟體版本所造成的任何損失。
5.您不能對此軟體作任何的軟體反向工程,如反匯編,跟蹤等。
6.您可以自由使用、複製、傳播、發布此軟體的未注冊版,但未徵得作者同意的情況下,您不能收取任何費用或用於商業目的,如銷售,捆綁,集成等。同時,必須保証所分發的軟體包含全部檔案,并且未作任何修改。
7.你可以長期使用本軟體的未註冊版,但是生成的錄影檔案中會有“未註冊”等字樣。

您一旦傳播、安裝、複製或以其它方式使用《螢幕錄影專家》,即表示您同意接受以上各項條件的約束。如您不同意以上條件的約束,請不要傳播、安裝或使用該軟體。

公司資訊
連絡電話、網址

2008年1月9日 星期三

將ANSI編碼的文字轉為Unicode

source 來源:啟隆
Response.Write(Util.Big52Unicode(tt));
///
/// ANSI轉Unicode
///

///
///
public static string Big52Unicode(string str)
{
new Regex("&#(?[^;]+)", RegexOptions.IgnoreCase);
Match mc = re.Match(str);
while (mc.Success)
{
int S = Convert.ToInt32(mc.Result("${pp}"));
string newS = Char.ConvertFromUtf32(S);
//HttpContext.Current.Response.Write(Char.ConvertFromUtf32(S) +
"
");
str = str.Replace("&#" + S + ";", newS);
mc = mc.NextMatch();
}

return str;
}

完整備份SQLServer

http://www.sqldbatips.com/showarticle.asp?ID=37

using Microsoft.SqlServer.Management.Smo;

namespace SMOTest
{
class Program
{
static void Main()
{
Server svr = new Server();
Backup bkp = new Backup();
bkp.Devices.AddDevice(@"C:\SMOTest.bak", DeviceType.File);
bkp.Database = "SMO";
bkp.Action = BackupActionType.Database;
bkp.Initialize = true;
bkp.PercentCompleteNotification = 10;
bkp.PercentComplete += new PercentCompleteEventHandler(bkp_PercentComplete);
bkp.SqlBackup(svr);
}

static void bkp_PercentComplete(object sender, PercentCompleteEventArgs e)
{
Console.WriteLine(e.Percent.ToString() + "% backed up");
}
}
}