2011年3月29日 星期二

thickbox跨越iframe

請參考詳細來源
--
底下截取重點:
thickbox跨越iframe的问题很好解决,只需要在父页和iframe页都要载入 jquery.js thickbox.js thickbox.css(别忘记了父页面) 修改thickbox.js 函数function tb_init(domChunk) 找到tb_show(t,a,g);

这句修改为:
if (window.parent.frames[window.name] &&
(parent.document.getElementsByTagName('frameset').length <= 0))
{
self.parent.tb_show(t,a,g);
}
else
{
tb_show(t,a,g);
}

---
為了無讓iframe影響,我調整改為統一為:
window.top.tb_show(t,a,g);

我的用法為:(這樣,不管是父子窗,統一在最前端)PS:因我是套在照片顯示
if (window.parent.frames[window.name] &&
(parent.document.getElementsByTagName('frameset').length <= 0))
{
window.top.tb_show(t,a,g);
}
else
{
window.top.tb_show(t,a,g);
}

2011年3月28日 星期一

read csv to datatable

參考
--
Dim dt As New DataTable()
Dim line As String = Nothing
Dim i As Integer = 0

Using sr As StreamReader = File.OpenText("c:\temp\table1.csv")
line = sr.ReadLine()
Do While line IsNot Nothing
Dim data() As String = line.Split(","c)
If data.Length > 0 Then
If i = 0 Then
For Each item In data
dt.Columns.Add(New DataColumn())
Next item
i += 1
End If
Dim row As DataRow = dt.NewRow()
row.ItemArray = data
dt.Rows.Add(row)
End If
line = sr.ReadLine()
Loop
End Using

2011年3月25日 星期五

雲端前置作業:資料拋轉

CS 系列教學網

♣梅問題‧教學網
--
不錯唷,想要美工+網頁自已來的;可在這邊學到不少招式

char 與 varchar 欄位型態考量

參考來源
--
不得不讚揚一下該blog作者,篇篇都精闢

char 與 varchar 的空間大小是以後面參數來表示欄位的大小,不同的地方在於 varchar 是以動態的方式儲存。例如

char(10) 與 varchar(10) 再存放 hello 字串時,char 是佔用10 Bytes的空間,而 varchar 只佔用 5Bytes。

註:char 會佔用 10Bytes 是因為他會自動用空白填滿整個儲存空間,所以真正存在該格的內容是(hello_____),包含了5個空格。

看到這大家肯定會認為宣告為 varchar 是較佳的方式,而實際上還需要考慮存取效率的問題。

假設一個欄位 username 宣告 char(10) 與 varchar(10),char 的情況是DB每次都固定抓取 10 Bytes的大小,不需要判斷欄位內容的長度。反之 varchar 就必須每個欄位值都得用類似pointer 或 linking-list的方式抓取真正的存放內容,如此一來便會耗用系統CPU的運算時間。簡單歸類

char 固定大小浪費空間,所需計算時間少。

varchar 不固定長度,必須要花費較多的CPU計算時間。

FOR XML PATH 多筆資料合併為一筆

參考來源
--
SELECT [SalesOrderID],
(
SELECT [ProductID] + ',' FROM [sales].[SalesOrderDetail] as s2
WHERE s1.SalesOrderID=s2.SalesOrderID
FOR XML PATH('')
) as ProductID
FROM [sales].[SalesOrderDetail] as s1
group by [SalesOrderID],[ProductID]

--
數字跟字串欄位作字串串接
cast([ProductID] as nvarchar)

如何以週來做登入次數統計

SELECT DATEPART(wk,log_time) as '週',count(DATEPART(wk,log_time))as '次數'
FROM HR.data_log
GROUP BY DATEPART(wk,log_time)

SQL] 資料庫加密

使用 Master key、Certificate 與 Symmetric
本篇就不轉貼了,因較精典;請參考來源
SQL] 資料庫加密

SQL 建立遠端資料庫資料表到本地 Table 或 VIEW

參考
--
當在撰寫程式的時候,有時會因為一些因素,導致原本所有資料表(Table)都使用同一台伺服器的資料庫,變成某些資料表要用到其他台伺服器中的資料表。這麼一來不但程式得大改變,而且很難掌握是否還有其他沒注意到的問題。關於這個問題,其實很簡單,只要將遠端(新)伺服器資料庫中所用到的資料表,以檢視(view)方式建立在原本的資料庫上,這麼程式改寫的部分就僅剩更改名稱,甚至用點技巧連程式都不用改了。

想要將遠端伺服器資料庫中的資料表變成本地資料庫的VIEW,首先要先用系統預存程序來完成建立「LinkedServer」的動作

USE Local_DB
EXEC sp_addlinkedserver @server = '192.168.100.200', @srvproduct = N'SQL Server'
EXEC sp_addlinkedsrvlogin @rmtsrvname = '192.168.100.200' , @useself = false, @rmtuser = 'remote_db_account', @rmtpassword = 'remote_db_password'

利用 sp_addlinkedserver 跟遠端資料庫SQL建立關連
利用 sp_addlinkedsrvlogin 設定登入遠端資料庫的帳號、密碼等訊息

Local_DB 換成你程式中原本使用的資料庫名稱
192.168.100.200 當然要換成你遠端伺服器主機的IP
rmtuser 換成遠端資料庫可登入SQL的帳號
rmtpasswword 換成遠端資料庫可登入SQL帳號的 密碼
其他的就照用囉



建立連線與設定遠端登入帳號後,就可以來 CREATE VIEW 了


CREATE VIEW Remote_view1
AS
SELECT *
FROM [192.168.100.200].Remote_DB.dbo.Remote_Table


嚴格的來說 SELECT statement格式為
SELECT * FROM [IP 或 Server_name].Remote_DB_name.DB_Owner_name.Remote_Table_Name。

一切OK後,就可以在你原本使用的資料庫中看到你新增的檢視(VIEW)了。

啥?執行正常卻看不到檢視表,別著急把 SQL Management 關掉重新執行一次,應該就可以看到了(因為有時重新整理似乎對新增的內容還是顯示不出來)

新增 Linked Server 這個動作做一次就OK了,也無法讓你做第二次,因為系統會告訴你這台 Linked Server 已經存在。

那如果寫錯卻已經存在怎麼辦,請用

EXEC sp_dropserver '192.168.100.200'

將已建立的 Linked Server DROP 掉吧。

如果不想手動輸入這些程式碼,你也可以在 SQL 2005 下的

「伺服器物件」→「連結的伺服器」去設定他

2011年3月22日 星期二

MS SQL 分頁+排序語法

參考
--
MS-SQL 2000以前,常見的分頁用語法。
SELECT * FROM
(
SELECT TOP [每頁長度] * FROM
(
SELECT TOP [每頁長度*第幾頁] [欄位1, 欄位2, ...]
FROM [資料表]
WHERE [篩選條件]
ORDER BY [排序欄位] [DESC/ASC]
)
AS [資料表别名1]
ORDER BY [排序欄位] [ASC/DESC]
)
AS [資料表别名2]
ORDER BY [排序欄位] [DESC/ASC]MS-SQL Type C


***************************************************************************************************************
MS-SQL 2005以後才有RANK()語法。
SELECT * FROM
(
SELECT rank() OVER ( ORDER BY [排序欄位] [ASC/DESC] ) AS RankNumber, * FROM
(
SELECT [欄位1, 欄位2, ...]
FROM [資料表]
WHERE [篩選條件]
)
AS [資料表别名1]
) AS [資料表别名2]
WHERE RankNumber between [每頁長度*(第幾頁-1)] and [每頁長度*第幾頁]MS-SQL Type D


