2010年12月21日 星期二

2010年12月20日 星期一

Asp.net iframe 隱藏後Loading失敗

在firefox上
某些隱藏位置loading會造成停止
導致功能不全

就像我的iframe設定隱藏
按下某個按鈕才會顯示
但是就會造成loading一半就停止
功能掛掉在那

所以用jquery的功能
讓她重新load一次
就好了!!!

$("#iframeSrc").attr("src","http://localhost/test.htm");

ASP.NET Chart Webconfig

在本機端測試資料時 Chart都是正常值
但是移到Server端卻有錯
出現了
Invalid temp directory in chart handler configuration [c:\TempImageFiles\].
然後發現

<appSettings>
<add key="ChartImageHandler" value="storage=file;timeout=20;dir=c:\TempImageFiles\;" />
</appSettings>

要多加入一行

<appSettings>
<add key="ChartImageHandler" value="storage=file;timeout=20;dir=c:\TempImageFiles\;" />
<add key="ChartImageHandler" value="storage=file;timeout=20;" />
</appSettings>

這樣就可以跑了
真囉哩叭唆的問題一大堆

2010年11月25日 星期四

T-SQL Chinese_Taiwan_Stroke_CI_AS

剛剛發生這個錯誤
Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Chinese_Taiwan_Stroke_CI_AS" in the equal to operation.

找了一下
說要再等於雙方加入這個 就行了
collate Chinese_Taiwan_Stroke_CI_AS


--[PersonID] = [ID] --舊的方式 改成下面這個
[PersonID] collate Chinese_Taiwan_Stroke_CI_AS = [ID] collate Chinese_Taiwan_Stroke_CI_AS

C# ?? 問號 用法

是用來判斷是否為Null 如果是Null 回傳 ?? 後方的值
如果不是Null 回傳?? 前方的值


int x = null;
int y = x ?? -1;

2010年11月21日 星期日

T-Sql Pivot 樞紐

跳來跳去的 XDDD
換成T-SQL的方法啦


Select * from
(
SELECT CONVERT(DATE,[Main].[Date]) as xxx,COUNT([ProjectNo]) as ZZZ,[ProjectNo] ,COUNT(*) AS Cnt
FROM [Main]
group by CONVERT(DATE,[Main].[Date]) ,[ProjectNo]
) as S
PIVOT
(
SUM(Cnt)
FOR [ProjectNo] IN
([1],[3],[5],[7],[9])
) AS PivotTable


雖然能跑
但是出來GROUPBY 有錯
群組有錯
導致現在嚴重卡點...
他的值是對的
但不是我要的
所以先紀錄一下 = =+

C# Linq Pivot 樞紐

由於要做分析
所以有用到這東西
所以紀錄一下
Linq 用法


var LinqDataSource = from a in Linq.Mains
group a by a.date.Date into b
orderby b.Key
select new
{
Date = b.Key,
Total = b.Count(),
Project1 = b.Where(x => x.ProjectNo == 1).Count(),
Project3 = b.Where(x => x.ProjectNo == 3).Count(),
Project5 = b.Where(x => x.ProjectNo == 5).Count(),
Project7 = b.Where(x => x.ProjectNo == 7).Count(),
Project9 = b.Where(x => x.ProjectNo == 9).Count(),
};


不過麻煩的是
要先知道他欄位
但是像我想要直接用CODE抓欄位的就........
還在找動態方式...
先紀錄一下!!!

2010年11月18日 星期四

C# Chart 資料無值顯示零

一串資訊進來
每天日期不同
但是有幾天是跳過的
則要帶0進去

要用
下列方式

protected void Chart1_DataBound(object sender, EventArgs e)
{
Chart1.DataManipulator.InsertEmptyPoints(1, IntervalType.Days, "Series1");
}


這樣畫出來的曲線圖才會有0值 不然都會直接從A直接連到B點
資訊就會錯誤了

2010年11月3日 星期三

T-SQL Performance DeadLock 偵測+語法

自己參考各方文件寫的偵測
可以抓造成死結的源頭+語法

IF EXISTS(SELECT * FROM master.sys.sysprocesses WHERE spid
IN (SELECT blocked FROM master.sys.sysprocesses))
BEGIN
DECLARE @SPID binary(20),@Handle binary(20), @retVal varchar(8000)
SELECT @SPID =SPID FROM sysprocesses WHERE blocked = 0 AND SPID IN (SELECT DISTINCT blocked FROM sysprocesses)
SELECT @Handle = sql_handle
FROM master..sysprocesses
WHERE SPID = @SPID
SELECT @retVal = convert(varchar(8000), [text])
FROM ::fn_get_sql(@Handle)

SELECT SPID,status 'Status','UserPcName'=SUBSTRING(hostname,1,12),'LogInID'=SUBSTRING(SUSER_SNAME(sid),1,30),'IsLock'=CONVERT(char(3),blocked),
'DBName' = SUBSTRING(DB_NAME(dbid),1,20),cmd 'cmd',waittype 'waittype', Program = program_name, LastCommand = @retVal
FROM sysprocesses
WHERE blocked = 0
AND SPID IN (SELECT DISTINCT blocked FROM sysprocesses)
END
ELSE
SELECT 'Processes No Lock'

2010年11月2日 星期二

XP 拖曳 不同槽 剪下貼上

XP
拖曳不同槽時侯 會執行複製狀態 不會剪下貼上
拖曳相同槽時候 會執行搬移狀態 不會複製

所以
拖曳不同槽 要剪下貼上 按住SHIFT +拖曳
要拖曳同槽 要複製 按住CTRL +拖曳

EXCEL 符合*字串的數量

有用到某區間內符合某個字串的數量有幾筆
所以找了一下
發現了這個用法
還不錯


=COUNTIF(P152:P201,"*")

這用法 是 P152~P201內有字串的都算一筆

" " 內就是你要用的字串

Dotfuscator Datatable Column ReName

最近再把Form模糊化
使用了VS提供的Dotfuscator來使用
結果發現
我DataTable的欄位名稱被改名了
結果導致我有定位名稱的資訊全部死掉 @_@
EX:Linq 的 dataTable.Field("Name")
Exclude也不行
目前無法排除中
正在找方法
先提出來
找到方法在PO上來

真是麻煩的東西阿 ~_~

2010年10月27日 星期三

C# throw 用法

用於自訂錯誤上
就是如果遇到自訂問題
會中斷程式而跑出自己定義的錯誤
所以大致上都會搭配Try Catch使用

string message = string.Format("connection timeout");
throw new TimeoutException(message);


然後try Catch 就如這樣用

try
{
connn();
}
catch (TimeoutException ex)
{
MessageBox.Show(ex.ToString());
}

2010年10月22日 星期五

C# errorProvider

用來提示錯誤用
主要寫法

if (textBox1.Text == "")
errorProvider1.SetError(textBox1, "No Data!!");
else
errorProvider1.SetError(textBox1, "");


可提示textBox1錯誤部份

2010年10月21日 星期四

C# Form 開啟 新的Form

Form 開新的Form


private Form2 form2 = new Form2(); //外面全域變數


try //開啟地方
{
form2.Show();
}
catch
{
form2 = new Form2();
form2.Show();
}

這樣寫 如果Form2被關掉也可以繼續打開
如果有打開 不會再打開第二次

2010年10月20日 星期三

C# TabControl 不能改變 Tab

加入這個Selecting觸發 就行了

private void tabControl1_Selecting(object sender, TabControlCancelEventArgs e)
{
e.Cancel = true;
}

C# Excel 數字字串被轉成數字

因為產生EXCEL後
數字字串會很貼心的自己轉成數字型態
我前面的000都不見了!!!!!!!!!!!!

所以
在字串前面多了一個 ==> '
這樣就行了 XDDD

C# VS2010 Excel.ApplicationClass() 錯誤

在VS2010部分
Excel.ApplicationClass() 編譯會錯誤
因為已經改成宣告
Excel.Application()
這樣就行了

想說 奇怪 同程式怎不能跑
XDDD

2010年10月19日 星期二

C# Linq to Sql 寫T-Sql語法

雖然Linq很強大
但是有些特殊部份無法使用 T_T
所以還是要回歸到最基礎的SQL語法來寫
以下就是寫法

using (LinqDataContext db = new LinqDataContext(Context))
{
db.Log = Console.Out;
var q = db.ExecuteQuery <Class>(@"EXEC synonyms N'select * from [user]'"); //雙引號內為T-SQL語法
}


像我語法內主要是用在Synonyms用在Linked Servers上
因為查了一下 找不到怎樣在Linq上做Linked Server的查詢法
又在不能增加Stored Procedures的狀況下
所以就只好直接用T-Sql語法直接硬上!!! XDDD

2010年10月17日 星期日

C# Linq Stored Procedures uniqueidentifier output

當Stored Procedures有時候會可以不需要輸入值
會自己產生
但又有欄位時候 宣告成uniqueidentifier output 型態
這時候Linq 呼叫要怎樣解決勒!!!!


System.Guid? id = System.Guid.Empty;
Linq.Insert("test", "123456", ref id);

他的型態是System.Guid? 所以宣告一個空值給他
然後 給值時候需多加上ref型態 這樣就可以搞定囉!!!!

2010年10月11日 星期一

Linq 使用多執行緒 Parallel

剛剛發現Linq有支援Parallel
看了就很HIGH的想要用看看
結果!!!
不適用在SQL上 叭叭 XDDDD

但是本機端的就可以拿來用

還有一個重點是
Parallel後存入Array後 順序會大亂
因為做完就存入的關係
所以 這部份要注意!!!

如果要排列整齊
請用

int[] data = new int[] { 0, 1, 2, 3 };
int[] data2 = (from x in data.AsParallel(QueryOptions.PreserveOrdering)
select x * 2).ToArray();

這樣會排列過後
但是Loading會變重
所以就自己取捨怎樣做才是正確的囉!!!!

參考網站

硬體 接雙螢幕 單台螢幕會閃爍

最近敗了兩台螢幕
結果發現
接了兩個DVI以後 單邊的螢幕就會閃爍
大概猜到顯卡不夠力
但是
經過幾百種情況測試時
發現
單邊接DSUB線就不會有問題了!!
雖然我顯卡是雙DVI出口
但就是一邊全DVI 一邊DVI轉DSUB
這樣就行了
後來感覺是線的訊號不夠強
借了一台粗粗的貴貴的DVI線試看看!!!
竟然正常了!!!
所以應該就是顯卡推不動雙DVI訊號線
導致單邊訊號有點微弱造成的情況
結論就是
如果要推HD 1920*1080...
就乖乖去再敗一條"貴商商"的訊號線吧

2010年10月7日 星期四

C# dataGridView Update觸發

因為觸發元件太多 紀錄一下
用dataGridView1_CellEndEdit去觸發

C# local Database

可以架隨機版的DB在Form上
這樣就不用另外開SQL架DB
剛剛在測試時候
發現一直更新不起來
就覺得怪怪的
後來發現....
原來........
是設定DB時候在初始Project資料夾位置
但是執行會複製進去DeBug裡面
所以勒
他就一直把沒更新的一直蓋 一直蓋
蓋到天荒地老
導致完全沒有辦法更新
= =+
被騙了

其他功能跟一般DB指令一樣

2010年10月4日 星期一

T-SQL With

因為接觸 T-SQL不久
所以有些用法不太認識
所以紀錄一下簡單的東西

With 用法在做一個虛擬TABLE
但是這個虛擬TABLE只能被使用一次就消失了

大概用法是

With TableName(ColumnName) as (Select XXX From OOO)

2010年10月3日 星期日

T-SQL xp_cmdshell

因為xp_cmdshell
如它名稱說的
可以用cmd語法去執行
這就很恐怖了
所以預設是關閉的
但是有時候要用到
就先把它打開囉

開啟

exec sp_configure 'show adv',1
reconfigure
exec sp_configure 'xp_cmdshell',1
reconfigure


關閉

exec sp_configure 'show adv',1
reconfigure
exec sp_configure 'xp_cmdshell',0
reconfigure


請小心服用+做好權限管理!!!!

2010年9月29日 星期三

SQL PK重註

由於PK用太久
會導致資訊越來越分散
也會影響SQL速度
所以MS有分享了一個方式可以讓人檢查
也可以重註PK方式

檢查方式

SELECT a.index_id, name, avg_fragmentation_in_percent, *
FROM sys.dm_db_index_physical_stats (DB_ID(), OBJECT_ID('MG_Strategic_Plan_MeasureGroup_default_partition'),
NULL, NULL, NULL) AS a
JOIN sys.indexes AS b ON a.object_id = b.object_id AND a.index_id = b.index_id

在MS提供文件說 avg_fragmentation_in_percent 不能超過30
超過表示太分散囉
要重註

重註語法

ALTER INDEX [PK_TableName]
ON dbo.[TableName]
REBUILD WITH (ONLINE = ON);


