2009年12月3日 星期四

修正asp.net menu在google chrome 顯示不正常的方法

將以下的code 複製到 page load 即可。
(若有使用master page 只需copy在master page即可,若無,則需每一頁之page load都嵌入以下code)

If (Request.UserAgent.IndexOf("AppleWebKit") > 0) Then
Request.Browser.Adapters.Clear()
End If

2009年11月27日 星期五

存取遠端資料庫伺服器的方法

三種方法可擇一使用

1. 使用SQL Server Enterprise Manager工具


選擇某一SQL Server --> 安全性 --> 連結伺服器 --> 新增連結伺服器  在【一般】頁籤中的連結的伺服器欄位中輸入欲連結伺服器的網路名稱全名。
顯示畫面如下:



在【安全性】頁籤中,選擇【使用下列安全性條件進行連線】輸入帳號及密碼。
顯示畫面如下:



2. 在QUERY ANALYZER中輸入


EXEC sp_addlinkedserver ‘xxx.xxx.xxx.xxx’,N’SQLServer的名稱’

EXEC sp_addlinkedsrvlogin ‘xxx.xxx.xxx.xxx’,’false’,NULL,’使用者帳號’,’密碼’

註: 其中紅色字體的N就直接輸入N 代表後面的字是Unicode

3. 直接在SQL指令中加入遠端伺服器連結資訊


以下範例查詢cydc.cyu.edu.tw資料庫伺服器中person資料庫的dbo所擁有的baperson資料表

select *


from opendatasource('sqloledb','data source=cydc.cyu.edu.tw;user id=帳號;password=密碼').person.dbo.baperson

4. 不同使用方法的差異:


若使用上述1及2的方式只需事先於該SQL Server中執行一次註冊動作,往後執行SQL 指令時可直接使用以下的方法連結到遠端資料庫:

select *


from [cydc.cyu.edu.tw].person.dbo.baperson

若使用第3種方法的話,則只需於每次執行SQL 指令時加入相關的連結資訊即可,不需事先執行1及2的前置動作。

2009年11月26日 星期四

開啟沒有功能列的新視窗

Dim javascript As String
javascript = "window.open('aaa.aspx','','left=150,top=150,width=600,height=600,toolbar=0,resizable=0');"
Page.ClientScript.RegisterClientScriptBlock(GetType(Page), Me.ClientID, javascript, True)
Dim javascript As String
javascript = " "
Response.Write(javascript)

gridview列: 數位、貨幣和日期 顯示格式

形式 語法 結果 注釋


數字 {0:N2} 12.36

數字 {0:N0} 13

貨幣 {0:c2} $12.36

貨幣 {0:c4} $12.3656

貨幣 "¥{0:N2}" ¥12.36

科學計數法 {0:E3} 1.23E+001

百分數 {0:P} 12.25% P and p present the same.

日期 {0:D} 2006年11月25日

日期 {0:d} 2006-11-25

日期 {0:f} 2006年11月25日 10:30

日期 {0:F} 2006年11月25日 10:30:00

日期 {0:s} 2006-11-26 10:30:00

時間 {0:T} 10:30:00

在設置gridview等資料綁定控制項的模版列時,總要設置顯示的格式,這裏是我查詢一些資料後統計出來的。


還有一個常規的選項是用資料庫中默認的格式顯示。



四捨五入保留兩位小數:

double dValue = 0.2356;

double result = System.Math.Round(dValue,2);



直接用 i.ToString("0.00")



格式化

日期:

ToString("yyyy-MM-dd")

返回2004-9-7

時間:

ataFormatString="{0: HH:mm:ss}"

(:) 時間分隔符號。在某些區域設置中,可以使用其他字元表示時間分隔符號。時間分隔符號在格式化時間值時分隔小時、分鐘和秒。格式化輸出中用作時間分隔符號的實際字元由系統的 LocaleID 值確定。

(/) 日期分隔符號。在某些區域設置中,可以使用其他字元表示日期分隔符號。日期分隔符號在格式化日期值時分隔日、月和年。格式化輸出中用作日期分隔符號的實際字元由您的區域設置確定。

(%) 用於表明不論尾隨什麼字母,隨後字元都應該以單字母格式讀取。也用於表明單字母格式應以用戶定義格式讀取。有關詳細資訊,請參見下面的內容。

d 將日顯示為不帶前導零的數字(如 1)。如果這是用戶定義的數位格式中的唯一字元,請使用 %d。

dd 將日顯示為帶前導零的數字(如 01)。

ddd 將日顯示為縮寫形式(例如 Sun)。

dddd 將日顯示為全名(例如 Sunday)。

M 將月份顯示為不帶前導零的數字(如一月表示為 1)。如果這是用戶定義的數位格式中的唯一字元,請使用 %M。

MM 將月份顯示為帶前導零的數字(例如 01/12/01)。

MMM 將月份顯示為縮寫形式(例如 Jan)。

MMMM 將月份顯示為完整月份名(例如 January)。

gg 顯示時代/紀元字串(例如 A.D.)