***************************************************************************************************************
MS-SQL 2000可用,但Select時,不可包含PK用的欄位。(需透過暫存資料表操作)
參考資料:(SQL)抽獎,亂數抽出10筆中獎資料並排名
SELECT IDENTITY(INT,1,1) AS RankNumber, [欄位1, 欄位2, ...]
INTO [#暫存資料表名稱]
FROM [資料表]
ORDER BY [排序欄位] [ASC/DESC];

SELECT * FROM [#暫存資料表名稱]
WHERE RankNumber between [每頁長度*(第幾頁-1)] and [每頁長度*第幾頁];

DROP TABLE [#暫存資料表名稱];MySQL
SELECT [欄位1, 欄位2, ...]
FROM [資料表]
WHERE [篩選條件]
ORDER BY [排序欄位] [ASC/DESC]
LIMIT [每頁長度] OFFSET [每頁長度*第幾頁]

Sql 無條件進位

當Price欄位預設為文字時,將Price轉成數值並乘以0.85,最後再做無條件進位的功能
Ceiling(cast(Price as int)*0.85)

若Price欄位本身預設就是數值時,可以把cast拿掉
Ceiling(Price*0.85)

用sql查詢每個月的資料筆數

select year(prod_date),month(prod_date),count(*) from product
group by year(prod_date),month(prod_date)
order by year(prod_date),month(prod_date)

得到單據流水號

參考
--
-- ==================================================
-- 名稱:得到單據流水號
-- 實現功能:取得對應表的計數器,實現流水號功能.
-- 調用示例:SELECT F_LT_GetOrderNo(FId) as FID, * from Tab1 T1
left outer join T_OrderList T2 on T1.FTabID = T2.FID
-- ==================================================
CREATE TABLE T_OrderList(
FID int IDENTITY (1, 1) NOT NULL,
FIncCount int -- 計數器
)

CREATE FUNCTION F_LT_GetOrderNo(@ID int)
AS RETURN VARCHAR(32)
DECLARE @OrderNo int
SELECT @OrderNo = FIncCount FROM T_OrderList WHERE FID = @ID
-- 取得編號後,計數器加1
UPDATE T_OrderList SET FIncCount = FIncCount +1 -- 函數中不允許執行UPDATE,這種情況要怎麼處理.
RETURNS @OrderNo

-- 系統單據表,存放系統所以業務單據列表,存有生成流水號計數器
CREATE TABLE T_OrderList(
FID int IDENTITY (1, 1) NOT NULL,
FIncCount int -- 計數器
FOrder varchar(30) not Null
)

-- 系統業務單據,存放企業日常業務資料,具體每單有一個單據流水號
CREATE TABLE T_Order(
FID int IDENTITY (1, 1) NOT NULL,
FNumber varchar(40), -- 單據流水號
FOrderInfo varchar(30)
)

-- 現系統要求自動運算,將運算後的資料填充到T_Order業務表中.填充時各記錄要生成不同的單據流水號.我原先的實現想法是用存儲過程:
CREATE PROCEDURE P_OnlyC
@CodeC VARCHAR(48) OUTPUT
AS
DECLARE @OnlyC VARCHAR(48)
,@FIncCount INTEGER

-- 取出當前單據流水號
SELECT @FIncCount=FIncCount FROM T_OrderList WHERE FID=@CodeC
-- 流水號加1
SELECT @FIncCount = @FIncCount +1

UPDATE T_OrderList SET FIncCount = @FIncCount WHERE FID= @CodeC

-- 組織各個編碼
SELECT @OnlyC = @CodeC + '-' + @OnlyC
SELECT @CodeC = @OnlyC; SELECT @OnlyC AS FNumber
-- print @CodeC
GO

但這程方法不能在SELECT語句運算出的結果中調用.如前面寫的SELECT P_OnlyC(FId) as 流水號, * from (select sum(..) from tab..) Tab1 所以我想用函數,但函數裏又沒辦法執行遞增流水號:

CREATE FUNCTION F_LT_GetOrderNo(@ID int)
AS RETURN VARCHAR(32)
DECLARE @OrderNo int
SELECT @OrderNo = FIncCount FROM T_OrderList WHERE FID = @ID
-- 取得編號後,計數器加1
UPDATE T_OrderList SET FIncCount = FIncCount +1 -- 函數中不允許執行UPDATE
RETURNS @OrderNo



CREATE PROCEDURE n_GetBillNo
@billType char(2),--單據類型
@BillOutNo nvarchar(50) Output

AS

Begin

declare @NowNO int
declare @date char(10)
declare @Symbol nvarchar(10)
declare @ErrorMsg nvarchar(200)

Set NoCount On
Begin Tran
--設定延時
SET LOCK_TIMEOUT 5000

--取當前序號
Select @NowNO=fnumber,@Symbol=fCode,@date=Convert(char(8),fDate,112) from n_BillNo With(xLock) where fcode=@BillType
if @@Error<>0
begin
Set @ErrorMsg='資料被鎖定,請求超時!'
Goto Failed
end
--是否是新的一月
if Convert(char(8),getdate(),112)<>@date
Set @NowNo=1
else
Set @NowNo=@NowNo+1

--更新當前序列號和設置最後更新日期
update n_BillNo set fNumber=@NowNO,fDate=GetDate() where fcode=@BillType
if @@Error<>0
begin
Set @ErrorMsg='更新外部序列號失敗!'
Goto Failed
end

--取得單號
Set @BillOutNo=lTrim(@SymBol)+Convert(char(8),GetDate(),112)+Right(('0000'+Convert(varchar,@NowNO)),4)

Goto Succeed

Failed:
RaisError(@ErrorMsg,16,1)
Rollback Tran
Set NoCount Off
Return 1

Succeed:
Commit Tran
Set NoCount Off
Return 0

End
GO

資料庫備份

DECLARE @DB_NAME SYSNAME --欲備份的資料庫名稱
DECLARE @DB_BACKUP_PATH VARCHAR(120) --備份路徑
SET @DB_NAME='master'
SET @DB_BACKUP_PATH='C:\BACKUP\'+@DB_NAME+'_'+CONVERT(VARCHAR(8),GETDATE(),112)+'.BAK'
SELECT @DB_BACKUP_PATH
--備份當天的資料庫
BACKUP DATABASE @DB_NAME TO DISK=@DB_BACKUP_PATH WITH INIT

Access中的IsNull()

參考
--
在Access中,IsNull的作用僅僅是判斷是否為空值

不過Access還是有支援MS-SQL IsNull的相似指令碼,在Access是用 iif 替代..

Select iif(IsNull( express ), value1, value2 ) From TableName

語法說明,判斷express是否為空,若是空的回傳value1,反之則回傳value2

Access自動編號的欄位重新從1開始編號

在Access裡的查詢設計裡

ALTER TABLE 表格名稱 ALTER COLUMN 自動編號 COUNTER (1, 1)

備份全部 SQL 資料庫

參考
--
事前需先在c 槽建立 db backup 資料夾 或者 修改以下紅字的地方

DECLARE @DBName varchar(255)

DECLARE @DATABASES_Fetch int

DECLARE DATABASES_CURSOR CURSOR FOR
select
DATABASE_NAME = db_name(s_mf.database_id)
from
sys.master_files s_mf
where
-- ONLINE
s_mf.state = 0

-- Only look at databases to which we have access
and has_dbaccess(db_name(s_mf.database_id)) = 1

-- Not master, tempdb or model
and db_name(s_mf.database_id) not in ('Master','tempdb','model')
group by s_mf.database_id
order by 1

OPEN DATABASES_CURSOR

FETCH NEXT FROM DATABASES_CURSOR INTO @DBName

WHILE @@FETCH_STATUS = 0
BEGIN
declare @DBFileName varchar(256)
set @DBFileName = datename(dw, getdate()) + ' - ' +
replace(replace(@DBName,':','_'),'\','_')

exec ('BACKUP DATABASE [' + @DBName + '] TO DISK = N''c:\db backup\' +
@DBFileName + ''' WITH NOFORMAT, INIT, NAME = N''' +
@DBName + '-Full Database Backup'', SKIP, NOREWIND, NOUNLOAD, STATS = 100')

FETCH NEXT FROM DATABASES_CURSOR INTO @DBName
END

CLOSE DATABASES_CURSOR
DEALLOCATE DATABASES_CURSOR

T-SQL While Loop

declare @Part_Id int
declare @Category_Id int
declare @Desc varchar(50)

create table PART (Part_Id int, Category_Id int, Description varchar(50))

set @Part_Id = 0
set @Category_Id = 0

while @Part_Id < 2
begin
set @Part_Id = @Part_Id + 1
while @Category_Id < 3
begin
set @Category_Id = @Category_Id + 1
set @Desc = 'Part_Id is ' + cast(@Part_Id as char(1)) +
' Category_Id ' + cast(@Category_Id as char(1))
insert into PART values(@Part_Id,
@Category_Id,
@Desc )
end
set @Category_Id = 0
end

select * from PART
drop table PART

Label 畫邊框

參考
--
Private Sub Label1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Label1.Paint
'上
e.Graphics.DrawLine(New Pen(System.Drawing.Brushes.Black, 1), New Point(0, 0), New Point(Label1.Width - 1, 0))
'左
e.Graphics.DrawLine(New Pen(System.Drawing.Brushes.Black, 1), New Point(0, 0), New Point(0, Label1.Height - 1))
'右
e.Graphics.DrawLine(New Pen(System.Drawing.Brushes.Black, 1), New Point(Label1.Width - 1, 0), New Point(Label1.Width - 1, Label1.Height - 1))
'下
e.Graphics.DrawLine(New Pen(System.Drawing.Brushes.Black, 1), New Point(0, Label1.Height - 1), New Point(Label1.Width - 1, Label1.Height - 1))
End Sub

檢查SQL Server中資料表是否存在

''' 檢查 SQL 資料庫中是否存在此資料表
''' 要搜尋的資料表名稱Public Function IsSQLTableExist(ByVal TableName As String) As Boolean
Try
Using con_SQL = GetSQLConnection()
con_SQL.Open()

Dim DT As DataTable
Dim restrictions() As String = {Nothing, Nothing, TableName, Nothing}
DT = con_SQL.getschema("Tables", restrictions)

If DT.Rows.Count > 0 Then
Return True
Else
Return False
End If
End Using

Catch ex As Exception
MsgBox(ex)
End Try
End Function

簡單使用SqlBulkCopy範例

Dim conn As SqlConnection = GetConnection()
'不先open連線會造成BeginTransaction發出錯誤訊息
conn.Open()
Dim tran As SqlTransaction = conn.BeginTransaction

Try
Using bcp As SqlBulkCopy = New SqlBulkCopy(conn, SqlBulkCopyOptions.Default, tran)
'對應的Table和欄位,如果兩張Table一模一樣欄位可以不用Mapping
bcp.DestinationTableName = tableName
bcp.ColumnMappings.Add("欄位")
' 填入要上傳的Table
bcp.WriteToServer(UploadTable)
Catch ex As Exception
MsgBox(ex.Message)
End Try

建立ACCESS資料庫

'新增Access資料庫
Dim CreaStr As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & DataSource
Dim Catalog As Object = CreateObject("ADOX.Catalog")
Catalog.Create(CreaStr)

2011年3月21日 星期一

防止 wscript.exe 被綁了

網路上查了很多,都找不到我的狀況...
我較特別!?
狀態是:
wscript.exe 吃掉CPU 50% , 嚴重影響工作
只好自己來debug了..
最後,還是找到了;那是:setdebug.exe 這檔是後門
不管怎把wscript.exe 中斷,立即就啟動了
1.利用OS找尋:setdebug.exe (補:c:\windows\setdebug.exe 不可刪;不在此均要刪)
2.開啟工作管理員,將setdebug.exe 中斷
3.刪除setdebug.exe
4.工作管理員,將 wscript.exe 中斷
5.觀查wscript.exe 是否又啟動!? (有的話,那我們的狀態就不一樣了)

建立觸發程序

參考來源(寫得很清楚)
---
觸發程序是整個資料異動交易的延伸,從處理異動資料作業到觸發程序執行完畢,都是資料異動交易的範圍。
新增(INSERT):新增資料後,會將被新增的資料存放在INSERTED資料表,以供觸發程序使用。
刪除(DELETE):刪除資料後,會將被刪除的資料存放在DELETED資料表,以供觸發程序使用。
更新(UPDATE):更新資料後,會將修改前的資料存放在DELETED資料表,修改後的資料存放在INSERTED資料表,以供觸發程序使用。
當資料表執行INSERT、UPDATE、DELETE之後,執行觸發程序,可以在INSERTED跟DELETED資料表,取得剛異動的資料,來做資料上的處理或判斷,如果觸發程序執行發生錯誤時,整個資料異動都會不成立,就是會ROLLBACK,也可以在觸發程序裡執行ROOLBACK,將資料恢復到原先的資料。

觸發程序有二種:
AFTER觸發程序:只能用在資料表,在執行資料表的INSERT、UPDATE、DELETE之後執行,可針對資料異動做額外的動作(執行T-SQL),如新增資料到資料表。
INSETEAD OF觸發程序:能用在資料表或檢視表,是在取代INSERT、UPDATE、DELETE的動作,對新增資料的值做額外的處理。

AFTER觸發程序:
CREATE TABLE Stocks
(
ProductID int IDENTITY(1,1) NOT NULL PRIMARY KEY,
ProductName nvarchar(256),
Stocks int
)
GO
INSERT INTO Stocks(ProductName, Stocks) VALUES('紅原子筆', 100)
INSERT INTO Stocks(ProductName, Stocks) VALUES('藍原子筆', 50)
GO
CREATE TABLE Orders
(
OrderID int IDENTITY(1,1) NOT NULL PRIMARY KEY,
ProductID int,
Orders int
)
GO
CREATE TRIGGER tri_InsertOrders ON Orders
AFTER INSERT
AS
BEGIN
DECLARE @vorders int, @vproductID int
SELECT @vorders = Orders, @vproductID = ProductID FROM INSERTED
UPDATE Stocks SET Stocks = Stocks - @vorders WHERE ProductID = @vproductID
END
GO
INSERT INTO Orders(ProductID, Orders) VALUES('1', 10)
GO

INSETEAD OF觸發程序:
CREATE TABLE Stocks
(
ProductID int IDENTITY(1,1) NOT NULL PRIMARY KEY,
ProductName nvarchar(256),
Stocks int
)
GO
CREATE TRIGGER tri_InsertStocks ON Stocks
INSTEAD OF INSERT
AS
BEGIN
--將ProductName加入'ABC'字串
DECLARE @NewProductName nvarchar(256), @NewStocks int
SELECT @NewProductName = 'ABC' + ProductName, @NewStocks = Stocks FROM INSERTED
INSERT INTO Stocks(ProductName, Stocks) VALUES(@NewProductName, @NewStocks)
END
GO
INSERT INTO Stocks(ProductName, Stocks) VALUES('1', 10)
GO

Adding and Auto Sizing the background image of a MDI Form in .NET

參考來源
---
Insert the following code into the MDI form code. Here we are using Resize event of the MDI form.

Private Sub frmMDI_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Resize

‘ Loading the background image required to place on the MDI.

Dim varImage As Image = Image.FromFile("E:\Projects\Tablet\Arjuna\Images\Background-Landsc.jpg")

‘ If there are no space, no point of drawing so exit the sub procedure.

If Me.ClientSize.Width = 0 OrElse Me.ClientSize.Height <= Me.StatusBar1.Height Then Exit Sub

‘ Creating the bitmap image which is used as the background image.

Dim varBitmap As New Bitmap(Me.ClientSize.Width, Me.ClientSize.Height – Me.StatusBar1.Height, Imaging.PixelFormat.Format24bppRgb)

‘ Getting the drawing surface of the bitmap (varBitmap).

Dim varGraphics As Graphics = Graphics.FromImage(varBitmap)

‘ Sets the interpolation mode of the graphics object. Interpolation mode determines how intermediate values between two endpoints are calculated

varGraphics.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic

‘ Draw the image on the bitmap.

varGraphics.DrawImage(varImage, 0, 0, varBitmap.Width, varBitmap.Height)

‘ Assign the bitmap as the background image of the MDI form.

Me.BackgroundImage = varBitmap

End Sub

XP 使用 IBM DB2 (3)

依 1,2 之後,總算把DB2安裝完成
---
測用下來:
1.
再重開機後,DB2 嵌入 VS 2008 元件(中間層); 並不是很相容
還會出錯(PS:圖忘了截取了,因移除了)
2.
DB2運作下,在記憶體2GB/CPU E7500 下;竟還顯得很喘(嚴重資源不足)
根本不是一般PC能使用的
---
以上僅供參考
要掛上DB2開發,要考量客戶面是否能這樣配合升級

依我對客戶面,在經驗選擇使用資料庫開發對向(排名):
1.sqlite
2.mysql
3.mssql
其他不在考量內

安裝IBM DB2-VS NET (2)

安裝IBM DB2-Exc9.7 (1)

How to execute an sql script file using C#

參考
--
2. Add the using section.



using Microsoft.SqlServer.Management.Smo;

using Microsoft.SqlServer.Management.Common;



3. The hris_db1.sql is the sql script file.



string strConnData = “Data Source=.;Initial Catalog=maser;Integrated Security=True”;

SqlConnection connData = new SqlConnection(strConnData);

FileInfo file = new FileInfo(@”C:\Databases\hris_db1.sql”);

string script = file.OpenText().ReadToEnd();

Server server = new Server(new ServerConnection(connData));

server.ConnectionContext.ExecuteNonQuery(script);

file.OpenText().Close();

connData.Close();

2011年3月19日 星期六

vs 2010 缺乏相容性的考量

vs 一直往前推
卻沒有考量往下相容性
比如:
1.vs 2008 + vs 2010 -->卻變 vs 2010 無法自開專案,必須vs 2008 先開後;才能正常開啟
2.vs 2010 間接影響 vb6 , 影響 vb6 的增益區 ; 會造成開 vb6 就會影響 vs 2010 變更設定
3.凡間接影響到 vs 2010 的,就會令 vs 2010 又無法自己建立新專案

以上是目前測用下來的一些心得!
更利害的是 vs2010 SP1 竟要裝很久,裝到睡著了...Zzz ORZ
龐大的開發工具,要全部兼顧也是件不容易的事; vs team 加油唷~

2011年3月18日 星期五

sql 執行時間

declare @d datetime
set @d=getdate()
select [執行花費時間(毫秒)]=datediff(ms,@d,getdate())

2011年3月17日 星期四

vs 2010 不允許要求的登錄使用權

---
真是怪事了
原因是:
1.OS本身存在VS 2008 Expree(舊的版本)所造成
2.若是單純的OS只安裝一個VS 2010 不會有這問題

解決方式:
1.先用VS 2008 開一個專案(任一個),並關閉
2.使用VS 2010 開一個專案 ; 已可正常打開了
--

pos 未稅金額

一般會區分:應稅品,免稅品
依稅額:0.05 +1.00=1.05
未稅金額=(應稅品/1.05)+免稅品

2011年3月16日 星期三

select count+sum 範例

參考
---
declare @table table
(
id int,
value int
)

insert into @table
select 1, 10 union all
select 1, 11 union all
select 2, 20 union all
select 2, 21 union all
select 3, 30 union all
select 4, 40

select id, count(*)
from @table
group by id
-- result :
-- 1, 2
-- 2, 2
-- 3, 1
-- 4, 1

select sum(cnt)
from
(
select id, count(*) as cnt
from @table
group by id
) as c
-- result = 6

select count(*)
from @table
-- result = 6

如何恢復修復SQL Server的MDF文件

如果備份的數據庫有2個文件,分別是.LDF 和 .MDF,打開企業管理器,在實例上右擊---所有任務--附加數據庫,然後選擇那個.MDF文件,就可以了。

  或者在查詢分析器中輸入:

sp_attach_db "數據庫名稱","路徑\文件名.ldf","路徑\文件名.MDF"


  SQL Server數據庫備份有兩種方式,一種是使用BACKUP DATABASE將數據庫文件備份出去,另外一種就是直接拷貝數據庫文件mdf和日誌文件ldf的方式。下面將主要討論一下後者的備份與恢復。本文假定您能熟練使用SQL Server Enterprise Manager(SQL Server企業管理器)和SQL Server Quwey Analyser(SQL Server查詢分析器)

  1、正常的備份、恢復方式

  正常方式下,我們要備份一個數據庫,首先要先將該數據庫從運行的數據服務器中斷開,或者停掉整個數據庫服務器,然後複製文件。

  卸下數據庫的命令:Sp_detach_db 數據庫名

  連接數據庫的命令:Sp_attach_db或者sp_attach_single_file_db

s_attach_db [@dbname =] 'dbname', [@filename1 =] 'filename_n' [,...16]

sp_attach_single_file_db [@dbname =] 'dbname', [@physname =] 'physical_name'



  使用此方法可以正確恢復SQL Sever7.0和SQL Server 2000的數據庫文件,要點是備份的時候一定要將mdf和ldf兩個文件都備份下來,mdf文件是數據庫數據文件,ldf是數據庫日誌文件。

  例子:

  假設數據庫為test,其數據文件為test_data.mdf,日誌文件為test_log.ldf。下面我們討論一下如何備份、恢復該數據庫。

  卸下數據庫:sp_detach_db 'test'

  連接數據庫:

sp_attach_db 'test','C:\Program Files\Microsoft SQL Server\MSSQL\Data\test_data.mdf','C:\Program Files\Microsoft SQL Server\MSSQL\Data\test_log.ldf'
sp_attach_single_file_db 'test','C:\Program Files\Microsoft SQL Server\MSSQL\Data\test_data.mdf'


  2、只有mdf文件的恢復技術

  由於種種原因,我們如果當時僅僅備份了mdf文件,那麼恢復起來就是一件很麻煩的事情了。

  如果您的mdf文件是當前數據庫產生的,那麼很僥倖,也許你使用sp_attach_db或者sp_attach_single_file_db可以恢復數據庫,但是會出現類似下面的提示信息

  設備激活錯誤。物理文件名 'C:\Program Files\Microsoft SQL Server\MSSQL\data\test_Log.LDF' 可能有誤。

  已創建名為 'C:\Program Files\Microsoft SQL Server\MSSQL\Data\test_log.LDF' 的新日誌文件。


但是,如果您的數據庫文件是從其他計算機上複製過來的,那麼很不幸,也許上述辦法就行不通了。你也許會得到類似下面的錯誤信息
  服務器: 消息 1813,級別 16,狀態 2,行 1

  未能打開新數據庫 'test'。CREATE DATABASE 將終止。

  設備激活錯誤。物理文件名 'd:\test_log.LDF' 可能有誤。

  怎麼辦呢?別著急,下面我們舉例說明恢復辦法。

  A.我們使用默認方式建立一個供恢復使用的數據庫(如test)。可以在SQL Server Enterprise Manager裡面建立。

  B.停掉數據庫服務器。

  C.將剛才生成的數據庫的日誌文件test_log.ldf刪除,用要恢復的數據庫mdf文件覆蓋剛才生成的數據庫數據文件test_data.mdf。

  D.啟動數據庫服務器。此時會看到數據庫test的狀態為「置疑」。這時候不能對此數據庫進行任何操作。

  E.設置數據庫允許直接操作系統表。此操作可以在SQL Server Enterprise Manager裡面選擇數據庫服務器,按右鍵,選擇「屬性」,在「服務器設置」頁面中將「允許對系統目錄直接修改」一項選中。也可以使用如下語句來實現。

  以下是引用片段:

  use master
  go
  sp_configure 'allow updates',1
  go
  reconfigure with override
  go


  F.設置test為緊急修復模式

update sysdatabases set status=-32768 where dbid=DB_ID('test')


  此時可以在SQL Server Enterprise Manager裡面看到該數據庫處於「只讀\置疑\脫機\緊急模式」可以看到數據庫裡面的表,但是僅僅有系統表


G.下面執行真正的恢復操作,重建數據庫日誌文件

dbcc rebuild_log('test','C:\Program Files\Microsoft SQL Server\MSSQL\Data\test_log.ldf')


  執行過程中,如果遇到下列提示信息:

  服務器: 消息 5030,級別 16,狀態 1,行 1

  未能排它地鎖定數據庫以執行該操作。

  DBCC 執行完畢。如果 DBCC 輸出了錯誤信息,請與系統管理員聯繫。

  說明您的其他程序正在使用該數據庫,如果剛才您在F步驟中使用SQL Server Enterprise Manager打開了test庫的系統表,那麼退出SQL Server Enterprise Manager就可以了。

  正確執行完成的提示應該類似於:

  警告: 數據庫 'test' 的日誌已重建。已失去事務的一致性。應運行 DBCC CHECKDB 以驗證物理一致性。將必須重置數據庫選項,並且可能需要刪除多餘的日誌文件。

  DBCC 執行完畢。如果 DBCC 輸出了錯誤信息,請與系統管理員聯繫。

  此時打開在SQL Server Enterprise Manager裡面會看到數據庫的狀態為「只供DBO使用」。此時可以訪問數據庫裡面的用戶表了。

  H.驗證數據庫一致性(可省略)

dbcc checkdb('test')


  一般執行結果如下:

  CHECKDB 發現了 0 個分配錯誤和 0 個一致性錯誤(在數據庫 'test' 中)。

  DBCC 執行完畢。如果 DBCC 輸出了錯誤信息,請與系統管理員聯繫。

  I.設置數據庫為正常狀態

sp_dboption 'test','dbo use only','false'


  如果沒有出錯,那麼恭喜,現在就可以正常的使用恢復後的數據庫啦。

  J.最後一步,我們要將步驟E中設置的「允許對系統目錄直接修改」一項恢復。因為平時直接操作系統表是一件比較危險的事情。當然,我們可以在SQL Server Enterprise Manager裡面恢復,也可以使用如下語句完成

  以下是引用片段:

  sp_configure 'allow updates',0
  go
  reconfigure with override
  go

RotateImage

參考

Me.BackgroundImage resize

Protected Overrides Sub OnResize(ByVal e As System.EventArgs)
MyBase.OnResize(e)

If Not Me.BackgroundImage Is Nothing Then
Me.BackgroundImage.Dispose()
Me.BackgroundImage = Nothing
End If
Dim image As New Bitmap(Me.ClientSize.Width, Me.ClientSize.Height)
Dim gr As Graphics = Graphics.FromImage(image)
Dim rect As New Rectangle(New Point(0, 0), Me.ClientSize)

Dim brush As New LinearGradientBrush(rect, _
Color.RosyBrown, ControlPaint.LightLight(Color.RosyBrown), _
LinearGradientMode.Vertical)
brush.SetBlendTriangularShape(0.33)
gr.FillRectangle(brush, rect)
gr.Dispose()

Me.BackgroundImage = image
End Sub

blogjava

BlogJava - 專注於 Java 技術

VB.NET讀寫INI

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim path As String
path = Application.StartupPath + "\Send.ini"
TextBox1.Text = GetINI("Send", "Send1", "", path)
TextBox2.Text = GetINI("Send", "Send2", "", path)
Dim IsSms As Integer = GetINI("Send", "IsSms", "", path)
If (IsSms = 1) Then
Me.RadioButton1.Checked = True
ElseIf (IsSms = 0) Then
Me.RadioButton2.Checked = True
End If

End Sub
Public Function GetINI(ByVal Section As String, ByVal AppName As String, ByVal lpDefault As String, ByVal FileName As String) As String
Dim Str As String = LSet(Str, 256)
GetPrivateProfileString(Section, AppName, lpDefault, Str, Len(Str), FileName)
Return Microsoft.VisualBasic.Left(Str, InStr(Str, Chr(0)) - 1)
End Function
Public Function WriteINI(ByVal Section As String, ByVal AppName As String, ByVal lpDefault As String, ByVal FileName As String) As Long
WriteINI = WritePrivateProfileString(Section, AppName, lpDefault, FileName)
End Function
Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Int32, ByVal lpFileName As String) As Int32
Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpString As String, ByVal lpFileName As String) As Int32



Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Try
Dim path As String
path = Application.StartupPath + "\Send.ini"
WriteINI("Send", "Send1", TextBox1.Text, path)
WriteINI("Send", "Send2", TextBox2.Text, path)
If (Me.RadioButton1.Checked = True) Then
WriteINI("Send", "IsSms", 1, path)
ElseIf (Me.RadioButton2.Checked = True) Then
WriteINI("Send", "IsSms", 0, path)

End If
MsgBox("配置设置已经成功!!!!")


Catch ex As Exception
MsgBox("错误!!!!")
End Try

End Sub

如何防止程式重覆執行

//取得目前此程式正在執行的 Process 名稱
string ProcessName = Process.GetCurrentProcess().ProcessName;
//將作業系統中,同樣的 Process 名稱全都取回來存進 Process 陣列
Process[] p = Process.GetProcessesByName(ProcessName);

if (p.Length > 1)
{
//處理方式
}

MS SQL 資料表迴圈範例

參考
還有很多喔
----
print '資料表迴圈處理'

--產生暫存資料表 #score
if exists(select * from tempdb.dbo.sysobjects where id = object_id('tempdb.dbo.#score') )
drop table #score

create table #score (
sno varchar(10), --學號
class varchar(10), --科目
num int --分數
)
insert into #score
select '001', '國', 80
union select '001', '英', 90
union select '001', '數', 55
union select '002', '國', 50
union select '002', '英', 60
union select '002', '數', 75
union select '003', '英', 98
union select '003', '數', 59
union select '004', '國', 88
union select '004', '英', 98
union select '005', '國', 58
union select '005', '數', 69
union select '006', '國', 78
union select '006', '英', 84
union select '006', '數', 59

--select * from #score

print '資料表迴圈處理顯示'
DECLARE score_cursor CURSOR
FOR
SELECT distinct sno, class, num
FROM #score
order by sno, class

OPEN score_cursor
DECLARE @sno varchar(10) -- 學號變數
DECLARE @class varchar(10) -- 科目
DECLARE @num int -- 分數

FETCH NEXT FROM score_cursor INTO @sno, @class, @num
WHILE (@@FETCH_STATUS <> -1)
BEGIN
IF (@@FETCH_STATUS <> -2)
BEGIN
PRINT @sno+','+@class+','+convert(varchar(10),@num)
END
FETCH NEXT FROM score_cursor INTO @sno, @class, @num
END
CLOSE score_cursor
DEALLOCATE score_cursor

使用SQL語法 用迴圈 寫出A-Z

參考
--
來源的 @i<91 ->多1了,以下我調整過:
--
declare @i int
set @i=64
while (@i<90)
begin
Set @i=@i+1
print char(@i)
end

2011年3月15日 星期二

Visual Studio 2010 SP1 釋出了

Visual Studio 2010 SP1 下載
--
還包含了:
1.Visual Studio 2010 Productivity Power Tools 下載

VS 2010 可以跟VS 2008共存嗎

真是好的問題,因網路找到範例;想參考看看
結果是vs2010 , 只好先查查實際經驗值了!!
---
答案是:可以!!
可以都安裝在同一個磁碟區,要注意安裝順序是 VS 2005、2008、2010

讓MDI 子視窗每次都固定位置

參考
--
最近在開發新案子,重架選單;卻發現子視窗關閉後再重新打啟一次,竟會位移(x,y)遞增式
自己也是調整ok , 倒是查了一下;底下這方法較OK!
--
Public Sub NewFormInstance(ByVal FormType As Type, ByVal MDIParent As Form)

'MAKE SURE MDI FORM IS VALID INSTANCE AND HAS MDICONTAINER SET TO TRUE
If MDIParent IsNot Nothing AndAlso MDIParent.IsMdiContainer = True Then

Dim myMDIChildForm = CType(Activator.CreateInstance(FormType), Form)
myMDIChildForm.MdiParent = MDIParent
myMDIChildForm.StartPosition = FormStartPosition.Manual
myMDIChildForm.Location = New Point(0, 0)
myMDIChildForm.Show()
myMDIChildForm.BringToFront()
End If

End Sub


and would be used in the MDI Parent form like this:

NewFormInstance(GetType(Form2), Me) 'new instance of form2
NewFormInstance(GetType(Form3), Me) 'new instance of form3

Connection strings for IBM DB2

參考來源
---
所有資料庫的連線字串

2011年3月14日 星期一

The Official Microsoft ASP.NET Site

官網
--
mvc,ajax,webform

SQL Azure Explorer

官網下載
--

如何使用 SMO 建立資料庫

參考
---
1. 使用 Visual Studio 建立一個 Console 應用程式

2. 引用 Microsoft.SqlServer.ConnectionInfo、Microsoft.SqlServer.Management.Sdk.Sfc、Microsoft.SqlServer.Smo

3. 範例程式如下:

using System;
using System.Data;
using System.Data.SqlClient;

using Microsoft.SqlServer.Management.Smo;

namespace UsingSmoCreateSQLServerDatabase
{
class Program
{
static void Main(string[] args)
{
// 使用 SMO 建立資料庫
Server server = new Server("(local)\\SQLExpress");
Database db = new Database(server, "SmoDatabase");
db.Create();
Console.WriteLine("=> 資料庫 {0} 已建立", db.ToString());

Console.ReadKey();

}
}
}

IBM DB2 Express-C 9.7

官網DB2 9.7 試用版

GOM Player 免費

官網
--
原本都使用暴風影音,廣告很多
GOM Player 真是好,完全無廣告

SQL server 32bit (OS 32bit) 服務器大記憶體配置

參考1
參考2
參考3
---
以前的服務器,由於記憶體的價格過高,一般配的記憶體不是很多,超過4G的當然就不多了.
現在的服務器,配置超過4G就很多,在配作SQL 數據庫服務器後,很多的人只選默認的設置,
雖然可以正常使用,可是卻把大量的記憶體給浪費(SQL服務使用的記憶體不會超過1.8G),系統的性能也不能因為的大記憶體而提升,這是很可惜的.
在本文中,我大致講一下配置的過程.(如果服務器的記憶體少於4G,不用配置)(網上完全講這個的,沒有見過,隨手寫一個)

1.打開系統中的大記憶體支持(windows)
若要啟用 Windows 2000 Advanced Server 或 Windows 2000 Datacenter Server 支持
大於4GB的物理記憶體,必須將參數 /pae 添加到 boot.ini 文件中。
[boot loader]
timeout=0
default=multi(0)disk(0)rdisk(0)partition(1)\WINNT
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINNT="Microsoft Windows 2000 Advanced Server"
/fastdetect

改為
[boot loader]
timeout=0
default=multi(0)disk(0)rdisk(0)partition(1)\WINNT
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINNT="Microsoft Windows 2000 Advanced Server"
/fastdetect /pae
這個改好後,要重啟系統的

2.啟用鎖定記憶體頁選項(windows)
您只可以執行這些工作在個別伺服器主控台。若要執行這些工作,您必須登入 Windows 以 SQL Server 所在的電腦上本機系統管理員。
在 [工作列上按一下 [開始],然後按一下 [程式集]。
按一下 [系統管理工具,] 然後選取 [本機安全性原則。
展開 [安全性設定],展開 [本機原則],然後再按一下 [使用者權限指派]。
在右邊的畫面 在記憶體中的鎖定分頁,] 上按一下滑鼠右鍵,然後按一下 [安全性]。
在 [本機安全性原則設定] 對話方塊的方塊中,按一下 [新增]。
按一下以選取 MSSQLSERVER 服務正在執行的帳戶。
按一下 [確定]。
對於 Microsoft Windows 2000 Server,在 [命令] 視窗中鍵入 Secedit /refreshpolicy machine_policy / 強制。
對於 Microsoft Windows Server 2003 在 [命令] 視窗中,輸入 GPUpdate/force。
重新啟動 SQL Server 服務。


3.啟用SQL的AWE
若要啟用 AWE,請將 awe enabled 設置為 1。除非指定了 max server memory 的值,否則 SQL Server 將保留幾乎所有可用記憶體,只留下 128 MB 或更少。
如果已成功啟用該選項,則當 SQL Server 2000 實例啟動時,SQL Server 錯誤日誌中將出現"已啟用地址窗口擴展"這條消息。
awe enabled 是高級選項。如果正在使用 sp_configure 系統存儲過程更改該設置,則只有當 show advanced options 設置為 1 時才能更改 awe enabled。
code 如下,設定SQL 使用6G的記憶體
sp_configure 'show advanced options', 1
RECONFIGURE
GO
sp_configure 'awe enabled', 1
RECONFIGURE
GO
sp_configure 'max server memory', 6144
RECONFIGURE
GO

必須重新啟動 SQL Server 2000 實例才能使更改生效。
net stop mssqlserver
net start mssqlserver

EASEUS Partition Master 硬碟分割、管理工具

官網
EASEUS Partition Master Home Edition調整Windows 7 的硬碟分割區_教學
--
當OS已安裝好且已運作一些時日了,千萬不要重來一次!!
利用此工具,能將d:縮些容量 讓 C: 槽加大些容量 ;且穩定度很高(不會失敗)

刪除 autorun.inf

參考1
參考2
---
1.先移動到要刪除的槽位
2.打入:rmdir /s autorun.nf
3.確認時按 Yes

DataTable.Select

還是參考官網的會較精妙唷
官網

2011年3月13日 星期日

XML 讀寫

參考1(AP)
參考2(WEB)
參考3(WEB)

DEC加密程序,傳入型

參考來源
--
加密函數:
Public Shared Function Encrypt(ByVal pToEncrypt As String, ByVal sKey As String) As String
Dim des As New DESCryptoServiceProvider()
Dim inputByteArray() As Byte
inputByteArray = Encoding.Default.GetBytes(pToEncrypt)
''建立加密對象的密鑰和偏移量
''原文使用ASCIIEncoding.ASCII方法的GetBytes方法
''使得輸入密碼必須輸入英文文本
des.Key = ASCIIEncoding.ASCII.GetBytes(sKey)
des.IV = ASCIIEncoding.ASCII.GetBytes(sKey)
''寫二進制數組到加密流
''(把內存流中的內容全部寫入)
Dim ms As New System.IO.MemoryStream()
Dim cs As New CryptoStream(ms, des.CreateEncryptor, CryptoStreamMode.Write)
''寫二進制數組到加密流
''(把內存流中的內容全部寫入)
cs.Write(inputByteArray, 0, inputByteArray.Length)
cs.FlushFinalBlock()
''建立輸出字符串
Dim ret As New StringBuilder()
Dim b As Byte
For Each b In ms.ToArray()
ret.AppendFormat("{0:X2}", b)
Next
Return ret.ToString()
End Function
-----------------------------------------------------------------------
解密函數:
Public Shared Function Decrypt(ByVal pToDecrypt As String, ByVal sKey As String) As String
Dim des As New DESCryptoServiceProvider()
''把字符串放入byte數組
Dim len As Integer
len = pToDecrypt.Length / 2 - 1
Dim inputByteArray(len) As Byte
Dim x, i As Integer
For x = 0 To len
i = Convert.ToInt32(pToDecrypt.Substring(x * 2, 2), 16)
inputByteArray(x) = CType(i, Byte)
Next
''建立加密對象的密鑰和偏移量,此值重要,不能修改
des.Key = ASCIIEncoding.ASCII.GetBytes(sKey)
des.IV = ASCIIEncoding.ASCII.GetBytes(sKey)
Dim ms As New System.IO.MemoryStream()
Dim cs As New CryptoStream(ms, des.CreateDecryptor, CryptoStreamMode.Write)
cs.Write(inputByteArray, 0, inputByteArray.Length)
cs.FlushFinalBlock()
Return Encoding.Default.GetString(ms.ToArray)
End Function
-----------------------------------------------
兩個函數中第一個參數是待加密或解密的字符串,sKey是使用的密鑰,必須是8位,使用的時候要注意哦,不然會出錯的。

SecureString 加密字串類別

參考來源
---
Imports System.Security
Imports System.Runtime.InteropServices

Module Module1

Sub Main()
Console.WriteLine("Please enter your password to be encrypted:")

Dim password As SecureString = ReadPassword()

Console.WriteLine()

Console.WriteLine("Decripted password:")

PrintPassword(password)
End Sub


Public Function ReadPassword() As SecureString

Dim password As New SecureString()

Dim nextKey As ConsoleKeyInfo = Console.ReadKey(True)

While nextKey.Key <> ConsoleKey.Enter
If nextKey.Key = ConsoleKey.Backspace Then
If password.Length > 0 Then
password.RemoveAt(password.Length - 1)

' erase the last * as well
Console.Write(nextKey.KeyChar)
Console.Write(" ")
Console.Write(nextKey.KeyChar)
End If
Else
password.AppendChar(nextKey.KeyChar)
Console.Write("*")
End If

nextKey = Console.ReadKey(True)
End While

password.MakeReadOnly()
' make the password read-only.

' return the encrypted password.

Return password

End Function

Public Sub PrintPassword(ByVal password As SecureString)

' Uncrypt the password and get a reference to it...

Dim bstr As IntPtr = Marshal.SecureStringToBSTR(password)


Try
' Printing the uncrypted password...

Console.WriteLine(Marshal.PtrToStringBSTR(bstr))

Finally

Marshal.ZeroFreeBSTR(bstr)

End Try

End Sub

End Module

DES 加密和解密文件,檔案型

Imports System
Imports System.IO
Imports System.Security
Imports System.Security.Cryptography
Imports System.Text

Module Encrypt
Private Const sSecretKey As String = "password"

Public Sub Main()
EncryptFile("c:\temp\test.txt", _
"c:\temp\Encrypted.txt", _
sSecretKey)
DecryptFile("c:\temp\Encrypted.txt", _
"c:\temp\Decrypted.txt", _
sSecretKey)
End Sub

Sub EncryptFile(ByVal sInputFilename As String, _
ByVal sOutputFilename As String, _
ByVal sKey As String)

Dim fsInput As New FileStream(sInputFilename, _
FileMode.Open, FileAccess.Read)
Dim fsEncrypted As New FileStream(sOutputFilename, _
FileMode.Create, FileAccess.Write)

Dim DES As New DESCryptoServiceProvider()

'為DES算法設置安全碼.
'必須是64位,8個字節
DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey)


DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey)