我是這樣弄的
再重新檢查一次
發現降下來或是變成0了
成功 ^_^

參考網站

2010年9月27日 星期一

TSQL INPUTBUFFER

暫記一下
列出目前執行的狀態


select * from sys.sysprocesses
dbcc INPUTBUFFER (17) --17是編號

2010年9月22日 星期三

C# UserControl Event 觸發

因為當然大家的UserControl的功能不可能全寫死
例如每次都會被用到才寫進去
不常用就留觸發出來就好了
所以就要寫觸發與新增功能來

這樣說會不會很模糊 XDDDD
例如Button 原本UserControl內的功能是A
但拉到form後又想新增Button按下去有B功能
就要這樣寫


public event EventHandler MyEvent; //這是外層宣告
protected void button1_Click(object sender, EventArgs e) //記得將private改成protected
{
MyEvent(sender, e); //觸發的新增功能
}

C# UserControl

原來UserControl要另外寫專案來包 >_<"

開一個WindowsFormsControlLib的專案
然後就可以建立UserControl了
然後執行後
產生的DLL檔
拉到元件列裡面
就可以拿出來使用囉
而要做對外的觸角 (給值與取值的地方)
就寫

public string TextValue
{
get { return this.textBox1.Text; }
set { this.textBox1.Text=value; }
}


一直以為可以直接做 = =+
原來是我誤會了 囧

2010年9月17日 星期五

C# Windows AP 被綁畫面!!!! DoEvents()

因為很多時候
執行AP的某些動作 其實AP畫面不會馬上SHOW
會等全部做完以後才顯示出來!
這時候就要用到


Application.DoEvents();


藥到病除!! XDDD

2010年9月14日 星期二

Linq To Entity Framework (Store Proceduce篇)

再看完前兩篇文章
就會想說
那 Entity Framework勒
應該也可以呼叫Store Proceduce吧
對囉
當然可以
只是
麻煩了一個步驟 XD

首先一樣先引入Store Proceduce進來
然後勒
要在他的地方點右鍵 選 Add Function Import
這樣他才能被呼叫出來
然後設定輸出要啥類型的 之類的東西
就可以正常呼叫囉

entity1.GetUserLevel("", "");

Linq To Sql 呼叫 Store Procedure

那天就在研究Store Procedure的東西
發現Linq To Sql 可以直接拉進來用欸
太優了 >/////<

方法一樣
開啟Linq To Sql後
將Store Procedure拉進來
一放
就可以呼叫囉 A_A

var data2 = from a in linq.SelectItemLevel(934) //SelectItemLevel是procedure 934是值
select a;

C# Linq To Entity Framework

最近因為Linq To Sql 要倒了
所以在找 Linq To Entity Framework的方法
結果 哈哈哈 差不多東西阿 換湯不換藥
使用起來還是很簡單的說 XD

只是一開始是做Linq To Sql 變成做Entity Data Model
呼叫方式變成

LinqDataContext linqDB = new LinqDataContext();
Entities1 entity1 = new Entities1();

接下來就都一樣囉 >_^

2010年9月9日 星期四

C# Textbox 浮水印 WaterMark

再應用程式內的浮水印
利用參考網站大大分享的CODE所弄的

要進去改Designer的元件

//this.textBox1 = new System.Windows.Forms.TextBox(); //這個改成下面那個
this.textBox1 = new wmgCMS.WaterMarkTextBox(); //改成這個
//---------元件設定部份
this.textBox1 .WaterMarkColor = System.Drawing.Color.Gray;
this.textBox1 .WaterMarkText = "浮水印要顯示的字";
//---------最下面
//private System.Windows.Forms.TextBox textBox1; //這個改成下面那個
private wmgCMS.WaterMarkTextBox textBox1; //改成這個



參考網站

C# 選擇資料夾,選擇檔案

選擇資料夾

FolderBrowserDialog path = new FolderBrowserDialog();
path.ShowDialog();
textBox1.Text = path.SelectedPath;


選擇檔案

OpenFileDialog file = new OpenFileDialog();
file.ShowDialog();
textBox1.Text = file.SafeFileName;

2010年9月8日 星期三

C# 控制遠端電腦

就是用WMI來做壞事 阿 不是啦 做控制
就是利用WMI可以做遠端電腦的控制
如 關機..重開..一些資訊擷取等

關機 重開

ConnectionOptions options = new ConnectionOptions();
options.Username = "Username"; // 使用者名稱
options.Password = "Password"; // 使用者密碼
options.Authentication = AuthenticationLevel.Default; // 認證模式設定 (採用預設)
options.Impersonation = ImpersonationLevel.Impersonate; // 設定 COM 模擬等級
options.EnablePrivileges = true; // 參考 **(特一)
try
{

ManagementScope MS_Conn = new ManagementScope("\\\\" + "IP" + "\\root\\cimv2", options);
MS_Conn.Connect();


ObjectQuery oq = new ObjectQuery("SELECT * FROM Win32_OperatingSystem");


ManagementObjectSearcher mos1 = new ManagementObjectSearcher(MS_Conn, oq);

ManagementObjectCollection moc1 = mos1.Get();


foreach (ManagementObject mo in moc1)
{

mo.InvokeMethod("Reboot", null);
}
}
catch (Exception err1)
{
textBox1.Text= err1.Message;
} 



參考網站1 參考網站2

2010年9月7日 星期二

C# 檔案,資料夾 Move Copy Del Insert

檔案複製

string sourcePath = @"C:\Users\Public\TestFolder";
string targetPath = @"C:\Users\Public\TestFolder\SubDir";
System.IO.File.Copy(sourceFile, destFile, true);


檔案搬移

System.IO.File.Move(sourceFile, destinationFile);


檔案刪除

if(System.IO.File.Exists(@"C:\Users\Public\DeleteTest\test.txt"))
{
// Use a try block to catch IOExceptions, to
// handle the case of the file already being
// opened by another process.
try
{
System.IO.File.Delete(@"C:\Users\Public\DeleteTest\test.txt");
}
catch (System.IO.IOException e)
{
Console.WriteLine(e.Message);
return;
}
}


建立資料夾

if (!System.IO.Directory.Exists(targetPath))
{
System.IO.Directory.CreateDirectory(targetPath);
}



複製資料夾

if (System.IO.Directory.Exists(sourcePath))
{
string[] files = System.IO.Directory.GetFiles(sourcePath);

// Copy the files and overwrite destination files if they already exist.
foreach (string s in files)
{
// Use static Path methods to extract only the file name from the path.
fileName = System.IO.Path.GetFileName(s);
destFile = System.IO.Path.Combine(targetPath, fileName);
System.IO.File.Copy(s, destFile, true);
}
}
else
{
Console.WriteLine("Source path does not exist!");
}


搬移資料夾

System.IO.Directory.Move(@"C:\Users\Public\public\test\", @"C:\Users\Public\private");


刪除資料夾

if(System.IO.Directory.Exists(@"C:\Users\Public\DeleteTest"))
{
try
{
System.IO.Directory.Delete(@"C:\Users\Public\DeleteTest", true);
}

catch (System.IO.IOException e)
{
Console.WriteLine(e.Message);
}
}


參考網站

2010年9月5日 星期日

C# textbox 驗證

可以用keyPress做驗證
這樣在KEY入就檢查各個單字是否可輸入

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
int ascii = Convert.ToInt16(e.KeyChar);
if ((ascii >= 97 && ascii <= 122) || (ascii == 8))
{
e.Handled = false;
}
else
{
e.Handled = true;
}
}

或是用Validating來做驗證

private void textBox1_Validating(object sender, CancelEventArgs e)
{
try
{
int numberEntered = int.Parse(textBox1.Text);
if (numberEntered < 1 || numberEntered > 10)
{
e.Cancel = true;
MessageBox.Show("You have to enter a number between 1 and 10");
}
}
catch (FormatException)
{
e.Cancel = true;
MessageBox.Show("You need to enter an integer");
}
}

第一個是一輸入的時候就檢查
第二個是整個輸入結束執行時檢查

2010年9月2日 星期四

C# DataTable TO DataGridView Image 問題

最近試了DataGridView要Show圖
可是怎都怎錯
後來發現...
原來我DataTable沒設屬性
所以才會不能顯示

DataTable1.Columns.Add("ImageValue", typeof(Image));
Image OnlineImage = Image.FromFile("online.png");
DataTable1.Rows[i]["ImageValue"] = OnlineImage;
dataGridView1.DataSource = DataTable1;

2010年8月30日 星期一

T-SQL 清除SQL 記憶體

網路上看到 暫記一下

DBCC FREESYSTEMCACHE ('ALL');
DBCC FREESESSIONCACHE;
DBCC FREEPROCCACHE;


連結網站

T-SQL 用TSQL查詢CPU 重的SQL語法

這可以用來查詢
常常耗費CPU的SQL語法
雖然沒有Profiler那麼多資訊
但可以不需多開Profiler耗費資源
也可以找出耗費CPU的語法加以優化


USE AdventureWorks2008R2; --改成自己的DB
GO
SELECT TOP 5 query_stats.query_hash AS "Query Hash",
SUM(query_stats.total_worker_time) / SUM(query_stats.execution_count) AS "Avg CPU Time",
MIN(query_stats.statement_text) AS "Statement Text"
FROM
(SELECT QS.*,
SUBSTRING(ST.text, (QS.statement_start_offset/2) + 1,
((CASE statement_end_offset
WHEN -1 THEN DATALENGTH(ST.text)
ELSE QS.statement_end_offset END
- QS.statement_start_offset)/2) + 1) AS statement_text
FROM sys.dm_exec_query_stats AS QS
CROSS APPLY sys.dm_exec_sql_text(QS.sql_handle) as ST) as query_stats
GROUP BY query_stats.query_hash
ORDER BY 2 DESC;
GO



參考網站

2010年8月26日 星期四

C# 目前執行檔所在資料表路徑

抓目前所在資料表路徑

Application.StartupPath //是string

C# 讀ini檔

剛剛看到一個人家寫好的.CS
測試可以用
暫記一下


IniFile ini = new IniFile(Application.StartupPath + "\\TestFile.ini");
textBox1.Text = ini.IniReadValue("Section1", "key1"); //讀檔
ini.IniWriteValue("123", "1234", "12345"); //存入


An INI file handling class using C#

2010年8月25日 星期三

ASP.NET DropDownList 顯示不存在的選項

應該有人跟我一樣
用DropDownList去做選擇功能
更新也是用這種套用進去

但是我是用DataSource去讀資料Show於DropDownList上
當然會過濾些不該存在的筆數
例如: 離職人員之類的
但是當離職人員離開後 你去更新他之前做過的單子時
DropDownList就會讀不到這筆資訊
可是你又不能可能因為要更新NOTE導致連處理人員都要改
所以就要把這筆單子本身處理人員加入


ListItem delList = new ListItem("離職人員", "員工編號");
DropDownList1.Items.Add(delList);
DropDownList1.SelectedIndex = DropDownList1.Items.IndexOf(DropDownList1.Items.FindByValue("員工編號"));


這樣下拉選單就又有他存在也會選擇到他
就不會有被強制更改問題

PS...由於DropDownList在DataBinding 時候會自動清空裡面的Item
所以有某些狀況須將AppendDataBoundItems="true" 加入 才不至於加入後又被清空狀況
但也表示以後他不會自動清空 所以以後要多個清空動作才不會一直累加值進去

2010年8月24日 星期二

SQL 刪除TABLE資料

紀錄一下

TRUNCATE TABLE "表格名"

可以將TABLE內資料殺光光外
還有自動產生編號會歸零
但是如果有被設定FK表格不能殺
所以要先將FK線拿掉後再殺再建

2010年8月23日 星期一

ASP.NET DropDownList Selected值找不到錯誤

很多人應該跟我一樣
會將值直接帶進DropDownList內SHOW出來
但是如果直接將值帶入
DropDownList1.SelectedValue = "2";
如果裡面沒有2的值
會有找不到值的窘境
而發生錯誤
所以以下是改良版!!!

DropDownList1.SelectedIndex = DropDownList1.Items.IndexOf(DropDownList1.Items.FindByValue("2"));

這樣就算找不到 也不會發生錯誤囉

2010年8月18日 星期三

SQL 使用者查詢

在T-SQL內可以查詢使用者資訊
暫記

use [資料庫名稱]
exec sp_helpuser

use [資料庫名稱]
exec sp_helprolemember 'db_owner'

use [資料庫名稱]
select * from sys.sql_logins

use master
EXEC sp_helpuser

use master
exec sp_helprolemember 'db_owner'

use master
select * from sys.sql_logins

2010年8月15日 星期日

Jquery slideToggle滑動式顯示

滑動式顯示方式


$("button").click(function () {
$("p").slideToggle("slow");
});