h 使用 12 小時制將小時顯示為不帶前導零的數字(例如 1:15:15 PM)。如果這是用戶定義的數位格式中的唯一字元,請使用 %h。

hh 使用 12 小時制將小時顯示為帶前導零的數字(例如 01:15:15 PM)。

H 使用 24 小時制將小時顯示為不帶前導零的數字(例如 1:15:15)。如果這是用戶定義的數位格式中的唯一字元,請使用 %H。

HH 使用 24 小時制將小時顯示為帶前導零的數字(例如 01:15:15)。

m 將分鐘顯示為不帶前導零的數字(例如 12:1:15)。如果這是用戶定義的數位格式中的唯一字元,請使用 %m。

mm 將分鐘顯示為帶前導零的數字(例如 12:01:15)。

s 將秒顯示為不帶前導零的數字(例如 12:15:5)。如果這是用戶定義的數位格式中的唯一字元,請使用 %s。

ss 將秒顯示為帶前導零的數字(例如 12:15:05)。

F 顯示秒的小數部分。例如,ff 將精確顯示到百分之一秒,而 ffff 將精確顯示到萬分之一秒。用戶定義格式中最多可使用七個 f 符號。如果這是用戶定義的數位格式中的唯一字元,請使用 %f。

T 使用 12 小時制,並對中午之前的任一小時顯示大寫的 A,對中午到 11:59 P.M 之間的任一小時顯示大寫的 P。如果這是用戶定義的數位格式中的唯一字元,請使用 %t。

tt 使用 12 小時制,並對中午之前任一小時顯示大寫的 AM;對中午到 11:59 P.M 之間的任一小時顯示大寫的 PM。

y 將年份 (0-9) 顯示為不帶前導零的數字。如果這是用戶定義的數位格式中的唯一字元,請使用 %y。

yy 以帶前導零的兩位元數位格式顯示年份(如果適用)。

yyy 以四位元數位格式顯示年份。

yyyy 以四位元數位格式顯示年份。

z 顯示不帶前導零的時區偏移量(如 -8)。如果這是用戶定義的數位格式中的唯一字元,請使用 %z。

zz 顯示帶前導零的時區偏移量(例如 -08)

zzz 顯示完整的時區偏移量(例如 -08:00)

讀取Excel檔資料存到DB中

string xlsFullName = FileUpload1.PostedFile.FileName;
string FileName = FileUpload1.PostedFile.FileName.Substring(FileUpload1.PostedFile.FileName.LastIndexOf("\\") + 1, FileUpload1.PostedFile.FileName.Length - FileUpload1.PostedFile.FileName.LastIndexOf("\\") - 1);

//讀取路徑給Step2
Session["xlsFullName"] = xlsFullName;
Session["FileName"] = FileName;
//Session()
//HDR=Yes 代表 EXCEL 第一列為欄位名稱 IMEX=1 為將混合型態的資料一律以文字型態顯示
// string OleConStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + xlsFullName + "; Extended Properties= \"Excel 8.0;HDR=NO \" ";
string OleConStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + xlsFullName + ";Extended Properties='Excel 8.0;HDR=NO;'";
//string OleConStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + xlsFullName + ";Extended Properties=Excel 8.0;";
DataSet ds = new DataSet();
OleDbConnection OleCn = new OleDbConnection(OleConStr);
string strSQL = @"SELECT * FROM [Sheet1$]";
try
{
OleCn.Open();
OleDbDataAdapter oledbda = new OleDbDataAdapter(strSQL, OleCn);
oledbda.Fill(ds, "NewExcel");
//Table給新欄名
ds.Tables["NewExcel"].Columns[0].ColumnName = "C1";
ds.Tables["NewExcel"].Columns[1].ColumnName = "C2";
ds.Tables["NewExcel"].Columns[2].ColumnName = "C3";
ds.Tables["NewExcel"].Columns[3].ColumnName = "C4";
ds.Tables["NewExcel"].Columns[4].ColumnName = "C5";
ds.Tables["NewExcel"].Columns[5].ColumnName = "C6";
ds.Tables["NewExcel"].Columns[6].ColumnName = "C7";
ds.Tables["NewExcel"].Columns[7].ColumnName = "C8";

GridView1.DataSource = ds.Tables["NewExcel"];
GridView1.DataBind();
}
catch
{
String scriptString = @"

";
this.RegisterStartupScript("s", scriptString);
return;
}
}
}

其他參考資料:
 1. HOW TO:使用 ADO.NET 擷取與修改利用 Visual Basic .NET 之 Excel 活頁簿中的記錄
http://support.microsoft.com/kb/316934/zh-tw
2.ExcelADO 示範使用 ADO 在 Excel 活頁簿讀取和寫入資料的方法
http://support.microsoft.com/kb/278973/ZH-TW/
參考ExcelADO.exe檔
問題:
時機:使用者可能回自行要連接資料庫,但是ConnectionString太複雜不好撰寫
方法:事實上微軟已經把這個對話盒包裝起來,
包含:
1.建立ConnectionString
2.開啟*.udl檔案,讀入ConnectionString
3.寫入*.udl檔案,用已知的ConnectionString,幫你產生*.udl檔案