'創建DES加密碼實例
Dim desencrypt As ICryptoTransform = DES.CreateEncryptor()
'
Dim cryptostream As New CryptoStream(fsEncrypted, _
desencrypt, _
CryptoStreamMode.Write)

'讀取文件到數組
Dim bytearrayinput(fsInput.Length - 1) As Byte
fsInput.Read(bytearrayinput, 0, bytearrayinput.Length)
'寫到加密文件中
cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length)
cryptostream.Close()
End Sub

Sub DecryptFile(ByVal sInputFilename As String, _
ByVal sOutputFilename As String, _
ByVal sKey As String)

Dim DES As New DESCryptoServiceProvider()
DES.Key() = ASCIIEncoding.ASCII.GetBytes(sKey)
DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey)

'讀取加密文件
Dim fsread As New FileStream(sInputFilename, FileMode.Open, FileAccess.Read)
'
Dim desdecrypt As ICryptoTransform = DES.CreateDecryptor()
'
Dim cryptostreamDecr As New CryptoStream(fsread, desdecrypt, CryptoStreamMode.Read)
'輸出到解密文件
Dim fsDecrypted As New StreamWriter(sOutputFilename)
fsDecrypted.Write(New StreamReader(cryptostreamDecr).ReadToEnd)
fsDecrypted.Flush()
fsDecrypted.Close()
End Sub
End Module