網頁連結

另一種的

$("#divTest").click(function () {
if ($("#divShowTest").is(":hidden")) {
$("#divShowTest").show("slow");
} else {
$("#divShowTest").slideUp();
}
});


網頁連結

2010年8月2日 星期一

Linq LinqDataSource 改成自己語法

有時候裡面的搜尋並不是自己想要的
所以就想要有沒有辦法改
就找到官網有這方法 紀錄一下


protected void LinqDataSource_Selecting(object sender, LinqDataSourceSelectEventArgs e)
{
var cities = from city in citiesArray
where city.CompareTo("B") > 0
select city;
e.Result = cities;
// Or we could set e.Result = citiesArray to return all rows.
}



連結官網

2010年7月27日 星期二

Jquery 抓滑鼠座標值

直接看CODE

$(document).mousemove(function (e) {
sx = e.pageX + document.documentElement.scrollTop;
sy = e.pageY + document.documentElement.scrollLeft;
});

e.pageX ,e.pageY是頁面內的X,Y值
document.documentElement.scrollTop 是下拉捲軸後 Top值
document.documentElement.scrollLeft 是下拉捲軸後 Left值
這樣才能讓在下拉捲軸產生後 確保座標值無誤狀態

Jquery 抓Gridview內的值

因為GridView會轉成一張Table所以用這方法抓值

$("td:nth-child(1)", this)[0].innerHTML


1代表第一欄位
可以改成你所需要欄位

測網路順暢度

打開CMD
輸入 tracert 127.0.0.1
會跑你對這IP連線的狀態
可以看出順不順暢

PS..127.0.0.1是本機IP..

2010年7月22日 星期四

ASP.NET Validator 做單一元件判斷

紀錄一下...
原來Validator跟Button都有Group
哈哈 一直沒注意到
有設定Group就不會亂判斷了!!!
ValidatorGroup

2010年7月21日 星期三

ASP.NET 執行前跳出確認視窗

有很多時候 要在刪除 或是 執行前要先跳個確認按鈕
按下確認才能執行動作

可以這樣做

OnClientClick="return confirm("是否確定要刪除?");"


就會跳出是否確定的執行框了

Linq Insert SQL 指令篇

之前有用到
但打算拿掉了 XDD
先記錄下來


LinqClassesDataContext linqdc = new LinqDataClassesDataContext();
Order ord = new Order
{
No = ComputeNo(),
PersonID = PersonID,
ProjectNo = ProjectNo,
Reason = Reason,
Date = DateTime.Today
};
linqdc.GetTable<Order>().InsertOnSubmit(ord);
linqdc.SubmitChanges();


[Table(Name = "dbo.OrderMain")]
public class Order //新增
{
[Column(IsPrimaryKey = true)]
public string OrderNo { get; set; }
[Column]
public string PersonID { get; set; }
[Column]
public int ProjectNo { get; set; }
[Column]
public string Reason { get; set; }
[Column]
public DateTime Date { get; set; }
}


對了 前面記得加上
using System.Data.Linq;
using System.Data.Linq.Mapping;

如果是自己產生的欄位加入IsDbGenerated=true

C# GridView DataKeyNames 丟值與取值

GridView有提供一個專門在放不用顯示的欄位
也就是DataKeyNames 它可以存多了欄位
這樣像是一些Index值都可以放到這裡面來不用在欄位上顯示
所以就來講怎樣將值丟到裡面吧

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" onrowcommand="GridView1_RowCommand"
DataKeyNames="index">

然而DataKeyNames="index"可以放多個欄位只要用,分隔就行了
也就是DataKeyNames="index1,index2,index3" 這樣

取值勒
用以下方法可以讀出來

GridView1.DataKeys[Convert.ToInt32(e.CommandArgument)].Values[0] //第一筆
GridView1.DataKeys[Convert.ToInt32(e.CommandArgument)].Values[1] //第二筆
GridView1.DataKeys[Convert.ToInt32(e.CommandArgument)].Values[2] //第三筆

2010年7月20日 星期二

Jquery 不同步更新後 droppable 在IE上有錯誤問題

當Jquery 不同步更新某段後 重新更新draggable的值後droppable發生了問題!!!
htmlfile: Unspecified error.
死在這段var box = elem.getBoundingClientRect(),
因為他當不同步更新後,抓座標值會發生錯誤
所以經過了各方查詢資料後...
結論就是要改Jquery內碼
把var box = elem.getBoundingClientRect(),
改成
var box = null; try { box = elem.getBoundingClientRect(); } catch(e) { box = { top : elem.offsetTop, left : elem.offsetLeft } ; }

喔 原本的CODE是多個變數宣告
所以記得 刪了他後 還要還給他var喔

終於可以用了 @_@
參考網站:參考網站

2010年7月19日 星期一

ASP.NET Updatepanel 不同步更新問題

昨天下午遇到一個問題...
一個頁面內有兩個Updatepanel
結果我更新B Updatepanel時候
A也白目的跟著更新
導致我彈跳的視窗被關掉!!!!!

初期就是不知道A 也跟著更新
就亂找亂找...
找到今天早上....
才確認 A也跟著更新 = =+
暈....

解決辦法
請將Updatepanel的設定UpdateMode改成"Conditional"
不要用Always...
不然的話
它只要其中一個Updatepanel更新
其他就會跟著動........

2010年7月15日 星期四

CSS 標籤意義

陸續新增中
有使用到先紀錄

float: <==浮動可以靠左靠右
clear: <==可以解除浮動狀態
margin-top: <==上邊界
margin-right: <==右邊界值
margin-bottom: <==下邊界值
margin-left: <==左邊界值
height: <==高度
width: <==寬度

Linq 使用Split分割ROW

有了條件 我將值通通丟同個DB內的一個欄位內
結果我有設定 ^ 這個標誌分隔
然後現在想要讀出來!!!
嘿嘿
Linq可以直接使用Split功能

var main = from a in LinqDC.Mains.AsEnumerable()
from sp in a.Reason.Split('^')
select new { id = a.No, Reason = sp };


這樣就能將一個ROW的資訊變成多個ROW欄位了

Jquery datepicker Format

將datapicker 格式化

$("#f_btn111").datepicker({ dateFormat: 'yy-mm-dd' });


大致上跟習慣格式化格式差不多
"mm/dd/yy" mm/dd/yy
"yy-mm-dd" yy-mm-dd
"d M, y" d M, y
"d MM, y" d MM, y
"DD, d MM, yy" DD, d MM, yy
"'day' d 'of' MM 'in the year' yy" 'day' d 'of' MM 'in the year' yy

Linq Select 字串 合併

假設A表有ID 跟 NAME
B表有ID 跟 TEL
顯示表格要顯示
ID NAME TEL
但一個人可能有好幾支電話

因為不太想用Gridview的合併欄位方式去合併
但是表格Join後就會有重複的欄位
所以就用LINQ直接將TEL部分合併 A_A
這樣就可以一個欄位 通通搞定

看CODE吧

var test = from a in dctest.NameTable
join b in dctest.TelTable on a.id equals b.id into bbb
select new { id = a.id,name=a.name, tel = string.Join("\n", (from qq in bbb select qq.tel).ToArray()) };


合併了!!!

ASP.NET IE VS FireFox 第一回合

結論就是...用JS在抓textbox的值時候
火狐就莫名的多了好多個\n\n\t的鬼東西
導致我的網頁掛了

所以讓我更加仔細的在三確認值後才擷取 XDD
就醬

2010年7月14日 星期三

XP 開機 NumLock燈開啟

regedit > HKEY_USERS\.DEFAULT\Control Panel\Keyboard\

InitialKeyboardIndicators
0為關閉
2是開啟

XP 更換序號

regedit > HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\WPAEvents

OOBETimer 備份 改名 建個新的

執行 %systemroot%\system32\oobe\msoobe.exe /a

選打電話給客服 > 變更產品金鑰 >KEYIN!!!!!

Restart OS!!!

Jquery Tabs 更新後 會回到原本的頁面

如果沒有任何記錄情況下
Jquery的Tabs會回到最初的第1個頁面
但是很多情況是想要讓他保持在原本頁面的
這下子就要用到這招


var tabindex = 0;
function tabsfunction() {
$("#tabs").tabs({
select: function (event, ui) {
tabindex = ui.index;
}
});
$("#tabs").tabs('select', tabindex);
}

在JS最外層宣告個全域變數tabindex然後將每次點選後的index紀錄進去
這樣不管怎樣更新
它還是會乖乖的開啟你剛剛紀錄的tab了

2010年7月13日 星期二

Jquery Ajax UpdatePanel PostBack後 Jquery失效

因為想要更新小部份資料而已
所以就將要更新部份用UpdatePanel包起來
結果一更新!!!燈燈!!!!
Jquery全趴在地上動也不動...

結果發現原來PostBack後要重新讀取一次JS才行

結論就是
將不會動的Jquery寫成Function後
再讀取一次就行了

<script language="javascript" type="text/javascript">
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(tabsfunction);
</script>


謝謝觀賞

2010年7月11日 星期日

Linq 不同DB Join 表格

A_A
原來LinQ可以直接將不同DB表格Join起來
太優了

不囉唆 看CODE吧

var ErrorOrder =from a in Linq1.Mains.AsEnumerable()
join b in Linq2.Person.AsEnumerable() on a.ID equals b.ID
select new { ID = a.ID, name = b.Name };


Linq1~Linq2是不同DB的DataClasses只要在後面多加上AsEnumerable()
就可以達到合併功能
讚吧 >_^

2010年7月8日 星期四

JS Jquery textbox多個輸入框

遇到一個功能...有5個輸入框專寫意見的
如果輸入第一個 第二個才會開啟可輸入 第三個才會顯示出來
如果輸入第二個 第三個才會開啟可輸入 第四個才會顯示出來
以此類推
所以就寫了個Jquery的功能
讓前端來完成這件事情

因為我有寫MASTER所以會多了將ID傳至前端的方法變數 可以省略不看
直接打上你需要的ID給JQUERY就行了