答案:
實做
1. 先加入參考->COM
C:\Program Files\Common Files\System\OLE DB\oledb32.dll

說明:這個檔案oledb32.dll,就是幫我們操作ConnectionString的物件,事實上早已存在(舊的OleDB物件),並不是.NET物件,之後VS.NET會幫我們產生一個For.NET的檔案,這是用來呼叫oledb32的.NET DLL檔


2. 再加入參考->.NET
adodb (C:\Program Files\Microsoft.NET\Primary Interop Assemblies\adodb.dll)
說明:因為oledb32是要利用ADO Object(不能利用ADO.net)來承接所產生出來的ConnectionString,所以我們必須要建立ADO物件
程式:
///
/// 啟動ConnectionString對話盒
///

/// 預設的ConnectionString
/// 回傳ConnectionString
public string OpenConnectionStringDialog(string vDefaultConnectionString)
{
MSDASC.DataLinksClass DataLinkObj = new MSDASC.DataLinksClass();
ADODB.ConnectionClass ConnObj = new ADODB.ConnectionClass();
ConnObj.ConnectionString = vDefaultConnectionString;
object TempConnObj = (object)ConnObj;
DataLinkObj.PromptEdit(ref TempConnObj);
return ConnObj.ConnectionString;
}

3. 說明:會傳入一個預設的ConnectionString可預帶之前的設定
備註:發布時一定要把oledb32.dll和Interop.MSDASC.dll一起發布給Client端

動態畫2D圖

Imports System.Drawing
Imports System.Drawing.Imaging
Imports System.Drawing.Drawing2D
Imports System.Drawing.Text
Imports System.Data.SqlClient
Imports System.Web.Configuration

Partial Class _Default

Inherits System.Web.UI.Page
Private _Width As Integer = 600
Private _Height As Integer = 600

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

Dim BitmapImage As New Bitmap(_Width, _Height, PixelFormat.Format32bppArgb)
Dim Canvas As Graphics = Graphics.FromImage(BitmapImage)
' 好了,現在我們取得 Graphics,在這張畫布畫圖,相當於畫在 Bitmap 上
' 填入漸層藍色當背景
Dim ClientArea As New Rectangle(New Point(0, 0), New Size(_Width, _Height))
Dim BlueGradientBrush As New LinearGradientBrush(New Point(0, 0), _
New Point(0, _Height), Color.White, Color.White)
Canvas.FillRectangle(BlueGradientBrush, ClientArea)
' 畫出邊框
Dim BluePen As New Pen(Color.Black, 2)
Canvas.DrawRectangle(BluePen, ClientArea)
Graphics_Loop(Canvas, "888888888888888", 5, 10, 100, 20)
Graphics_Loop(Canvas, "99999", 5, 35, 100, 20)

' 以標楷體 18 點斜體字樣秀出文字
'Dim SF As New StringFormat(StringFormatFlags.NoWrap Or _
' StringFormatFlags.NoFontFallback)
'SF.LineAlignment = StringAlignment.Near
'SF.Alignment = StringAlignment.Center
'Dim F As Font = New Font("標楷體", 18, FontStyle.Italic)
'ClientArea.Offset(0, 4)
'Canvas.DrawString(ContentString, F, Brushes.Black, _
' CType(ClientArea, RectangleF), SF)
'ClientArea.Offset(0, -4)

' 再裝飾一段底線文字
'Canvas.FillRectangle(Brushes.Black, 0, 30, _Width, 10)
'SF.LineAlignment = StringAlignment.Far
'SF.Alignment = StringAlignment.Center
'F = New Font("Arial", 8, FontStyle.Italic)
'Canvas.DrawString("Anti-phishing with Sign-in Seal", F, _
' Brushes.White, CType(ClientArea, RectangleF), SF)

' 輸出圖片到 Client 端
Response.Clear()
Response.ContentType = "image/jpeg"
BitmapImage.Save(Response.OutputStream, ImageFormat.Jpeg)
Response.End()
End Sub

Function Graphics_Loop(ByVal Canvas As Graphics, ByVal Txt As String, ByVal xv As Integer, ByVal yv As Integer, ByVal wv As Integer, ByVal hv As Integer)
Dim ClientArea As New Rectangle(New Point(xv, yv), New Size(wv, hv))
Dim BluePen As New Pen(Color.Black, 1)
Canvas.DrawRectangle(BluePen, ClientArea)
Dim SF As New StringFormat(StringFormatFlags.NoWrap Or _
StringFormatFlags.NoFontFallback)
SF.LineAlignment = StringAlignment.Near
SF.Alignment = StringAlignment.Center
Dim F As Font = New Font("標楷體", 12, FontStyle.Bold)
ClientArea.Offset(0, 4)
Canvas.DrawString(txt, F, Brushes.Black, _
CType(ClientArea, RectangleF), SF)
ClientArea.Offset(0, -4)
End Function
End Class