編碼方式

參考來源
-----
透過 Encoding 類別
命名空間為(System.TextSystem.Object)
System.Text.Encoding()
System.Text.ASCIIEncoding()
System.Text.UnicodeEncoding()
System.Text.UTF7Encoding()
System.Text.UTF8Encoding()

Sample :

Dim strContent As String

strContent = "超人德" ' 欲轉換之字串

Dim strBytes() As Byte ' 宣告位元陣列

' 使用 Encoding(類別)
' Default 為取得系統目前 ANSI 字碼頁的編碼方式。
' GetBytes 將指定 String 或字元陣列編碼成位元組陣列。
strBytes = Encoding.Default.GetBytes(strContent) ' 將其轉成位元陣列

' Encoding.GetString 方法 : 將指定的位元組陣列解碼成字串。

' 取得 UTF-8 格式的編碼方式。
MessageBox.Show(Encoding.UTF8.GetString(strBytes)) ' 編碼成 UTF8

' 以 Little-Endian 位元組順序取得 Unicode 格式的編碼方式。
MessageBox.Show(Encoding.Unicode.GetString(strBytes)) ' 編碼成 Unicode

' 取得 ASCII (7 位元) 字元集 (Character Set) 的編碼方式。
MessageBox.Show(Encoding.ASCII.GetString(strBytes)) ' 編碼成 ASCII