$(function () {
var TextBoxAR1 = "#" + document.getElementById(GetClientId("TextBoxReason1")).id;
var TextBoxAR2 = "#" + document.getElementById(GetClientId("TextBoxReason2")).id;
var TextBoxAR3 = "#" + document.getElementById(GetClientId("TextBoxReason3")).id;
var TextBoxAR4 = "#" + document.getElementById(GetClientId("TextBoxReason4")).id;
var TextBoxAR5 = "#" + document.getElementById(GetClientId("TextBoxReason5")).id;

//1 TO 2
$(TextBoxAR1).keyup(function () {
if ($(TextBoxAR1).val() != "") {
$(TextBoxAR2).attr("disabled", "");
$("#Reason3").show();
}
else {
$(TextBoxAR2).attr("disabled", "disabled");
$("#Reason3").hide();
}
});
//2 TO 3
$(TextBoxAR2).keyup(function () {
if (($(TextBoxAR2).val() != "")) {
$(TextBoxAR3).attr("disabled", "");
$("#Reason4").show();
}
else {
$(TextBoxAR3).attr("disabled", "disabled");
$("#Reason4").hide();
}
});
//3 TO 4
$(TextBoxAR3).keyup(function () {
if (!($(TextBoxAR3).val() == "")) {
$(TextBoxAR4).attr("disabled", "");
$("#Reason5").show();
}
else {
$(TextBoxAR4).attr("disabled", "disabled");
$("#Reason5").hide();
}
});
//4 TO 5
$(TextBoxAR4).keyup(function () {
if (!($(TextBoxAR4).val() == "")) {
$(TextBoxAR5).attr("disabled", "");
}
else {
$(TextBoxAR5).attr("disabled", "disabled");
}
});

2010年7月1日 星期四

SQL SSMS2008 無法更新TABLE設計問題

有阿飄!!有阿飄!!! 別纏著我!!!

結果是死白目的SSMS2008有阿飄...
他有防止一些特殊的TABLE設計問題...
所以導致某些設計不能變更 (下指令可以)

解決方案
請至 SSMS2008的TOOLS > OPTIONS > DESIGNERS > 的
Prevent saving changes that require table re-creation
取消打勾就行了

阿飄終於走了 ㄟ(一 o 一 ㄟ)~~

SQL T-SQL 查詢連線人員

T-SQL 可以查詢連線人員有誰

查詢語法 sp_who

2010年6月29日 星期二

ASP.NET 動態MENU

最近發現了剛剛那文章的RUNATSERVER功能後
就發現UL的MENU就可以設定為動態的了
這樣做可以依照使用者權限不同
登入的MENU也就不同

前端的頁面

<ul id="menuulmaster">
<li><a href="main.aspx">主頁</a></li>
<li><a href="">瀏覽</a></li>
<li><a href="">修改</a></li>
<li runat="server" id="ulliset"><a href="">設定</a></li>
<li><a href="">登出</a></li>
</ul>

後端的頁面

if (Convert.ToInt32(Session["Level"]) == 1) //如果權限不足
{
ulliset.Visible = false; //關閉設定頁面
}


這樣就可以達到不顯示的功能
另外記得在頁面寫個判斷權限的設定
不然被知道網址後 還是有可能被直接用網址登入喔 XDDD

ASP.NET RunAt Server

原來元件給他runat="server"
後再給他 id="test"

就可以直接在.CS頁面編輯它了
test.Visible = false;
嗯....

2010年6月24日 星期四

SQL Profiler 分析(1)

上網查了一下資料
發現了這個TSQL的語法可以查Profiler的效能
所以貼上來


SELECT * into #Temp
FROM ::fn_trace_gettable('D:\CGW\SQL Profiler\testGameDB81_100603.trc', default) --檔案路徑及名稱

-- 追蹤所得的資料本來就在資料表內,直接透過T-SQL 分析
SELECT SUBSTRING(TextData, 1,330) AS '名稱',
COUNT(*) '數量',
AVG(Duration) AS '平均執行時間(ms)',
AVG(CPU) AS '平均CPU 時間(ms)',
AVG(Reads) AS '平均閱讀次數',
AVG(Writes) AS '平均寫入次數'
FROM #Temp
WHERE EventClass=12 -- 12 代表SQL:BatchCompleted 事件
GROUP BY SUBSTRING(TextData, 1,330)
ORDER BY SUM(Duration) DESC


出處:http://blog.xuite.net/tim0718/note/21899219

2010年6月16日 星期三

C# String 字元

驚!!!!
原來 C# string 可以直接讀字元
抱歉 剛剛才發現 XDDD


string words = "Hello World!";
textBox1.Text = words[0] ;


words[0] <==這可以直接讀出H字元出來!!! 現在才知道 囧

C# Ping

ping 這東西很常用
所以 C#當然也有支援囉
看CODE吧


try
{
Ping ping = new Ping();
PingReply pingreply = ping.Send("127.0.0.1");//IP Address
MessageBox.Show(pingreply.Status.ToString());
}
catch (Exception err)
{
MessageBox.Show(err.Message);
}

C# 抓Mac Address

在前人的CODE內發現的
是引用Windows內建的dll去抓Mac Address
還不錯
就貼上來


[DllImport("iphlpapi.dll", ExactSpelling = true)]
public static extern int SendARP(int DestIP, int SrcIP, byte[] MacAddr, ref uint PhyAddrLen);
static object[] GetRemoteMAC(IPAddress LocalIP, IPAddress RemoteIP) //抓Mac
{
byte[] MacAddr = new byte[6];
uint PhyAddrLen = (uint)MacAddr.Length;
string temp = "";
//LiveAndMAC[0]是否有回應 LiveAndMAC[1] MAC
object[] LiveAndMAC = new object[2];

int res = SendARP((int)RemoteIP.Address, (int)LocalIP.Address, MacAddr, ref PhyAddrLen);
//如果有回達 res就是0
if (res == 0)
{
for (int i = 0; i < PhyAddrLen; i++)
{
//轉成看得懂的MAC型態
temp += MacAddr[i].ToString("x2") + "-";
}
//減掉最後一個"-" 並轉成大寫 如果temp長度為0 就代表有回應但沒有MAC 以沒有回應處理
if (temp.Length != 0)
{
temp = (temp.Remove(temp.Length - 1, 1)).ToUpper();
LiveAndMAC[0] = 1;
LiveAndMAC[1] = temp;
}
else
{
LiveAndMAC[0] = 0;
LiveAndMAC[1] = "";
}

return LiveAndMAC;
}
else
{
LiveAndMAC[0] = 0;
LiveAndMAC[1] = "";

return LiveAndMAC;
}
}


PS...補充一下
IPAddress LocalIP = IPAddress.Parse("0.0.0.0"); //ip宣告的方式

2010年6月15日 星期二

VS.NET [神技]快速排版

今天亂找資料時候
忽然發現這招神技
快速排版
當你的CODE很亂時候
沒有排好
沒有對好
整個如戰場一樣亂的不行

來來來
教你神技
Ctrl+A
Ctrl+K
Ctrl+D
這三個按下去
您可愛的CODE整整齊齊
乾乾淨淨
哇靠 太神了!!!!

2010年6月9日 星期三

Asp.net Master 會更改元件id值問題

因為Master會自動更新元件id值
結果導致JavaScript的一些依造id判別的檔案全部都掛了 囧
所以就找方法

結果有大大分享這方法
試了一下 可以跑
就貼上來分享
^_^

後端的CODE

public void RenderJSArrayWithCliendIds(params Control[] wc)
{
if (wc.Length > 0)
{
StringBuilder arrClientIDValue = new StringBuilder();
StringBuilder arrServerIDValue = new StringBuilder();

// Get a ClientScriptManager reference from the Page class.
ClientScriptManager cs = Page.ClientScript;

// Now loop through the controls and build the client and server id's
for (int i = 0; i < wc.Length; i++)
{
arrClientIDValue.Append("\"" +
wc[i].ClientID + "\",");
arrServerIDValue.Append("\"" +
wc[i].ID + "\",");
}

// Register the array of client and server id to the client
cs.RegisterArrayDeclaration("MyClientID",
arrClientIDValue.ToString().Remove(arrClientIDValue.ToString().Length - 1, 1));
cs.RegisterArrayDeclaration("MyServerID",
arrServerIDValue.ToString().Remove(arrServerIDValue.ToString().Length - 1, 1));

// Now register the method GetClientId, used to get the client id of tthe control
cs.RegisterStartupScript(this.Page.GetType(), "key",
"\nfunction GetClientId(serverId)\n{\nfor(i=0; i "\n{\nif ( MyServerID[i] == serverId )\n" +
"{\nreturn MyClientID[i];\nbreak;\n}\n}\n}", true);
}
}


前端JS的CODE

var TextBox = document.getElementById(GetClientId("txtTest"));



出處:http://www.codeproject.com/KB/scripting/Masterpage-Javascript.aspx

2010年6月8日 星期二

C# .CS 上寫Javascript


string script = "<script type=\"text/javascript\">alert('連線狀態:"+xxx+",連線時間:" + time + "');</script>";
Page.ClientScript.RegisterStartupScript(typeof(Page), string.Empty, script);


PS...後來發現 常常會發生無法新增的問題
原來是string.Empty <==這是KEY
如果打一樣他會一直重複更新這個
導致所有功能只有一個能跑

所以要直接給他"字串"<==的東西 給它個名字 每個都不同 這樣就行了

C# Extension

主要是新增一個在 .後面可以新增你自己寫的Function
所以
就是
很簡單
新增一個.cs 名字叫ToStringCheckNull 貼上這段範例就行了
看範例吧

using System;
using System.Text;

public static class ToStringCheckNull
{
///
/// ToString時會檢查是否為Null 如果為Null將回傳Null
///

public static string ToStringCheckNull(this object CheckNullValue)
{
string ReturnValue = null;
if (CheckNullValue != null)
ReturnValue = CheckNullValue.ToString();
return ReturnValue;
}
}


重點在public static string ToStringCheckNull(this object CheckNullValue)
public 跟 static 跟 this

CSS 初研究

不太懂 先亂紀錄一下

沒打直接打值表示全套用
前面有 . 表示Class
前面有 # 表示Id

然後 空格 就是子層
例如 .xx Table 表示 xx 的Class 下的Table 套用這屬性值

C# DataTable 左右合併 To LinQ


一般DataTable合併就只是上下合併
但像我又想要讓他左右合併
我又不想寫For迴圈讓他跑
所以 哈哈哈 我就用了LinQ 讓他們緊緊結合在一起了

private DataTable LinqMerge(DataTable DataTable1, DataTable DataTable2)
{
DataTable LinqdataTable = new DataTable();
try
{
var linqMerge =
from DataRow a in DataTable1.Rows
join DataRow b in DataTable2.Rows on a.Field("Order") equals b.Field("Order")
orderby a.Field("Order")
select new { IP1 = a.Field("IP"), Set1 = a.Field("Set"), IP2 = b.Field("IP"), Set2 = b.Field("Set") };

LinqdataTable = LinqQueryToDataTable(linqMerge);
return LinqdataTable;
}
catch
{
return LinqdataTable;
}
}

這是利用他們排序後的IP值 合併的
用這方法前提是 他們有共通的Columns可以合併
像我範例就是Order欄位

然後他們就緊緊合在一起了
如果沒共通的Columns就...生出來吧
不然你怎樣讓他左右合併呢
你說是吧

C# LinQ Update To SQL

更新 SQL方法

LinQDataClassesDataContext context = new LinQDataClassesDataContext(); //LinQToSql
var existingCust = (from a in context.IpTable where a.IP == IP select a).First(); //讀出要更新的表的值出來
existingCust.Ip = IP; //將新值IP變數丟進去
context.SubmitChanges(); //更新資料庫


如果要多個就existingCust.Ip = IP; 多幾欄 有啥屬性就丟啥
YA!! 就醬!!!

C# GridView 程式傳DataSource 分頁法

PageIndexChanging觸發加入這個

protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
GridView1.PageIndex = e.NewPageIndex;
GridView1.DataBind();
}


就可以了 我是用DataTable丟進去的

2010年6月7日 星期一

C# LinQ IP排序

哈哈
之前分享 SQL IP排序方法
可是勒
最近我的心都飄到LinQ上 怎可能不Try It勒


但是勒
哈哈哈
我試不出來 Orz...
我將IP切開後 OrderBy後 LinQ轉SQL語法時候 他說不支援 囧
我也不知道怎辦 XDDDD

所以
我就用折衷方式
先將表讀出來後 存到DataTable裡後
再排序一次 就好了


var Iplinq =
from a in context.IpTable
where a.IP.Contains(IPblock)
select new { IP = a.IP, IsServer = a.IsServer }; //讀出SQL表格

IpTable = LinqQueryToDataTable(Iplinq); //轉DataTable
var orderbyIP =
from DataRow a in IpTable.Rows
let b = a.Field("IP").Split('.') //切開IP
let ipblock1 = b.GetValue(0)
let ipblock2 = b.GetValue(1)
let ipblock3 = b.GetValue(2)
let ipblock4 = b.GetValue(3)
orderby Convert.ToInt32(ipblock1), Convert.ToInt32(ipblock2), Convert.ToInt32(ipblock3), Convert.ToInt32(ipblock4) //轉成數值在個別排序
select a;

語法一樣 就是 LinQToSql時候出問題 導致不能排序
如果直接丟上上面的SQL那部份就會有錯
應該是......就是有問題吧 XD
如果各位大大有辦法解決 請幫我解答一下 感恩

C# LinQ Like

LinQ 怎樣做到 SQL 語法的Like勒

where a.IP.Contains(IPblock)


就醬
Contains <==LIKE

2010年6月3日 星期四

SQL Performance Profiler Application Name

由於最近在學SQL Proformance 的東西
所以稍為紀錄一下學習過的東西囉

首先是Profiler這個SQL Performance內建軟體
簡單說 它就是在紀錄DB幹了啥好事的軟體
就是將所有動作記錄下來
可是勒
在這個欄位!!!Application Name 總是在連接時候都空的
找了一下資料後 才知道連接字串要把這個加入才會顯示
就是

Data Source=(local);Initial Catalog=DB;Integrated Security=True
Data Source=(local);Initial Catalog=DB;Integrated Security=True;Application Name=AppName

這樣要做分析 就會比較好分析喔

2010年6月2日 星期三

SQL T-SQL 觸發即時同步Table

有時候會用到Table要一模一樣 但是卻要寫兩次
這樣又很麻煩
所以弄了個T-SQL指令 可以同步讓兩個Table同步化
只要在觸發增加下面指令就行了
當然裡面表格跟寫法要自己設定一下
新增修改刪除下面都有 ^^


CREATE TRIGGER [dbo].[datacopy]
ON [dbo].[data]
AFTER INSERT
AS

BEGIN
--SET @name = SELECT a FROM inserted
DECLARE @n01 nvarchar(50),
@n02 nvarchar(50),
@n03 nvarchar(50),
@n04 nvarchar(50),
@n05 nvarchar(50),
@n06 nvarchar(50),
@n07 nvarchar(50),
@n08 nvarchar(50),
@n09 nvarchar(50),
@n10 nvarchar(50),
@n11 nvarchar(50),
@n12 nvarchar(50),
@n13 nvarchar(50),
@n14 nvarchar(50),
@n15 nvarchar(50),
@n16 nvarchar(50),
@n17 nvarchar(50),
@n18 nvarchar(50),
@n19 nvarchar(50),
@n20 nvarchar(50),
@n21 nvarchar(50),
@n22 nvarchar(50),
@n23 nvarchar(50),
@n24 nvarchar(50),
@n25 nvarchar(50),
@n26 nvarchar(50),
@n27 nvarchar(50),
@n28 nvarchar(50),
@n29 nvarchar(50),
@n30 nvarchar(50),
@n31 nvarchar(50),
@n32 nvarchar(50),
@n33 nvarchar(50),
@n34 nvarchar(50),
@n35 nvarchar(50),
@n36 nvarchar(50),
@n37 nvarchar(50),
@n38 nvarchar(50),
@n39 nvarchar(50),
@n40 nvarchar(50),
@n41 nvarchar(50),
@n42 nvarchar(50),
@n43 nvarchar(50),
@n44 nvarchar(50),
@n45 nvarchar(50),
@n46 nvarchar(50),
@n47 nvarchar(50),
@n48 nvarchar(50),
@n49 nvarchar(50),
@n50 nvarchar(50)
select @n01 = i.[n01],
@n02 = i.[n02],
@n03 = i.[n03],
@n04 = i.[n04],
@n05 = i.[n05],
@n06 = i.[n06],
@n07 = i.[n07],
@n08 = i.[n08],
@n09 = i.[n09],
@n10 = i.[n10],
@n11 = i.[n11],
@n12 = i.[n12],
@n13 = i.[n13],
@n14 = i.[n14],
@n15 = i.[n15],
@n16 = i.[n16],
@n17 = i.[n17],
@n18 = i.[n18],
@n19 = i.[n19],
@n20 = i.[n20],
@n21 = i.[n21],
@n22 = i.[n22],
@n23 = i.[n23],
@n24 = i.[n24],
@n25 = i.[n25],
@n26 = i.[n26],
@n27 = i.[n27],
@n28 = i.[n28],
@n29 = i.[n29],
@n30 = i.[n30],
@n31 = i.[n31],
@n32 = i.[n32],
@n33 = i.[n33],
@n34 = i.[n34],
@n35 = i.[n35],
@n36 = i.[n36],
@n37 = i.[n37],
@n38 = i.[n38],
@n39 = i.[n39],
@n40 = i.[n40],
@n41 = i.[n41],
@n42 = i.[n42],
@n43 = i.[n43],
@n44 = i.[n44],
@n45 = i.[n45],
@n46 = i.[n46],
@n47 = i.[n47],
@n48 = i.[n48],
@n49 = i.[n49],
@n50 = i.[n50]

from inserted i
--SELECT a FROM inserted

INSERT INTO [test2].[dbo].[data3]([n01],[n02],[n03],[n04],[n05],[n06],[n07],[n08],[n09],[n10],[n11],[n12],[n13],[n14],[n15],[n16],[n17],[n18],[n19],[n20],[n21],[n22],[n23],[n24],[n25],[n26],[n27],[n28],[n29],[n30],[n31],[n32],[n33],[n34],[n35],[n36],[n37],[n38],[n39],[n40],[n41],[n42],[n43],[n44],[n45],[n46],[n47],[n48],[n49],[n50]) VALUES(@n01,@n02,@n03,@n04,@n05,@n06,@n07,@n08,@n09,@n10,@n11,@n12,@n13,@n14,@n15,@n16,@n17,@n18,@n19,@n20,@n21,@n22,@n23,@n24,@n25,@n26,@n27,@n28,@n29,@n30,@n31,@n32,@n33,@n34,@n35,@n36,@n37,@n38,@n39,@n40,@n41,@n42,@n43,@n44,@n45,@n46,@n47,@n48,@n49,@n50)
END


XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXxx
CREATE TRIGGER [dbo].[datacopydel]
ON [dbo].[data]
AFTER DELETE
AS

BEGIN
--SET @name = SELECT a FROM inserted
DECLARE @n01 nvarchar(50),
@n02 nvarchar(50),
@n03 nvarchar(50),
@n04 nvarchar(50),
@n05 nvarchar(50),
@n06 nvarchar(50),
@n07 nvarchar(50),
@n08 nvarchar(50),
@n09 nvarchar(50),
@n10 nvarchar(50),
@n11 nvarchar(50),
@n12 nvarchar(50),
@n13 nvarchar(50),
@n14 nvarchar(50),
@n15 nvarchar(50),
@n16 nvarchar(50),
@n17 nvarchar(50),
@n18 nvarchar(50),
@n19 nvarchar(50),
@n20 nvarchar(50),
@n21 nvarchar(50),
@n22 nvarchar(50),
@n23 nvarchar(50),
@n24 nvarchar(50),
@n25 nvarchar(50),
@n26 nvarchar(50),
@n27 nvarchar(50),
@n28 nvarchar(50),
@n29 nvarchar(50),
@n30 nvarchar(50),
@n31 nvarchar(50),
@n32 nvarchar(50),
@n33 nvarchar(50),
@n34 nvarchar(50),
@n35 nvarchar(50),
@n36 nvarchar(50),
@n37 nvarchar(50),
@n38 nvarchar(50),
@n39 nvarchar(50),
@n40 nvarchar(50),
@n41 nvarchar(50),
@n42 nvarchar(50),
@n43 nvarchar(50),
@n44 nvarchar(50),
@n45 nvarchar(50),
@n46 nvarchar(50),
@n47 nvarchar(50),
@n48 nvarchar(50),
@n49 nvarchar(50),
@n50 nvarchar(50)
select @n01 = d.[n01],
@n02 = d.[n02],
@n03 = d.[n03],
@n04 = d.[n04],
@n05 = d.[n05],
@n06 = d.[n06],
@n07 = d.[n07],
@n08 = d.[n08],
@n09 = d.[n09],
@n10 = d.[n10],
@n11 = d.[n11],
@n12 = d.[n12],
@n13 = d.[n13],
@n14 = d.[n14],
@n15 = d.[n15],
@n16 = d.[n16],
@n17 = d.[n17],
@n18 = d.[n18],
@n19 = d.[n19],
@n20 = d.[n20],
@n21 = d.[n21],
@n22 = d.[n22],
@n23 = d.[n23],
@n24 = d.[n24],
@n25 = d.[n25],
@n26 = d.[n26],
@n27 = d.[n27],
@n28 = d.[n28],
@n29 = d.[n29],
@n30 = d.[n30],
@n31 = d.[n31],
@n32 = d.[n32],
@n33 = d.[n33],
@n34 = d.[n34],
@n35 = d.[n35],
@n36 = d.[n36],
@n37 = d.[n37],
@n38 = d.[n38],
@n39 = d.[n39],
@n40 = d.[n40],
@n41 = d.[n41],
@n42 = d.[n42],
@n43 = d.[n43],
@n44 = d.[n44],
@n45 = d.[n45],
@n46 = d.[n46],
@n47 = d.[n47],
@n48 = d.[n48],
@n49 = d.[n49],
@n50 = d.[n50]

from deleted d
--SELECT a FROM inserted
DELETE [test2].[dbo].[data3] WHERE [n01] = @n01
END



XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx
CREATE TRIGGER [dbo].[datacopyupdate]
ON [dbo].[data]
AFTER UPDATE
AS

BEGIN
--SET @name = SELECT a FROM inserted
DECLARE @n01 nvarchar(50),
@n02 nvarchar(50),
@n03 nvarchar(50),
@n04 nvarchar(50),
@n05 nvarchar(50),
@n06 nvarchar(50),
@n07 nvarchar(50),
@n08 nvarchar(50),
@n09 nvarchar(50),
@n10 nvarchar(50),
@n11 nvarchar(50),
@n12 nvarchar(50),
@n13 nvarchar(50),
@n14 nvarchar(50),
@n15 nvarchar(50),
@n16 nvarchar(50),
@n17 nvarchar(50),
@n18 nvarchar(50),
@n19 nvarchar(50),
@n20 nvarchar(50),
@n21 nvarchar(50),
@n22 nvarchar(50),
@n23 nvarchar(50),
@n24 nvarchar(50),
@n25 nvarchar(50),
@n26 nvarchar(50),
@n27 nvarchar(50),
@n28 nvarchar(50),
@n29 nvarchar(50),
@n30 nvarchar(50),
@n31 nvarchar(50),
@n32 nvarchar(50),
@n33 nvarchar(50),
@n34 nvarchar(50),
@n35 nvarchar(50),
@n36 nvarchar(50),
@n37 nvarchar(50),
@n38 nvarchar(50),
@n39 nvarchar(50),
@n40 nvarchar(50),
@n41 nvarchar(50),
@n42 nvarchar(50),
@n43 nvarchar(50),
@n44 nvarchar(50),
@n45 nvarchar(50),
@n46 nvarchar(50),
@n47 nvarchar(50),
@n48 nvarchar(50),
@n49 nvarchar(50),
@n50 nvarchar(50)
select @n01 = i.[n01],
@n02 = i.[n02],
@n03 = i.[n03],
@n04 = i.[n04],
@n05 = i.[n05],
@n06 = i.[n06],
@n07 = i.[n07],
@n08 = i.[n08],
@n09 = i.[n09],
@n10 = i.[n10],
@n11 = i.[n11],
@n12 = i.[n12],
@n13 = i.[n13],
@n14 = i.[n14],
@n15 = i.[n15],
@n16 = i.[n16],
@n17 = i.[n17],
@n18 = i.[n18],
@n19 = i.[n19],
@n20 = i.[n20],
@n21 = i.[n21],
@n22 = i.[n22],
@n23 = i.[n23],
@n24 = i.[n24],
@n25 = i.[n25],
@n26 = i.[n26],
@n27 = i.[n27],
@n28 = i.[n28],
@n29 = i.[n29],
@n30 = i.[n30],
@n31 = i.[n31],
@n32 = i.[n32],
@n33 = i.[n33],
@n34 = i.[n34],
@n35 = i.[n35],
@n36 = i.[n36],
@n37 = i.[n37],
@n38 = i.[n38],
@n39 = i.[n39],
@n40 = i.[n40],
@n41 = i.[n41],
@n42 = i.[n42],
@n43 = i.[n43],
@n44 = i.[n44],
@n45 = i.[n45],
@n46 = i.[n46],
@n47 = i.[n47],
@n48 = i.[n48],
@n49 = i.[n49],
@n50 = i.[n50]

from inserted i
--SELECT a FROM inserted
UPDATE [test2].[dbo].[data3] SET [n02] = @n02,[n03] = @n03,[n04] = @n04,[n05] = @n05,[n06] = @n06,[n07] = @n07,[n08] = @n08,[n09] = @n09,[n10] = @n10,[n11] = @n11,[n12] = @n12,[n13] = @n13,[n14] = @n14,[n15] = @n15,[n16] = @n16,[n17] = @n17,[n18] = @n18,[n19] = @n19,[n20] = @n20,[n21] = @n21,[n22] = @n22,[n23] = @n23,[n24] = @n24,[n25] = @n25,[n26] = @n26,[n27] = @n27,[n28] = @n28,[n29] = @n29,[n30] = @n30,[n31] = @n31,[n32] = @n32,[n33] = @n33,[n34] = @n34,[n35] = @n35,[n36] = @n36,[n37] = @n37,[n38] = @n38,[n39] = @n39,[n40] = @n40,[n41] = @n41,[n42] = @n42,[n43] = @n43,[n44] = @n44,[n45] = @n45,[n46] = @n46,[n47] = @n47,[n48] = @n48,[n49] = @n49,[n50] = @n50 WHERE [n01] = @n01
END


[N01_OBSYSTEM].[dbo].[TB_Product_D]

Excel VBA 讀儲存格值


Dim a As Double
If Worksheets("超簡易算盤").Range("B2").Value <> 0 Then
a = Worksheets("超簡易算盤").Range("B1").Value / Worksheets("超簡易算盤").Range("B2").Value
Worksheets("超簡易算盤").Range("B5").Value = a
Else
Worksheets("超簡易算盤").Range("B5").Value = "B值不能等於0"
End If


語法
Worksheets("超簡易算盤").Range("B2").Value

說明:
叫出超簡易算盤資料表的B2儲存格的值 也可直接取代

Excel 跳資料表讀資料

說明:跳試算表讀取欄位方法:
範例:
險種一!E15
試算表名稱!(欄位)

VB.NET DetailsView樣板模式

這應該不用解釋吧 XD

DetailsView1.ChangeMode(DetailsViewMode.Edit) ‘編輯樣板模式
DetailsView1.ChangeMode(DetailsViewMode.Insert) ‘新增樣板模式
DetailsView1.ChangeMode(DetailsViewMode.ReadOnly) ‘讀取樣板模式

Excel VBA 可讀取多筆txt資料

這是可以多筆txt匯入Execl的VBA程式
Try看看吧!!!

Sub inCSV()
x = InputBox("請輸入檔案數量")
Range("a1").Select
For i = 1 To x
If i = 1 Then
z = 1
Else
z = 1
End If
y = ActiveCell.Address
With ActiveSheet.QueryTables.Add(Connection:="TEXT;C:\xx\" & i & ".txt", Destination:=Range(y))
.Name = "1"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 950
.TextFileStartRow = z
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = True
.TextFileTabDelimiter = True
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = False
.TextFileSpaceDelimiter = True
.TextFileColumnDataTypes = Array(1, 1, 1, 5)
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With
Application.CommandBars("External Data").Visible = False
Selection.End(xlDown).Select
ActiveCell.Offset(1, 0).Select
Next
End Sub
Private Sub CommandButton1_Click()
inCSV
End Sub

C# LinQ Top

LinQ就是簡單的
var Top10 =( LinQ語法 ).Take(10);

10就是取十個阿 XDDD

如果單純要Top 1
也可以用
var Top10 =( LinQ語法 ).First();

但是這樣是直接回傳"值" 囉!!!!

2010年5月31日 星期一

SQL IP排序


SELECT *
FROM [Ip_Information]
order by cast(parsename(IP,4) as int),cast(parsename(IP,3) as int) ,cast(parsename(IP,2) as int),cast(parsename(IP,1) as int)

2010年5月27日 星期四

C# Asp.net GridView抓RowIndex

這簡單就是多加這行就好囉

CommandArgument='<%# ((GridViewRow) Container).RowIndex %>'

在Command元件的aspx裡面加
聽不懂喔

<asp:Button ID="GridViewButton" CommandName="GridViewButton" CommandArgument='<%# ((GridViewRow) Container).RowIndex %>' runat="server" Text="Button" CssClass="btnClass" />

這樣懂了吧 XDDD
哈哈
這樣CommandArgument抓出來的就是RowIndex了

C# Asp.net GridView 樣版元件取屬性

很多人應該都跟我一樣 很想要玩GridView的功能
但一直被他很複雜的鬼架構搞的一點都不想摸它 XDDD

最近強迫自己要搞懂它!!!
所以
目前有強烈進展!!!!

先來講講樣板取元件取屬性值吧

首先呢
理論上你會Command去執行它
也就是先用RowCommand去做觸發

阿直接看CODE好了 = =+

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
GridViewRow currentRow = null; //宣告一個GridViewRow
if (e.CommandName == "GridViewButton") //檢查按下去的元件名稱觸發對應事件
{
currentRow = (GridViewRow)((Button)e.CommandSource).NamingContainer; // 將觸發元件整行丟到GridViewRow 裡
Label gridviewlabel1 = ((Label)currentRow.FindControl("GridViewLabel")); //宣告一個Label丟元件
Label1.Text = gridviewlabel1.Text;
}
}


上面最重要就是FindControl囉 就是將GridViewRow裡面找出GridViewLabel這名稱的元件
然後套用進來 這樣gridviewlabel1 所有屬性就=GridViewLabel的屬性囉 ^^
然後就可以直接抓來用了 哈哈 GOOD!!!!

2010年5月24日 星期一

C# LinQ And DataTable

在偷偷推薦一下LinQ的好 XDD
最近都稍稍玩了一下LinQ 好物阿
其實他最重要的是可以把SQL的東西都丟到RAM裡面計算
像我等等講的DataTable 跟 LinQ
將SQL值丟到DataTable後 再用LinQ去查詢
速度快多了!!!!

講太多廢話了
看CODE吧 XDD

DataTable GetSQL= GetTopSQLIP(""); //這是讀SQL 到 DataTable的Code
var results = //LinQ 開始
from DataRow myRow in GetSQL.Rows //因為DataTable要用DataRow
where myRow.Field("IP") == "127.0.0.1"
select myRow;
DataTable LinQDataTable = new DataTable(); //再丟回一個DataTable
try
{
LinQDataTable = results.CopyToDataTable(); //丟到DataTable裡
}
catch
{
}


裡面比較重要就是要查詢DataTable需要多加DataRow
還有 為啥我要用try勒
因為 我發現如果LinQ查完後 如果裡面無值 會發生錯誤!!!
在我怎樣遍尋不到results.Count怎樣弄出來時候
我就用最笨的方式做 = =+
如果發生錯誤就跳過 這樣我檢查DataTable的Count也還是0阿 哈哈哈

PS...YA 找到方法了 要results.Count() 就好囉 XDDD 那麼簡單都不會 囧

C# Parallel.For

上次有講到的Parallel.For
上次拿我的Code來稍稍玩了一下!!!


一些public的部份會被搶奪而造成資料錯亂

所以
寫這個時候真的要很小心 >O<"

2010年5月11日 星期二

VisualStudio2010新功能

多了一個好物!!!
Parallel.For
可以將For依造多執行緒同步執行
這樣執行For時間就變快了XDDD
前提是for前與後是不相關的狀況下
就是可以個別執行的話
用用看吧!! ^^

他是在 System.Threading.Tasks.Parallel.For裡

先紀錄一下
改天來實驗看看 ^^

2010年4月29日 星期四

Server 2008 IIS 7 網站移轉問題

CGW再今天遇到了一個大問題
氣!!!!!
整個早上都再搞這問題浪費一堆時間

我將我負責的網頁 從SERVER2003移轉到新SERVER OS:SERVER2008上
結果
SERVER2008 IIS為7
我發現我的網頁死在那邊
好囉!!!
因為我是用VS2010開發的
所以要裝Framework 4.0
所以勒....
執行後第一個問題:!!!!!!!!!!!!!!!!

1. 500.23 Internal Server Error
解答在.....(http://biasecurities.com/blog/2006/) 這網站
我是參考他的方式
將他移轉就可了 @@
指令為
Windows\system32\inetsrv\APPCMD.EXE migrate config “Default Web Site/YourApp

解決了第一個問題.........
出來了第二個問題.........

2. 500.21 Internal Server Error
這問題勒
就是將ASP 重新包給FrameWork4.0就行了
這還好!!!!
指令為
Windows\Microsoft.NET\Framework\v4.0.20506\aspnet_regiis.exe -i

解決了第二個問題..........
出現了第三個問題 囧

3. Session state can only be used when enableSessionState is set to true.....
一大串 暈.......
簡單說就是SessionState問題
結果勒
這讓我花了點時間 = =+
因為
我的Web.config竟然讓死白目的IIS自己幫我新增指令...Remove一堆值!!!
其中就有Session.........
明白了。 很愚蠢的,其實。 它的工作之後,我刪除和添加SessionStateModule像這樣:

<system.webserver>
...
<modules> <!--這裡面都是自己幫我建立的!!!! -->
<remove name="Session">
...
</modules>
</system.webserver>

他在這裡面把我的Session移掉.....
想打人 = =+
然後就刪掉了 <modules>裡面的東西就好囉!!!!
暈!!!!

一次給我三個問題 氣!!!!!
不過也因為這樣 這篇文章多了三個經驗值 哈 XDDD

2010年4月26日 星期一

前置音效面板失效

我這兩天遇到一個很鳥的問題 = =+

前置面板插耳機沒反應!!

GOOGLE一下竟然是.......前面板不支援HD關係
然而...HD控制板會偵測有沒有插裝置而開啟OR關閉音效

所以前面板會偵測不到而無法開啟

掯 這啥鳥問題 = =+

所以HD控制板請關掉前面板偵測功能就好了

真鳥 = =+

C# 同步執行

就是可以多個程式同時跑
這樣程式才不會被綁住


private void Form1_Load(object sender, EventArgs e)
{
Thread ct = new Thread(c);
ct.Start();
Thread ctx = new Thread(cc);
ctx.Start();
}
public void c()
{
Thread.Sleep(1005);
Console.WriteLine("111");
}
public void cc()
{
Thread.Sleep(1000);
Console.WriteLine("222");
}


這樣C跟CC的程式可以說幾乎同時進行
GOOD!!!

2010年4月25日 星期日

C# RegularExpressionValidator

VS裡有很多個認證元件...
除了他以外...
還有好多個其他功能的...

CompareValidator 比較用,將使用者的資料與固定值比較
CustomValidator 自訂程式檢查
RangeValidator 規定輸入範圍!! 可時間數字字串等..
RegularExpressionValidator 規定樣式檢查(如電話號碼,EMAIL等..)
RequiredFieldValidator 空白檢查 (就是一定要輸入字才行)

所以就講最煩的RegularExpressionValidator吧 XDDD
因為它有規定樣式寫法

[] <==可接受範圍
{} <==表示可接受幾個字 {7} 需KEY7個字 {3,6} 可KEY3~6個字
. <==都可以的意思 但是一個 . 代表一個位元 需多位元可以用.{5} 來表示
^ <==相反意思
| <==OR
() <==只是隔開意思 方便閱讀與判斷
? <==前一個規則重複0~1次
* <==重複0~無限
+ <==重複1~無限

\d <==0~9
\D <==非0~9
\s <==空白字元
\S <==非空白字元
\w <==數字或是英文字
\W <==非數字與英文字


講那麼多 我也懶的自己設定規則 所以分享些常用的規則
<電話號碼>
[0-9]{2}-[0-9]{7,8}

\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
<郵遞區號>
\d{3}((-)?\d{2})?
<電話或手機>
((\d{10})|(((\(\d{2}\))|(\d{2}-))?\d{4}(-)?\d{3}(\d)?))
<網址>
http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?

2010年4月20日 星期二

C# LinQ 語法

新摸的東西
LinQ是啥東西?!!!
自己去Google吧 XDDDD

好啦
直接看程式吧

var num = new int[] { 1, 6, 5, 44, 8, 7, 4, 5, 42 }; //亂宣告的陣列
var p = from np in num //LinQ開始
where (np % 2) == 0 //下搜尋指令
select np; //奇怪的是這邊才有結束位元 ;
List plist =p.ToList();
textBox1.Text = plist[0].ToString(); //印出來 YA


這次第一次測試
等以後多的指令後
在上來分享

我比較好奇的是
他查詢速度跟吃CPU,RAM的多寡
如果可以有效控制的話
那就可以減少SQL指令的複雜度+讀取次數

等測試後在上來分享^^

2010年4月11日 星期日

C# Chart ToolTip

可以在圖表上即時SHOW你所指位置的XY值等資訊



Chart1.Series["0"].ToolTip = "X value \t= #VALX{d}\nY value \t= #VALY{C}\nRadius";

如果要在網頁上SHOW就把上面的CODE寫在Page_Load裡


#VALX{d} <==裡面的值的意思
d-是年月日期(2000/01/01)
D-是年月日期(2000年01月01日)
f-是年月日期時間(2000年01月01日 上午12:00)
g-是年月日期時間(2000/01/01 上午12:00)
M-是月日(01月01日)
Y-是年月(2000年01月)

#VALY{F0}
C-$的標示
E-科學符號
F-普通值
P-百分比
0~3-小數點位數


另外!!!!!!
如果想要顯示多一點的Y值
例如....
圖表上只有年齡
但是你想要顯示年齡身高體重的話
CHART有提供Y值多筆輸入的功能
但是只會用第一筆顯示


Chart1.Series["0"].YValueMembers ="Age,Height,Weight"; //給他三個值 但是顯示以AGE為主
Chart1.Series["0"].YValuesPerPoint=3; //Y軸有幾個值


然後在這裡新加入3個值了
這樣ToolTip就可以顯示3個值出來了

Chart1.Series["0"].ToolTip = "X軸 \t=#VALX{f}\n年齡 \t= #VALY{F0}\n身高 \t= #VALY2{F0}\n體重 \t= #VALY3{F0}";


完成!!!!!

2010年4月9日 星期五

C# Chart 清除值

這是全部吃光光的!!!!

Chart1.Series.Clear();
Chart1.Series[0].Points.Clear(); //或是這個


但是
清光光後
記得把Series[0]加回來
所以要再加上

Chart1.Series[0].Points.AddXY(0, 0);


這樣才可執行
不然會有Index找不到的錯誤

2010年3月31日 星期三

C# 常駐程式

可將執行程式放入常駐程式內!!!


NotifyIcon notifyIcon;
private void Form1_Load(object sender, EventArgs e)
{
notifyIconShow();
}
void notifyIconShow()
{
this.notifyIcon = new NotifyIcon();
this.notifyIcon.BalloonTipText = "HI!!!";
this.notifyIcon.Text = "HI!!!";
this.notifyIcon.Icon = new System.Drawing.Icon("recherche.ico");

this.notifyIcon.ShowBalloonTip(1000);

//TODO:初始化 notifyIcon菜單
System.Windows.Forms.ContextMenu notifyIconMenu = new System.Windows.Forms.ContextMenu();

System.Windows.Forms.MenuItem notifyIconMenuItem = new System.Windows.Forms.MenuItem();
notifyIconMenuItem.Index = 0;
notifyIconMenuItem.Text = "展開(Open)";
notifyIconMenuItem.Click += new EventHandler(notifyIconMenuItem1_Click);
notifyIconMenu.MenuItems.Add(notifyIconMenuItem);
System.Windows.Forms.MenuItem notifyIconMenuItem2 = new System.Windows.Forms.MenuItem();
notifyIconMenuItem2.Index = 1;
notifyIconMenuItem2.Text = "結束(Exit)";
notifyIconMenuItem2.Click += new EventHandler(notifyIconMenuItem2_Click);
notifyIconMenu.MenuItems.Add(notifyIconMenuItem2);

this.notifyIcon.ContextMenu = notifyIconMenu;

//this.notifyIcon.Visible = true;
}
void notifyIconMenuItem1_Click(object sender, EventArgs e)
{
this.Show();
WindowState = FormWindowState.Normal;
notifyIcon.Visible = false;
}
void notifyIconMenuItem2_Click(object sender, EventArgs e)
{
notifyIcon.Visible = false;
Application.Exit();
}
private void Form1_Resize(object sender, EventArgs e) //需設定觸發
{
if (this.WindowState == FormWindowState.Minimized)
{
this.Hide();
notifyIcon.Visible = true;
}
}

SQL SUM


SELECT [IP],SUM(InOctets) InOctets,SUM(OutOctets) OutOctets,SUM(TotalOctets) TotalOctets
FROM [HR].[dbo].[LAN_Snmp_Value]
GROUP BY [IP] --針對IP去總和

2010年3月25日 星期四

C# DateTime 字串格式化

datetime 顯示自己想要的時間格式
格式方式上次有說明過 XD


DateTime time = DateTime.Now;
textBox1.Text = String.Format("{0:yyyy-MM-dd HH:mm}", time);

2010年3月18日 星期四

C# 關閉程式

正常結束

Application.Exit();



強制結束

System.Environment.Exit(System.Environment.ExitCode);

2010年3月14日 星期日

Visio 連接資料庫

工具 > 附加元件 > Visio Extras > 連接至資料庫

可以將原件的屬性作成資料庫檔
如要修改原件名稱資料時 可直接由資料庫修改
即可馬上更新

點入後 可選擇資料庫位置
選擇資料庫對應的屬性欄
修改後即可直接顯示

好功能 ^^
雖然在設定資料庫時候很煩 XDDDD

2010年3月8日 星期一

C# TXT IO

寫入

TextWriter tw = new StreamWriter("Globaldata.txt");
tw.WriteLine("123\r\n" + "5345"); // \r\n換行
tw.WriteLine("123\r\n" + "5345");
tw.Close();



讀取

TextReader xx = new StreamReader("Globaldata.txt");
string line = "";
while ((line = xx.ReadLine()) != null)
{
Console.WriteLine(line);
}

2010年3月4日 星期四

C# Get Set

設定一個狗的名字
可以用
dog.Name= XXX 來給予狗的名字
也可用
XXX=dog.Name 來讀取狗的名字


Class Dog
{
public string Name
{
get{
return Name;
}
set{
Name=value;
}
}
}

2010年3月3日 星期三

C# 排序 翻轉

將xxx陣列內值排序
將xxx陣列內值翻轉

Array.Sort(xxx);
Array.Reverse(xxx);

C# 字串/時間格式化

把字串/時間 顯示值格式化

cht1.ChartAreas["ChartArea1"].AxisX.LabelStyle.Format = "h:mm";


(時間格式)
y - 年
yy - 年 未滿兩位補0
yyyy - 西元
M - 月
MM - 月 未滿兩位補0
d - 日
d - 日 未滿兩位補0
h - 12進位小時
hh - 12進位小時 未滿兩位補0
H - 24進位小時
HH - 24進位小時 未滿兩位補0
m - 分
mm - 分 未滿兩位補0
s - 秒
ss - 秒 未滿兩位補0
f~f^7 - 秒後小數點 1~7位

(字串格式)
前面補0的數字字串
String.Format("{0:0000}", 123); // 輸出 0123

前後都補0的數字字串
String.Format("{0:0000.0000}", 123.45); // 輸出 0123.4500

每3位數(千)加逗號
(String.Format("{0:0,0}", 12345); // 輸出 12,345

格式化電話號碼
(String.Format("{0:(###) ###-####}", 1234567890); // 輸出 (123) 456-7890

金額的表示
(String.Format("{0:$#,##0.00;($#,##0);Zero}", 0); // 這個會顯示 Zero
(String.Format("{0:$#,##0.00;($#,##0.00);Zero}", 1234.50); // 這個會顯示 $1,234.50

2010年3月1日 星期一

MSN 無法執行 無錯誤代碼

NVIDIA Network Access Manager的filter會把MSN連線給濾掉,
工作管理員 > nsvcappflt.exe 關掉

2010年2月21日 星期日

C# Chart 顯示範圍 & 選取範圍

<更改屬性>

<顯示範圍>
ChartAreas > Axes > X axis > ScaleView >

Position 起始值
Size 範圍大小


<選取範圍>
ChartAreas > CursorX >

IsUserEnabled => true
IsUserSelectionEnabled => true

2010年2月12日 星期五

SQL 排序

WHERE後面加上

ORDER BY [LAN_IP.IP] DESC //由大到小
ORDER BY [LAN_IP.IP] ASC //由小到大

2010年2月10日 星期三

C# comboBox顯示資料庫列 可對應值


string constr = "Data Source=*****;Initial Catalog=*****;Integrated Security=True";

string str_select2 = "SELECT * FROM Departments";
string str_select = str_select2 ;
SqlConnection con = new SqlConnection(constr);
DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter(str_select, con);

try
{
da.Fill(ds, "Departments");
DataTable datable = ds.Tables["Departments"];
comboBox1.DataSource = datable;
comboBox1.DisplayMember = "Department";
comboBox1.ValueMember = "Department_No";


}
catch (Exception ex)
{

}

2010年2月9日 星期二

EXCEL $小說明

公式內$意思是鎖住
表示全套用時候無法更改
標事前無$才會隨著套用指定位置做位移

=$F1<>$C1 <==可隨著位置改變1值
=$F$1<>$C$1 <==全鎖死
=F1<>C1 <==隨著位置改變C F 跟1的值

2010年2月7日 星期日

C# 拆字串

依照符號拆

char[] delimiterChars = { ' ', ',', '.', ':', '\t' };

string text = "one\ttwo three:four,five six seven";
System.Console.WriteLine("Original text: '{0}'", text);

string[] words = text.Split(delimiterChars);
System.Console.WriteLine("{0} words in text:", words.Length);


依照字串位置拆

word.Substring(1, 3) //從第二個字讀三個字

2010年2月6日 星期六

C# SQL SELECT


string constr = "Data Source=*****;Initial Catalog=*****;Integrated Security=True";

string str_select = "SELECT * FROM LAN_IP";

SqlConnection con = new SqlConnection(constr);
DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter(str_select, con);

da.Fill(ds,"LAN_IP");
DataTable datable = ds.Tables["LAN_IP"];
textBox1.Text= datable.Rows[1][4].ToString();

2010年2月5日 星期五

C# SQL UPDATE


SqlConnection conn;
string sqlIns;
SqlCommand cmdIns;
//-----
conn = new SqlConnection("Data Source=*****;Initial Catalog=*****;Integrated Security=True");
conn.Open();
sqlIns = "UPDATE [LAN_SNMP_TorF] SET [TorF]=@TorF WHERE [IP]=@ip";
try
{
cmdIns = new SqlCommand(sqlIns, conn);
cmdIns.Parameters.Add("@ip", "192.168.11.160");
cmdIns.Parameters.Add("@TorF", "F");
cmdIns.ExecuteNonQuery();

// Get the last inserted id.
cmdIns.Dispose();
cmdIns = null;
}
catch (Exception ex)
{
throw new Exception(ex.ToString(), ex);
}
finally
{
conn.Close();
}

C# SQL INSERT


SqlConnection conn = new SqlConnection("Data Source=*****;Initial Catalog=*****;Integrated Security=True");
conn.Open();
string sqlIns = "INSERT INTO LAN_Snmp_Value([IP], [InOctets],[OutOctets],[TotalOctets],[Time]) VALUES (@ip, @InOctets, @OutOctets,@TotalOctets,@Time)";
try
{
SqlCommand cmdIns = new SqlCommand(sqlIns, conn);
cmdIns.Parameters.Add("@ip", argv[0]);
cmdIns.Parameters.Add("@InOctets", Global.TrafficNew[0]);
cmdIns.Parameters.Add("@OutOctets", Global.TrafficNew[1]);
cmdIns.Parameters.Add("@TotalOctets", Global.TrafficNew[2]);
cmdIns.Parameters.Add("@Time", DateTime.Now);
cmdIns.ExecuteNonQuery();

cmdIns.Parameters.Clear();
cmdIns.CommandText = "SELECT @@IDENTITY";

// Get the last inserted id.
int insertID = Convert.ToInt32(cmdIns.ExecuteScalar());

cmdIns.Dispose();
cmdIns = null;
}
catch (Exception ex)
{
throw new Exception(ex.ToString(), ex);
}
finally
{
conn.Close();
}

VB.NET SQL ALL功能


Imports System.Data
Imports System.Data.SqlClient
Public Class Form1

Inherits System.Windows.Forms.Form

Public Function ShowPerson()
Dim connStr, selectCmd As String
connStr = "server=127.0.0.1; database=DB; uid=***; pwd=***;"
selectCmd = "Select * From PERSON Order By id_no DESC"
Dim conn As SqlConnection, myAdapter As SqlDataAdapter
Dim myDataSet As New DataSet()
conn = New SqlConnection(connStr)
conn.Open()
myAdapter = New SqlDataAdapter(selectCmd, conn)
myAdapter.Fill(myDataSet, "PERSON")
DataGrid1.DataSource = myDataSet.Tables("PERSON")
End Function

Public Function GetSqlStr(ByVal str As String) As String
Return Replace(str, "'", "''")
End Function

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
ShowPerson()
End Sub

Private Sub btnAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAdd.Click
Dim connStr, insertCmd As String
connStr = "server=127.0.0.1; database=DB; uid=***; pwd=***;"
insertCmd = "Insert Into PERSON(name, id_position, tel, salary) Values('" & _
GetSqlStr(txtName.Text) & "','" & GetSqlStr(txtPosition.Text) & _
"','" & GetSqlStr(txtTel.Text) & "'," & Val(txtSalary.Text) & ")"
Dim conn As SqlConnection, cmd As SqlCommand
conn = New SqlConnection(connStr)
conn.Open()
cmd = New SqlCommand(insertCmd, conn)
cmd.ExecuteNonQuery()
ShowPerson()
End Sub

Private Sub btnUpdate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUpdate.Click
Dim connStr, updateCmd As String
connStr = "server=127.0.0.1; database=DB; uid=***; pwd=***;"
updateCmd = "update PERSON Set id_position = '" & GetSqlStr(txtPosition.Text) & _
"',tel = '" & GetSqlStr(txtTel.Text) & "', salary = " & _
Val(txtSalary.Text) & " Where name = '" & GetSqlStr(txtName.Text) & "'"
Dim conn As SqlConnection, cmd As SqlCommand
conn = New SqlConnection(connStr)
conn.Open()
cmd = New SqlCommand(updateCmd, conn)
cmd.ExecuteNonQuery()
ShowPerson()
End Sub

Private Sub btnDel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDel.Click
Dim connStr, delCmd As String
connStr = "server=127.0.0.1; database=DB; uid=***; pwd=***;"
delCmd = "Delete From PERSON Where name = '" & GetSqlStr(txtName.Text) & "'"
Dim conn As SqlConnection, cmd As SqlCommand
conn = New SqlConnection(connStr)
conn.Open()
cmd = New SqlCommand(delCmd, conn)
cmd.ExecuteNonQuery()
ShowPerson()
End Sub
End Class







Imports System.Data
Imports System.Data.SqlClient

Dim Bm As BindingManagerBase

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim selectCmd As String = "select id_no as 書號, name as 書名, price as 單價, qty as 數量 From BOOK"
Dim connStr As String = "Server=localhost; database=BOOKDB; uid=sa; pwd=;"
Dim conn As SqlConnection, myAdapter As SqlDataAdapter
Dim myDataSet As DataSet = New DataSet()
conn = New SqlConnection(connStr)
conn.Open()
myAdapter = New SqlDataAdapter(selectCmd, conn)
myAdapter.Fill(myDataSet, "BOOK")
Dim bindId As Binding = New Binding("Text", myDataSet, "BOOK.書號")
Dim bindName As Binding = New Binding("Text", myDataSet, "BOOK.書名")
Dim bindPrice As Binding = New Binding("Text", myDataSet, "BOOK.單價")
Dim bindQty As Binding = New Binding("Text", myDataSet, "BOOK.數量")
txtId.DataBindings.Add(bindId)
txtName.DataBindings.Add(bindName)
txtPrice.DataBindings.Add(bindPrice)
txtQty.DataBindings.Add(bindQty)
Bm = Me.BindingContext(myDataSet, "BOOK")
CheckBm()
End Sub

Private Function CheckBm()
If Bm.Position = 0 Then
btnFirst.Enabled = False
btnPrev.Enabled = False
btnNext.Enabled = True
btnLast.Enabled = True
ElseIf Bm.Position = Bm.Count - 1 Then
btnFirst.Enabled = True
btnPrev.Enabled = True
btnNext.Enabled = False
btnLast.Enabled = False
Else
btnFirst.Enabled = True
btnPrev.Enabled = True
btnNext.Enabled = True
btnLast.Enabled = True
End If
lblShow.Text = (Bm.Position + 1) & "/" & Bm.Count
End Function

Private Sub btnFirst_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFirst.Click
Bm.Position = 0
CheckBm()
End Sub

Private Sub btnNext_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNext.Click
If Bm.Position < Bm.Count - 1 Then
Bm.Position += 1
End If
CheckBm()
End Sub

Private Sub btnPrev_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrev.Click
If Bm.Position > 0 Then
Bm.Position -= 1
End If
CheckBm()
End Sub

Private Sub btnLast_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLast.Click
Bm.Position = Bm.Count - 1
CheckBm()
End Sub




Select Case TabControl1.SelectedTab.ToString
Case "TabPage: {發送簡訊}"
........................
Case "XXXX"

2010年2月2日 星期二

C# 錯誤部份

出現Use of unassigned local variable 'x'時
表示
你的變數x未給他初始值


真是有夠機車的錯誤點 = =+

2010年1月31日 星期日

C# 使用SNMP

在C#上使用SNMP
且可將OID碼下所有位置列出


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace ConsoleApplication1
{
public class MainSnmP
{
public static void Main()
{
string[] argv = new string[3];
argv[0] = "127.0.0.1";
argv[1] = "public";

argv[2] = "1.3.6.1.2.1.2.2.1.10";
//SimpleSNMP.SiSNMP(argv);
MacAddress.MacAdd(argv);
argv[2] = "1.3.6.1.2.1.2.2.1.16";
MacAddress.MacAdd(argv);

Console.ReadLine();

}
}
public class SimpleSNMP
{
public static void SiSNMP(string[] argv)
{

int commlength, miblength, datatype, datalength, datastart;
int uptime = 0;
string output;
SNMP conn = new SNMP();
byte[] response = new byte[1024];

Console.WriteLine("Device SNMP information:");

// Send sysName SNMP request
response = conn.get("get", argv[0], argv[1], "1.3.6.1.2.1.1.5.0");
if (response[0] == 0xff)
{
Console.WriteLine("No response from {0}", argv[0]);
return;
}

// If response, get the community name and MIB lengths
commlength = Convert.ToInt16(response[6]);
miblength = Convert.ToInt16(response[23 + commlength]);

// Extract the MIB data from the SNMP response
datatype = Convert.ToInt16(response[24 + commlength + miblength]);
datalength = Convert.ToInt16(response[25 + commlength + miblength]);
datastart = 26 + commlength + miblength;
output = Encoding.ASCII.GetString(response, datastart, datalength);
Console.WriteLine(" sysName - Datatype: {0}, Value: {1}",
datatype, output);
//----------
// Send a sysLocation SNMP request
response = conn.get("get", argv[0], argv[1], "1.3.6.1.2.1.1.6.0");
if (response[0] == 0xff)
{
Console.WriteLine("No response from {0}", argv[0]);
return;
}

// If response, get the community name and MIB lengths
commlength = Convert.ToInt16(response[6]);
miblength = Convert.ToInt16(response[23 + commlength]);

// Extract the MIB data from the SNMP response
datatype = Convert.ToInt16(response[24 + commlength + miblength]);
datalength = Convert.ToInt16(response[25 + commlength + miblength]);
datastart = 26 + commlength + miblength;
output = Encoding.ASCII.GetString(response, datastart, datalength);
Console.WriteLine(" sysLocation - Datatype: {0}, Value: {1}", datatype, output);
//------------
// Send a SysUptime SNMP request
response = conn.get("getnextMIB", argv[0], argv[1], "1.3.6.1.2.1.2.2.1.16.256.3");
if (response[0] == 0xff)
{
Console.WriteLine("No response from {0}", argv[0]);
return;
}

// Get the community and MIB lengths of the response
commlength = Convert.ToInt16(response[6]);
miblength = Convert.ToInt16(response[23 + commlength]);

// Extract the MIB data from the SNMp response
datatype = Convert.ToInt16(response[24 + commlength + miblength]);
datalength = Convert.ToInt16(response[25 + commlength + miblength]);
datastart = 26 + commlength + miblength;

// The sysUptime value may by a multi-byte integer
// Each byte read must be shifted to the higher byte order
while (datalength > 0)
{
uptime = (uptime << 8) + response[datastart++];
datalength--;
}
Console.WriteLine(" sysUptime - Datatype: {0}, Value: {1}", datatype, uptime);
//---------
// Send a SysUptime SNMP request
response = conn.get("getnextMIB", argv[0], argv[1], "1.3.6.1.2.1.2.2.1.10.256.3");
if (response[0] == 0xff)
{
Console.WriteLine("No response from {0}", argv[0]);
return;
}

// Get the community and MIB lengths of the response
commlength = Convert.ToInt16(response[6]);
miblength = Convert.ToInt16(response[23 + commlength]);

// Extract the MIB data from the SNMp response
datatype = Convert.ToInt16(response[24 + commlength + miblength]);
datalength = Convert.ToInt16(response[25 + commlength + miblength]);
datastart = 26 + commlength + miblength;

// The sysUptime value may by a multi-byte integer
// Each byte read must be shifted to the higher byte order
while (datalength > 0)
{
uptime = (uptime << 8) + response[datastart++];
datalength--;
}
Console.WriteLine(" sysUptime - Datatype: {0}, Value: {1}", datatype, uptime);

}

}

class MacAddress
{
public static void MacAdd(string[] argv)
{
int commlength=0, miblength=0, datastart=0, datatype=0, datalength=0;
int valueint = 0;
string nextmib="";
SNMP conn = new SNMP();
string mib = "";

int orgmiblength = 0;
byte[] response = new byte[1024];

//-----------------------
mib = argv[2];
orgmiblength = mib.Length;
nextmib = mib;
while (true)
{
response = conn.get("getnext", argv[0], argv[1], nextmib);
commlength = Convert.ToInt16(response[6]);
miblength = Convert.ToInt16(response[23 + commlength]);
datatype = Convert.ToInt16(response[24 + commlength + miblength]);
datalength = Convert.ToInt16(response[25 + commlength + miblength]);
datastart = 26 + commlength + miblength;
valueint = 0;
while (datalength > 0)
{
valueint = (valueint << 8) + response[datastart++];
datalength--;
}

//Console.WriteLine(" sysUptime - Datatype: {0}, Value: {1}", datatype, valueint);
// value = Encoding.ASCII.GetString(response, datastart, datalength);
//value = BitConverter.ToString(response, datastart, datalength);
nextmib = conn.getnextMIB(response);
if (!(nextmib.Substring(0, orgmiblength) == mib))
break;
Console.WriteLine("{0} = {1}", nextmib, valueint);
}


}

}

class SNMP
{
public SNMP()
{

}

public byte[] get(string request, string host, string community, string mibstring)
{
byte[] packet = new byte[1024];
byte[] mib = new byte[1024];
int snmplen;
int comlen = community.Length;
string[] mibvals = mibstring.Split('.');
int miblen = mibvals.Length;
int cnt = 0, temp, i;
int orgmiblen = miblen;
int pos = 0;

// Convert the string MIB into a byte array of integer values
// Unfortunately, values over 128 require multiple bytes
// which also increases the MIB length
for (i = 0; i < orgmiblen; i++)
{
temp = Convert.ToInt16(mibvals[i]);
if (temp > 127)
{
mib[cnt] = Convert.ToByte(128 + (temp / 128));
mib[cnt + 1] = Convert.ToByte(temp - ((temp / 128) * 128));
cnt += 2;
miblen++;
}
else
{
mib[cnt] = Convert.ToByte(temp);
cnt++;
}
}
snmplen = 29 + comlen + miblen - 1; //Length of entire SNMP packet

//The SNMP sequence start
packet[pos++] = 0x30; //Sequence start
packet[pos++] = Convert.ToByte(snmplen - 2); //sequence size

//SNMP version
packet[pos++] = 0x02; //Integer type
packet[pos++] = 0x01; //length
packet[pos++] = 0x00; //SNMP version 1

//Community name
packet[pos++] = 0x04; // String type
packet[pos++] = Convert.ToByte(comlen); //length
//Convert community name to byte array
byte[] data = Encoding.ASCII.GetBytes(community);
for (i = 0; i < data.Length; i++)
{
packet[pos++] = data[i];
}

//Add GetRequest or GetNextRequest value
if (request == "get")
packet[pos++] = 0xA0;
else
packet[pos++] = 0xA1;

packet[pos++] = Convert.ToByte(20 + miblen - 1); //Size of total MIB

//Request ID
packet[pos++] = 0x02; //Integer type
packet[pos++] = 0x04; //length
packet[pos++] = 0x00; //SNMP request ID
packet[pos++] = 0x00;
packet[pos++] = 0x00;
packet[pos++] = 0x01;

//Error status
packet[pos++] = 0x02; //Integer type
packet[pos++] = 0x01; //length
packet[pos++] = 0x00; //SNMP error status

//Error index
packet[pos++] = 0x02; //Integer type
packet[pos++] = 0x01; //length
packet[pos++] = 0x00; //SNMP error index

//Start of variable bindings
packet[pos++] = 0x30; //Start of variable bindings sequence

packet[pos++] = Convert.ToByte(6 + miblen - 1); // Size of variable binding

packet[pos++] = 0x30; //Start of first variable bindings sequence
packet[pos++] = Convert.ToByte(6 + miblen - 1 - 2); // size
packet[pos++] = 0x06; //Object type
packet[pos++] = Convert.ToByte(miblen - 1); //length

//Start of MIB
packet[pos++] = 0x2b;
//Place MIB array in packet
for (i = 2; i < miblen; i++)
packet[pos++] = Convert.ToByte(mib[i]);
packet[pos++] = 0x05; //Null object value
packet[pos++] = 0x00; //Null

//Send packet to destination
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,
ProtocolType.Udp);
sock.SetSocketOption(SocketOptionLevel.Socket,
SocketOptionName.ReceiveTimeout, 5000);
IPHostEntry ihe = Dns.Resolve(host);
IPEndPoint iep = new IPEndPoint(ihe.AddressList[0], 161);
EndPoint ep = (EndPoint)iep;
sock.SendTo(packet, snmplen, SocketFlags.None, iep);

//Receive response from packet
try
{
int recv = sock.ReceiveFrom(packet, ref ep);
}
catch (SocketException)
{
packet[0] = 0xff;
}
return packet;
}

public string getnextMIB(byte[] mibin)
{
string output = "1.3";
int commlength = mibin[6];
int mibstart = 6 + commlength + 17; //find the start of the mib section
//The MIB length is the length defined in the SNMP packet
// minus 1 to remove the ending .0, which is not used
int miblength = mibin[mibstart] - 1;
mibstart += 2; //skip over the length and 0x2b values
int mibvalue=0;

for (int i = mibstart; i < mibstart + miblength; i++)
{
mibvalue = Convert.ToInt16(mibin[i]);
if (mibvalue > 128)
{
mibvalue = (mibvalue / 128) * 128 + Convert.ToInt16(mibin[i + 1]);
i++;
}
output += "." + mibvalue;
}
return output;
}


}


}




參考:C-Sharp_Network_Programming 書

C# 全域變數

全域變數宣告方法


public class Global
{
public static int iVars = 0;
}

2010年1月27日 星期三

SNMP oid 意義

1.3.6.1.2.1.2.2.1.5.1 網路速度
1.3.6.1.2.1.4.9.0 網路進入流量

oid碼後需加實體OR虛擬網路

這次測試虛擬網路值為1

C# 原件陣列

用checkbox表示


CheckBox[] check = new CheckBox[8];
check[1] = CheckBox1;
check[2] = CheckBox2;
check[3] = CheckBox3;
check[4] = CheckBox4;
check[5] = CheckBox5;
check[6] = CheckBox6;
check[7] = CheckBox7;

for ( i = 1; i < 7; i++)
{
check[i].Checked = true;

2010年1月25日 星期一

C#上使用SNMP

Firstly, you have to add a reference to OLEPRNLIB. You can find it from "Add reference" -> "COM". The path of the dll is located at C:\Windows\System32 by Default.