' 取得系統目前 ANSI 字碼頁的編碼方式。
MessageBox.Show(Encoding.Default.GetString(strBytes)) ' 編碼成預設

' Encoding.GetEncoding(方法) : 傳回指定字碼頁值或名稱的(Encoding)
' 950 為 CodePage , 也可使用 "Big5"
MessageBox.Show(Encoding.GetEncoding(950).GetString(strBytes)) ' 編碼成 Big5

' 以下介紹幾個常見的 CodePage 對照 :
' 0 為 default to ANSI code page
' 1 為 default to OEM code page
' 2 為 MAC code page
' 3 為 THREAD ANSI code page
' 42 為 SYMBOL
' 1201 為 "unicodeFFFE" "Unicode (Big-Endian)"
' 1258 為 "windows-1258" "越南文 (Windows)"
' 50000 為 "x-user-defined" "使用者定義"
' 50001 為 "_autodetect_all" "自動選取"
' 50220 為 "iso-2022-jp" "日文 (JIS)"
' 50225 為 "iso-2022-kr" "韓文 (ISO)"
' 50932 為 "_autodetect" "日文 (自動選取)"
' 50949 為 "_autodetect_kr" "韓文 (自動選取)"
' 51932 為 "euc-jp" "日文 (EUC)"
' 51949 為 "euc-kr" "韓文 (EUC)"
' 52936 為 "hz-gb-2312" "簡體中文 (HZ)"
' 65000 為 "utf-7" "Unicode (UTF-7)"
' 65001 為 "utf-8" "Unicode (UTF-8)"
' 874 為 "windows-874" "泰文 (Windows)"
' 932 為 "iso-2022-jp" "日文 (Shift-JIS)"
' 936 為 "gb2312" "簡體中文 (GB2312)"
' 949 為 "euc-kr" "韓文"
' 950 為 "big5" "繁體中文 (Big5)"

索引鍵的大小上限

ACCESS在轉拋匯入MS-SQL 2008 R2/Express 資料庫時
發現:
1.索引鍵資料行的大小上限小於 900 個位元組
2.另一個char允許下(MAX),最大為2GB
---
官方詳細說明

2011年3月10日 星期四

LINQPad 工具

LINQPad
---
用過的,都說:讚!!

多線程處理事件

本範例,來自CSDN的詢問;我稍調整
---
---
Imports System.Threading
Public Class Form1
Dim N, m As Integer
Dim P As String

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
ListView1.View = View.Details
ListView1.Columns.Add("狀態")
ListView1.Columns.Add("路徑")
ListView1.Items.Add("未處理")
ListView1.Items.Add("未處理")
ListView1.Items.Add("未處理")
ListView1.Items(0).SubItems.Add("C:\a.jpg")
ListView1.Items(1).SubItems.Add("C:\b.jpg")
ListView1.Items(2).SubItems.Add("C:\c.jpg")


End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
m = ListView1.Items.Count

Dim td As Thread = Nothing
td = New Thread(New ThreadStart(AddressOf do_work))
td.Start()

End Sub

Delegate Sub addInvo(ByVal i As Integer)

Dim td1() As Thread
Sub do_work()
ReDim td1(m - 1)
For i = 0 To m - 1

td1(i) = New Thread(New ParameterizedThreadStart(AddressOf R_LV))
td1(i).Start(i)
Next
End Sub

Sub R_LV(ByVal i As Integer)
If ListView1.InvokeRequired = False Then
If ListView1.Items(i).SubItems(0).Text = "未處理" Then
P = ListView1.Items(i).SubItems(1).Text

'處理事件
If i >= 0 Then
ListView1.Items(i).SubItems(0).Text = "已完成"
MsgBox(P)
End If

ElseIf ListView1.Items(i).SubItems(0).Text = "已完成" Then

End If
Else
Dim del As New addInvo(AddressOf R_LV)
ListView1.BeginInvoke(del, New Object() {i})
End If
End Sub
End Class

linq 自訂 sqlconnect string

參考
--
try

{

string connectionString = @"Data Source=server_name;database=database_name;Integrated Security=True;";

using (SqlConnection connection = new SqlConnection(connectionString))

{

connection.Open();

Mydb db = new Mydb(connection);

var q = from c in db.Customers

where c.CustomerID.StartsWith("A")

select new { c.CustomerID, c.Phone };



foreach(var c in q)

Debug.WriteLine(c);

}

}

catch (Exception ex)

{

MessageBox.Show(ex.Message);

}

2011年3月8日 星期二

搞懂 Pool 和實驗

參考一樣困擾的地方:
1.ADO.NET的Connection Pool

2.透過 .Net default Connection Pooling 機制存取 DB

----
以上都是單 thread 方式的觀點
若採用 thread , 這真是亂七八糟的說法 !
Pooling = true

2011年3月7日 星期一

常用網路指令集~

如果你玩過路由器的話,就知道路由器裏面那些很好玩的命令縮寫。
  
  例如,"sh int" 的意思是 "show interface"。
  
  現在 Windows 2000 也有了類似界面的工具,叫做 netsh。
  
  我們在 Windows 2000 的 cmd shell 下,輸入 netsh
  就出來:netsh> 提示符,
  輸入 int ip 就顯示:
  interface ip>
  
  然後輸入 dump ,我們就可以看到當前系統的網路配置:
  
  # ----------------------------------
  
  # Interface IP Configuration
  
  # ----------------------------------
  
  pushd interface ip
  
  # Interface IP Configuration for "Local Area Connection"
  
  set address name = "Local Area Connection" source = static addr = 192.168.1.168
  mask = 255.255.255.0
  add address name = "Local Area Connection" addr = 192.1.1.111 mask = 255.255.255.0
  set address name = "Local Area Connection" gateway = 192.168.1.100 gwmetric = 1
  set dns name = "Local Area Connection" source = static addr = 202.96.209.5
  set wins name = "Local Area Connection" source = static addr = none
  
  popd
  # End of interface IP configuration
  
  上面介紹的是通過交互方式操作的一種辦法。
  我們可以直接輸入命令:
  "netsh interface ip add address "Local Area Connection" 10.0.0.2 255.0.0.0"
  來添加 IP 地址。
  
  如果不知道語法,不要緊的哦!
  在提示符下,輸入 ? 就可以找到答案了。方便不方便啊?
  原來微軟的東西裏面,也有那麼一些讓人喜歡的玩意兒。可惜,之至者甚少啊!
  
  網路命令行程式
  這部分包括:
  
  使用 ipconfig /all 查看配置
  使用 ipconfig /renew 刷新配置
  使用 ipconfig 管理 DNS 和 DHCP 類別 ID
  使用 Ping 測試連接
  使用 Arp 解決硬體地址問題
  使用 nbtstat 解決 NetBIOS 名稱問題
  使用 netstat 顯示連接統計
  使用 tracert 跟蹤網路連接
  使用 pathping 測試路由器
  使用 ipconfig /all 查看配置
  發現和解決 TCP/IP 網路問題時,先檢查出現問題的電腦上的 TCP/IP 配置。可以使用 ipconfig 命令獲得主機配置資訊,包括 IP 地址、子網掩碼和默認網關。
  
  注意
  對於 Windows 95 和 Windows 98 的客戶機,請使用 winipcfg 命令而不是 ipconfig 命令。
  使用帶 /all 選項的 ipconfig 命令時,將給出所有介面的詳細配置報告,包括任何已配置的串列端口。  使用 ipconfig /all,可以將命令輸出重定向到某個文件,並將輸出粘貼到其他文檔中。也可以用該輸出確認網路上每台電腦的 TCP/IP 配置,或者進一步調查 TCP/IP 網路問題。
  
  例如,如果電腦配置的 IP 地址與現有的 IP 地址重復,則子網掩碼顯示為 0.0.0.0。
  
  下面的範例是 ipconfig /all 命令輸出,該電腦配置成使用 DHCP 伺服器動態配置TCP/IP,並使用WINS 和 DNS 伺服器解析名稱。
  
  Windows 2000 IP Configuration
  
  Node Type.. . . . . . . . : Hybrid
  IP Routing Enabled.. . . . : No
  WINS Proxy Enabled.. . . . : No
  
  Ethernet adapter Local Area Connection:
  
  Host Name.. . . . . . . . : corp1.microsoft.com
  DNS Servers . . . . . . . : 10.1.0.200
  Description. . . . . . . : 3Com 3C90x Ethernet Adapter
  Physical Address. . . . . : 00-60-08-3E-46-07
  DHCP Enabled.. . . . . . . : Yes
  Autoconfiguration Enabled.: Yes
  IP Address. . . . . . . . . : 192.168.0.112
  Subnet Mask. . . . . . . . : 255.255.0.0
  Default Gateway. . . . . . : 192.168.0.1
  DHCP Server. . . . . . . . : 10.1.0.50
  Primary WINS Server. . . . : 10.1.0.101
  Secondary WINS Server. . . : 10.1.0.102
  Lease Obtained.. . . . . . : Wednesday, September 02, 1998 10:32:13 AM
  Lease Expires.. . . . . . : Friday, September 18, 1998 10:32:13 AM
  
  如果 TCP/IP 配置沒有問題,下一步測試能夠連接到 TCP/IP 網路上的其他主機。
  
  使用 ipconfig /renew 刷新配置
  解決 TCP/IP 網路問題時,先檢查遇到問題的電腦上的 TCP/IP 配置。如果電腦啟用 DHCP 並使用 DHCP 伺服器獲得配置,請使用 ipconfig /renew 命令開始刷新租約。
  
  使用 ipconfig /renew 時,使用 DHCP 的電腦上的所有網卡(除了那些手動配置的適配器)都儘量連接到DHCP 伺服器,更新現有配置或者獲得新配置。
  
  也可以使用帶 /release 選項的 ipconfig 命令立即釋放主機的當前 DHCP 配置。有關 DHCP 和租用過程的詳細資訊,請參閱客戶機如何獲得配置。
  
  注意
  對於啟用 DHCP 的 Windows 95 和 Windows 98 客戶,請使用 winipcfg 命令的 release 和 renew 選項,而不是 ipconfig /release 和 ipconfig /renew 命令,手動釋放或更新客戶的 IP 配置租約。
  使用 ipconfig 管理 DNS 和 DHCP 類別 ID
  也可以使用 ipconfig 命令:
  
  顯示或重置 DNS 緩存。
  詳細資訊,請參閱使用 ipconfig 查看或重置客戶解析程式緩存。
  
  刷新已註冊的 DNS 名稱。
  詳細資訊,請參閱使用 ipconfig 更新 DNS 客戶註冊。
  
  顯示適配器的 DHCP 類別 ID。
  詳細資訊,請參閱顯示客戶機上的 DHCP 類別 ID 資訊。
  
  設置適配器的 DHCP 類別 ID。
  詳細資訊,請參閱設置客戶機上的 DHCP 類別 ID 資訊。
  
  使用 Ping 測試連接
  Ping 命令有助於驗證 IP 級的連通性。發現和解決問題時,可以使用 Ping 向目標主機名或 IP 地址發送 ICMP 回應請求。需要驗證主機能否連接到 TCP/IP 網路和網路資源時,請使用 Ping。也可以使用 Ping 隔離網路硬體問題和不相容配置。
  
  通常最好先用 Ping 命令驗證本地電腦和網路主機之間的路由是否存在,以及要連接的網路主機的 IP 地址。Ping 目標主機的IP 地址看它是否響應,如下:
  
  ping IP_address
  使用 Ping 時應該執行以下步驟:
  
  Ping 環回地址驗證是否在本地電腦上安裝 TCP/IP 以及配置是否正確。
  ping 127.0.0.1
  
  Ping 本地電腦的 IP 地址驗證是否正確地添加到網路。
  ping IP_address_of_local_host
  
  Ping 默認網關的 IP 地址驗證默認網關是否運行以及能否與本地網路上的本地主機通訊。
  ping IP_address_of_default_gateway
  
  Ping 遠程主機的 IP 地址驗證能否通過路由器通訊。
  ping IP_address_of_remote_host
  
  Ping 命令用 Windows 套接字樣式的名稱解析將電腦名解析成 IP 地址,所以如果用地址成功,但是用名稱 Ping 失敗,則問題出在地址或名稱解析上,而不是網路連通性的問題。詳細資訊,請參閱使用 Arp 解決硬體地址問題。
  
  如果在任何點上都無法成功地使用 Ping,請確認:
  
  安裝和配置 TCP/IP 之後重新啟動電腦。
  “Internet 協議 (TCP/IP) 屬性”對話方塊“常規”選項卡上的本地電腦的 IP 地址有效而且正確。
  啟用 IP 路由,並且路由器之間的鏈路是可用的。
  您可以使用 Ping 命令的不同選項來指定要使用的數據包大小、要發送多少數據包、是否記錄用過的路由、要使用的生存時間 (TTL) 值以及是否設置“不分段”標誌。可以鍵入 ping -? 查看這些選項。



例說明如何向 IP 地址 172.16.48.10 發送兩個 Ping,每個都是 1,450 字節:
  
  C:\>ping -n 2 -l 1450 172.16.48.10
  Pinging 172.16.48.10 with 1450 bytes of data:
  
  Reply from 172.16.48.10:bytes=1450 time<10ms TTL=32   Reply from 172.16.48.10:bytes=1450 time<10ms TTL=32      Ping statistics for 157.59.8.1:   Packets:Sent = 2, Received = 2, Lost = 0 (0% loss),   Approximate roundtrip times in milli-seconds:   Minimum = 0ms, Maximum = 10ms, Average = 2ms   默認情況下,在顯示“請求超時”之前,Ping 等待 1,000 毫秒(1 秒)的時間讓每個響應返回。如果通過 Ping 探測的遠程系統經過長時間延遲的鏈路,如衛星鏈路,則響應可能會花更長的時間才能返回。可以使用 -w (等待)選項指定更長時間的超時。      使用 Arp 解決硬體地址問題   “地址解析協議 (ARP)”允許主機搜尋同一物理網路上的主機的媒體訪問控制地址,如果給出後者的 IP 地址。為使 ARP 更加有效,每個電腦緩存 IP 到媒體訪問控制地址映射消除重復的 ARP 廣播請求。      可以使用 arp 命令查看和修改本地電腦上的 ARP 表項。arp 命令對於查看 ARP 緩存和解決地址解析問題非常有用。      詳細資訊,請參閱查看“地址解析協議 (ARP)”緩存和添加靜態 ARP 緩存項目。      使用 nbtstat 解決 NetBIOS 名稱問題   TCP/IP 上的 NetBIOS (NetBT) 將 NetBIOS 名稱解析成 IP 地址。TCP/IP 為 NetBIOS 名稱解析提供了很多選項,包括本地緩存搜索、WINS 伺服器查詢、廣播、DNS 伺服器查詢以及 Lmhosts 和主機文件搜索。   Nbtstat 是解決 NetBIOS 名稱解析問題的有用工具。可以使用nbtstat 命令刪除或更正預載入的項目:      nbtstat -n 顯示由伺服器或重定向器之類的程式在系統上本地註冊的名稱。   nbtstat -c 顯示 NetBIOS 名稱緩存,包含其他電腦的名稱對地址映射。   nbtstat -R 清除名稱緩存,然後從 Lmhosts 文件重新載入。   nbtstat -RR 釋放在 WINS 伺服器上註冊的 NetBIOS 名稱,然後刷新它們的註冊。   nbtstat -a name 對 name 指定的電腦執行 NetBIOS 適配器狀態命令。適配器狀態命令將返回電腦的本地 NetBIOS 名稱表,以及適配器的媒體訪問控制地址。   nbtstat -S 列出當前的 NetBIOS 會話及其狀態(包括統計),如下例所示:   NetBIOS connection table      Local name State In/out Remote Host Input Output   ------------------------------------------------------------------   CORP1 <00> Connected Out CORPSUP1<20> 6MB 5MB
  CORP1 <00> Connected Out CORPPRINT<20> 108KB 116KB
  CORP1 <00> Connected Out CORPSRC1<20> 299KB 19KB
  CORP1 <00> Connected Out CORPEMAIL1<20> 324KB 19KB
  CORP1 <03> Listening
  使用 netstat 顯示連接統計
  可以使用 netstat 命令顯示協議統計資訊和當前的 TCP/IP 連接。netstat -a 命令將顯示所有連接,而 netstat -r 顯示路由表和活動連接。netstat -e 命令將顯示Ethernet 統計資訊,而 netstat -s 顯示每個協議的統計資訊。如果使用 netstat -n,則不能將地址和端口號轉換成名稱。下面是 netstat 的輸出示例:
  
  C:\>netstat -e
  Interface Statistics
  
  Received Sent
  Bytes 3995837940 47224622
  Unicast packets 120099 131015
  Non-unicast packets 7579544 3823
  Discards 0 0
  Errors 0 0
  Unknown protocols 363054211
  
  C:\>netstat -a
  
  Active Connections
  
  Proto Local Address Foreign Address State
  TCP CORP1:1572 172.16.48.10:nbsession ESTABLISHED
  TCP CORP1:1589 172.16.48.10:nbsession ESTABLISHED
  TCP CORP1:1606 172.16.105.245:nbsession ESTABLISHED
  TCP CORP1:1632 172.16.48.213:nbsession ESTABLISHED
  TCP CORP1:1659 172.16.48.169:nbsession ESTABLISHED
  TCP CORP1:1714 172.16.48.203:nbsession ESTABLISHED
  TCP CORP1:1719 172.16.48.36:nbsession ESTABLISHED
  TCP CORP1:1241 172.16.48.101:nbsession ESTABLISHED
  UDP CORP1:1025 *:*
  UDP CORP1:snmp *:*
  UDP CORP1:nbname *:*
  UDP CORP1:nbdatagram *:*
  UDP CORP1:nbname *:*
  UDP CORP1:nbdatagram *:*
  
  C:\>netstat -s
  IP Statistics
  
  Packets Received = 5378528
  Received Header Errors = 738854
  Received Address Errors = 23150
  Datagrams Forwarded = 0
  Unknown Protocols Received = 0
  Received Packets Discarded = 0
  Received Packets Delivered = 4616524
  Output Requests = 132702
  Routing Discards = 157
  Discarded Output Packets = 0
  Output Packet No Route = 0
  Reassembly Required = 0
  Reassembly Successful = 0
  Reassembly Failures =
  Datagrams Successfully Fragmented = 0
  Datagrams Failing Fragmentation = 0
  Fragments Created = 0
  
  ICMP Statistics
  Received Sent
  Messages 693 4
  Errors 0 0
  Destination Unreachable 685 0
  Time Exceeded 0 0
  Parameter Problems 0 0
  Source Quenches 0 0
  Redirects 0 0
  Echoes 4 0
  Echo Replies 0 4
  Timestamps 0 0
  Timestamp Replies 0 0
  Address Masks 0 0
  Address Mask Replies 0 0
  
  TCP Statistics
  
  Active Opens = 597
  Passive Opens = 135
  Failed Connection Attempts = 107
  Reset Connections = 91
  Current Connections = 8
  Segments Received = 106770
  Segments Sent = 118431
  Segments Retransmitted = 461
  
  UDP Statistics
  
  Datagrams Received = 4157136
  No Ports = 351928
  Receive Errors = 2
  Datagrams Sent = 13809


使用 tracert 跟蹤網路連接
  Tracert(跟蹤路由)是路由跟蹤實用程式,用於確定 IP 數據報訪問目標所採取的路徑。Tracert 命令用 IP 生存時間 (TTL) 字段和 ICMP 錯誤消息來確定從一個主機到網路上其他主機的路由。
  
  Tracert 工作原理
  通過向目標發送不同 IP 生存時間 (TTL) 值的“Internet 控制消息協議 (ICMP)”回應數據包,    Tracert 診斷程式確定到目標所採取的路由。要求路徑上的每個路由器在轉發數據包之前至少將數據包上的 TTL 遞減 1。數據包上的 TTL 減為 0 時,路由器應該將“ICMP 已超時”的消息發回源系統。
  
  Tracert 先發送 TTL 為 1 的回應數據包,並在隨後的每次發送過程將 TTL 遞增 1,直到目標響應或 TTL 達到最大值,從而確定路由。通過檢查中間路由器發回的“ICMP 已超時”的消息確定路由。某些路由器不經詢問直接丟棄 TTL 過期的數據包,這在Tracert 實用程式中看不到。
  
  Tracert 命令按順序列印出返回“ICMP 已超時”消息的路徑中的近端路由器介面列表。如果使用 -d 選項,則 Tracert 實用程式不在每個 IP 地址上查詢 DNS。
  
  在下例中,數據包必須通過兩個路由器(10.0.0.1 和 192.168.0.1)才能到達主機172.16.0.99。主機的默認網關是 10.0.0.1,192.168.0.0 網路上的路由器的 IP地址是 192.168.0.1。
  
  C:\>tracert 172.16.0.99 -d
  Tracing route to 172.16.0.99 over a maximum of 30 hops
  1 2s 3s 2s 10,0.0,1
  2 75 ms 83 ms 88 ms 192.168.0.1
  3 73 ms 79 ms 93 ms 172.16.0.99
  Trace complete.
  用 tracert 解決問題
  可以使用 tracert 命令確定數據包在網路上的停止位置。下例中,默認網關確定 192.168.10.99 主機沒有有效路徑。這可能是路由器配置的問題,或者是 192.168.10.0 網路不存在(錯誤的 IP 地址)。
  
  C:\>tracert 192.168.10.99
  
  Tracing route to 192.168.10.99 over a maximum of 30 hops
  
  1 10.0.0.1 reportsestination net unreachable.
  
  Trace complete.
  
  Tracert 實用程式對於解決大網路問題非常有用,此時可以採取幾條路徑到達同一個點。
  
  Tracert 命令行選項
  Tracert 命令支援多種選項,如下表所示。
  
  tracert [-d] [-h maximum_hops] [-j host-list] [-w timeout] target_name
  
  選項 描述
  -d 指定不將 IP 地址解析到主機名稱。
  -h maximum_hops 指定躍點數以跟蹤到稱為 target_name 的主機的路由。
  -j host-list 指定 Tracert 實用程式數據包所採用路徑中的路由器介面列表。
  -w timeout 等待 timeout 為每次回復所指定的毫秒數。
  target_name 目標主機的名稱或 IP地址。
  
  詳細資訊,請參閱使用 tracert 命令跟蹤路徑。
  
  使用 pathping 測試路由器
  pathping 命令是一個路由跟蹤工具,它將 ping 和 tracert 命令的功能和這兩個工具所不提供的其他資訊結合起來。pathping 命令在一段時間內將數據包發送到到達最終目標的路徑上的每個路由器,然後基於數據包的電腦結果從每個躍點返回。由於命令顯示數據包在任何給定路由器或鏈結上丟失的程度,因此可以很容易地確定可能導致網路問題的路由器或鏈結。某些選項是可用的,如下表所示。
  
  選項 名稱 功能
  -n Hostnames 不將地址解析成主機名。
  -h Maximum hops 搜索目標的最大躍點數。
  -g Host-list 沿著路由列表釋放源路由。
  -p Period 在 ping 之間等待的毫秒數。
  -q Num_queries 每個躍點的查詢數。
  -w Time-out 為每次回復所等待的毫秒數。
  -T Layer 2 tag 將第 2 層優先級標記(例如,對於 IEEE 802.1p)連接到數據包並將它發送到路徑中的每個]網路設備。這有助於標識沒有正確配置第 2 層優先級的網路設備。-T 開關用於測試服務品質 (QoS) 連通性。
  -R RSVP isbase Che檢查以確定路徑中的每個路由器是否支援“資源保留協議 (RSVP)”,此協議允許主機為數據流保留一定量的帶寬。 -R 開關用於測試服務品質 (QoS) 連通性。
  
  默認的躍點數是 30,並且超時前的默認等待時間是 3 秒。默認時間是 250 毫秒,並且沿著路徑對每個路由器進行查詢的次數是 100。
  
  以下是典型的 pathping 報告。躍點列表後所編輯的統計資訊表明在每個獨立路由器上數據包丟失的情況。
  
  D:\>pathping -n msw
  
  Tracing route to msw [7.54.1.196]
  over a maximum of 30 hops:
  0 172.16.87.35
  1 172.16.87.218
  2 192.68.52.1
  3 192.68.80.1
  4 7.54.247.14
  5 7.54.1.196
  
  Computing statistics for 125 seconds...
  Source to Here This Node/Link
  Hop RTT Lost/Sent = Pct Lost/Sent = Pct Address
  0 172.16.87.35
  0/ 100 = 0% |
  1 41ms 0/ 100 = 0% 0/ 100 = 0% 172.16.87.21813/ 100 = 13% |
  2 22ms 16/ 100 = 16% 3/ 100 = 3% 192.68.52.10/ 100 = 0% |
  3 24ms 13/ 100 = 13% 0/ 100 = 0% 192.68.80.1 0/ 100 = 0% |
  4 21ms 14/ 100 = 14% 1/ 100 = 1% 10.54.247.14 0/ 100 = 0% |
  5 24ms 13/ 100 = 13% 0/ 100 = 0% 10.54.1.196
  
  Trace complete.
  當運行 pathping 時,在測試問題時首先查看路由的結果。此路徑與 tracert 命令所顯示的路徑相同。然後 pathping 命令對下一個 125 毫秒顯示忙消息(此時間根據躍點計數變化)。在此期間,pathping 從以前列出的所有路由器和它們之間的鏈結之間收集資訊。在此期間結束時,它顯示測試結果。
  
  最右邊的兩欄 This Node/Link Lost/Sent=Pct 和 Address 包含的資訊最有用。172.16.87.218(躍點 1)和 192.68.52.1(躍點 2)丟失 13% 的數據包。 所有其他鏈結工作正常。在躍點 2 和 4 中的路由器也丟失尋址到它們的數據包(如 This Node /Link 欄中所示),但是該丟失不會影響轉發的路徑。
  
  對鏈結顯示的丟失率(在最右邊的欄中標記為 |)表明沿路徑轉發丟失的數據包。該丟失表明鏈結阻塞。對路由器顯示的丟失率(通過最右邊欄中的 IP 地址顯示)表明這些路由器的 CPU 可能超負荷運行。這些阻塞的路由器可能也是端對端問題的一個因素,尤其是在軟體路由器轉發數據包時。

asp中的rs.open於conn.execute的區別

rs.open sql,conn:如果sql是delete,update,insert則會返回一個關閉的記錄集,在使用過程中不要來個rs.close在文件最後再寫rs.close
中間可以來多個記錄集rs1.open sql1,conn,最後一塊關閉記錄集:rs.close rs1.close
conn.execute(sql) 如果sql是delete,update,insert則會返回一個關閉的記錄集,在使用過程中不要來個rs.close在文件最後再寫rs.close
中間可以來多個記錄集rs1.open sql1,conn,最後一塊關閉記錄集:rs.close rs1.close.
如果sql是update,insert,delete則應該使用conn.execute(sql)也可以不要括號conn.execute sql
如果sql是select語句則應該使用set rs=conn.execute(sql)括號一定要,不能省略:這是因為vbscript的特性,帶返回值
的調用必須加括號,不帶返回值的調用可以不要括號。


注意:不管是rs.open sql,conn還是conn.execute(sql) [這裡的SQL是delete,update,insert]執行以後都會返回一個關閉的記錄集
也就是說如果sql是插入,更新,刪除語句,那麼set rs=conn.execute(sql)中的RS就沒什麼意義。



1.conn.execute
sql="select * from admin where username='xiaozhu'"
set rs=conn.execute(sql)
執行完以後自動關閉記錄集
最後只需要關閉連接就可以了
conn.close
set conn=nothing


2.rs.open
set rs=server.createobject("adodb.recordset")
sql="select * from admin where username='xiaozhu'"
rs.open sql,conn,1,1
可以自己設定一些參數,即鎖定和游標的移動方式
最後要關閉記錄集和連接
rs.close
set rs=nothing
conn.close
set conn=nothing


3.command.execute
sql="select * from admin where username='xiaozhu'"
set rs=command.execute(sql)

*****************************************************************************
1.
set rs=conn.execute("如果是select語句") 得到的rs.recordcount=-1
rs.open sql,conn("sql為select語句") 得到的rs.recordcount為正常的記錄數

2.
rs.open是打開數據庫 conn.execute 是執行SQL指令
set rs=conn.execute(insert,update,delete)返回一個關閉了的記錄集
set rs=conn.execute(select)返回一個沒有關閉的記錄集

3.
CONN.EXECUTE(SQL,RowsAffected,C)
參數含義:
SQL的值可以是SQL語句、表名、存儲過程名,也可以是數據提供者所能接受的任意字符串。為了提高性能,最好為C參數指定合適的值
可選參數RowsAffected將返回INSERT、UPDATE或DELETE查詢執行以後所影響的數目。這些查詢會返回一個關閉的Recordset對象。
一個SELECT查詢將返回RowsAffected值為-1並且返回帶有一行或多行內容的打開的Recordset。
4.

conn.execute sql適合於不需返回recordset對像時使用,比如下面的代碼:
sql="delete from enews where id="&cstr(id)
conn.execute sql

如果需要返回recordset對象,則使用如下代碼:
sql="select from enews where id="&cstr(id)
set rs = conn.execute(sql)

如果去掉execute(sql)這兒的括號(即為set rs = conn.execute sql),就會提示「語句未結束」這樣的錯誤提示,我翻看了一下語法格式,發現有二種格式,詳解如下:
格式一:Connection對像名.Execute(SQL指令).
格式二:Connection對像名.Execute(數據表名)。

IsNull 和 SQL 中 CASE WHEN 用法

參考來源
----
本篇SQL真是高招,值得收藏!!
----
select count(*) as ct , CASE
WHEN (Pro_state= 1) THEN '待審'
WHEN (Pro_state= 2) THEN '已審'
WHEN (Pro_state= 3) THEN '辦理中'
WHEN (Pro_state= 4) THEN '已申退'
WHEN (Pro_state= 5) THEN '來信'
WHEN (Pro_state= 6) THEN '辦理完成'
WHEN (Pro_state= 7) THEN '未予立案'
end as pro_state
from vw_proposals_query where 1=1 GROUP BY pro_state

結果:
ct pro-state
30 辦理中
7 來信
1 辦理完成
5 未予立案

解讀:
查詢總數和pro_state 當 Pro_state= 1 時以 '待審' 替代表示
當 Pro_state= 2 時以 '已審' 替代表示
當 Pro_state= 3 時以 '辦理中' 替代表示

5、CASE 可能是 SQL 中被誤用最多的關鍵字之一。雖然你可能以前用過這個關鍵字來創建字段,但是它還具有更多用法。例如,你可以在 WHERE 子句中使用 CASE。

首先讓我們看一下 CASE 的語法。在一般的 SELECT 中,其語法如下:

SELECT {myColumnSpec} =
CASE
WHEN {A} THEN {somethingA}
WHEN {B} THEN {somethingB}
ELSE {somethingE}
END

在上面的代碼中需要用具體的參數代替尖括號中的內容。下面是一個簡單的例子:

USE pubs
GO
SELECT
Title,
'Price Range' =
CASE
WHEN price IS NULL THEN 'Unpriced'
WHEN price < 10 THEN 'Bargain'
WHEN price BETWEEN 10 and 20 THEN 'Average'
ELSE 'Gift to impress relatives'
END
FROM titles
ORDER BY price
GO

這是 CASE 的典型用法,但是使用 CASE 其實可以做更多的事情。比方說下面的 GROUP BY 子句中的 CASE:

SELECT 'Number of Titles', Count(*)
FROM titles
GROUP BY
CASE
WHEN price IS NULL THEN 'Unpriced'
WHEN price < 10 THEN 'Bargain'
WHEN price BETWEEN 10 and 20 THEN 'Average'
ELSE 'Gift to impress relatives'
END
GO

你甚至還可以組合這些選項,添加一個 ORDER BY 子句,如下所示:

USE pubs
GO
SELECT
CASE
WHEN price IS NULL THEN 'Unpriced'
WHEN price < 10 THEN 'Bargain'
WHEN price BETWEEN 10 and 20 THEN 'Average'
ELSE 'Gift to impress relatives'
END AS Range,
Title
FROM titles
GROUP BY
CASE
WHEN price IS NULL THEN 'Unpriced'
WHEN price < 10 THEN 'Bargain'
WHEN price BETWEEN 10 and 20 THEN 'Average'
ELSE 'Gift to impress relatives'
END ,
Title
ORDER BY
CASE
WHEN price IS NULL THEN 'Unpriced'
WHEN price < 10 THEN 'Bargain'
WHEN price BETWEEN 10 and 20 THEN 'Average'
ELSE 'Gift to impress relatives'
END ,
Title
GO

注意,為了在 GROUP BY 塊中使用 CASE,查詢語句需要在 GROUP BY 塊中重複 SELECT 塊中的 CASE 塊。

除了選擇自定義字段之外,在很多情況下 CASE 都非常有用。再深入一步,你還可以得到你以前認為不可能得到的分組排序結果集。

2011年3月6日 星期日

租書雲端式服務

池龍工作室今年度將預計:開發雲端式服務(屬加值性)
依現今資訊驅勢,傳統式服務和單純式的到店租還預約..等;很難再提升店之營業額
將前瞻性主導:漫畫/DVD/童書 雲端服務,統一在伺服器運作
已有部分少數幾間店,都已另請人撰寫網站並租書資料將所需資料拋轉出去並利用
這樣很不錯且能自掌特色和運作方向
----
傳統式如何邁入雲端化:
1.要勇敢踏出第1步,將資料拋到伺服器(信任度)
2.慢慢習慣有伺服器,非伺服器不可(依賴性);當伺服器維護或故障,店一樣能經營
3.讓伺服器來統一規劃網路的資源和運作(期間功能,歡迎建議增設)
4.在店推廣告知會員,本店已有網路服務和項目和功能性
5.資料必須定時(天/時)拋到伺服器(店網路的穩定度)
----
底下為我的初期規劃項目
-----------------------------------
功能:
1.支援匯入/匯出/列印/拋轉等
2.支援 web 2.0
初期:
1.網路店的功能配置開關/簡介/照片/版面設定
2.會員租/還/個人資訊等查詢
3.店內所有書查詢/新書/書狀況(已租/在店)/預約
4.買賣頻道(公用頻道)
5.跨分店會員資料交換機制
-----------------------------------
歡迎有意願加入雲端行列店家,可以留言給我;針對:
1.加值費用1年:7200元(平均1天20元的加值費)
2.功能面建議
3.最想怎作
等等,提供您寶貴的經驗和想法
讓我統籌一些時間後,將匯總決定是否開發
意願店數過低,我也不大可能花那麼多時間開發
這一但確定開發,就注定要永久持續了

輕強的 Notepad++

Notepad++ 是在微軟視窗環境之下的一個免費的代碼編輯器。
為了產生小巧且有效率的代碼編輯器,這個在GPL許可證下的自由軟體開發專案採用 win32 api 和 STL 以 C++ 程式語言撰寫成,並且選用功能強大的編輯模組 Scintilla。多虧它的輕巧與執行效率,Notepad++ 可完美地取代微軟視窗的記事本。

Notepad++ 官網

2011年3月4日 星期五

htmlcodes

htmlcodes

--
很文整的相關code對照表,還有:
ASCII Codes | HTML Codes | Conversion | References |
Control Characters | URL Encoding | URL Decoding

2011年3月3日 星期四

Access 教學講義

Access 教學講義

開啟文字檔使用檔案系統物件(FileSystemObject)

'需要一個Command Button
Private Sub Command1_Click()

Dim objFile As Object
OpenFile objFile, "C:\123.txt", False, False
'參數1:File 物件,參數2:路徑+名稱,參考3:是否要覆蓋(參數4為True 才有作用),參數4:是否要建立新文字檔
' If Not objFile.AtEndOfLine Then
' MsgBox objFile.readall '全部讀出
' End If
Do While Not objFile.AtEndOfLine
MsgBox objFile.ReadLine '只讀取1行
Loop
End Sub


Public Function OpenFile(ByRef objFile As Object, _
ByVal FilePath As String, _
Optional OverWrite As Boolean = True, _
Optional blnCreate As Boolean = True) As Boolean
On Error GoTo ChkErr
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
If Not fso.FolderExists(Left(FilePath, InStrRev(FilePath, "\"))) Then
MsgBox "路徑不正確!", vbExclamation, "警告..."
OpenFile = False
Exit Function
End If

If fso.FileExists(FilePath) Then
'ReadOnly=1 是否為唯讀
If fso.GetFile(FilePath).Attributes = 1 Then
MsgBox "使用者沒有 " & FilePath & " 的使用權限", vbExclamation, "警告"
OpenFile = False
Exit Function
End If
End If
If blnCreate Then '建立
Set objFile = fso.CreateTextFile(FilePath, OverWrite)
Else '讀取
'ForReading
Set objFile = fso.OpenTextFile(FilePath, 1)
End If
OpenFile = True
Set fso = Nothing
Exit Function
ChkErr:
MsgBox Err.Number & "," & Err.Description
End Function

隨機取得6-8碼數字+英文字

'此功能需要一個CommandButton 跟一個TextBox

Private Sub Command1_Click()
Dim intLoop As Integer
Dim intLoop2 As Integer
Dim strValue As String
Dim strTmpValue As String
Dim intType As Integer
Dim intRValue As Integer
Dim intCount As Integer
Randomize Timer '隨機取得6,7或8碼
intCount = Int(Rnd * 3) + 6

For intLoop = 1 To intCount
Randomize Timer '隨機取得數字,小寫或大寫英文字
intLoop2 = Int(Rnd * 3)
Randomize Timer
If intLoop2 = 0 Then
intRValue = Int(Rnd * 10) '取0-9
strTmpValue = Chr(intRValue + 48)
Else
intRValue = Int(Rnd * 26)
If intLoop2 = 1 Then
strTmpValue = Chr(intRValue + 97) '取a~z
Else
strTmpValue = Chr(intRValue + 65) '取A~Z
End If
End If

strValue = strValue & strTmpValue
Next
Text1.Text = strValue

End Sub