2009年4月25日 星期六

SELECT 時間 只取yyyy/mm/dd

日期格式 代號
-------------------- -----------
04/05/2000 101
-------------------- -----------
2000.04.05 102
-------------------- -----------
05/04/2000 103
-------------------- -----------
05.04.2000 104
-------------------- -----------
05-04-2000 105
-------------------- -----------
05 Apr 2000 106
-------------------- -----------
Apr 05, 2000 107
-------------------- -----------
11:33:24 108
-------------------- -----------
Apr 5 2000 11:33:24 109
-------------------- -----------
04-05-2000 110
-------------------- -----------
2000/04/05 111
-------------------- -----------
20000405 112

SELECT convert(char,App_Date ,111) AS Expr1
FROM BC_MAINFORM

SELECT 自動加序號

SAMPLE 北風

select count(*) sn, a.CustomerID from Customers a , Customers b
where b.CustomerID <= a.CustomerID
group by a.CustomerID
order by a.customerid

Result:
sn CustomerID
----------- ----------
1 ALFKI
2 ANATR
3 ANTON
4 AROUT
5 BERGS
6 BLAUS

計算年齡區段的人數SQL語法

先建立一個view(SQL)或檢視表(Access),參考這個SQL語法看看。

create view myview as
(
select 人數=count(*) from 會員資料表
where datediff(yy,出生日期,getdate()) <20

union

select 人數=count(*) from 會員資料表
where datediff(yy,出生日期,getdate()) >= 20 and datediff(yy,出生日期,getdate())&
lt;30

union

select 人數=count(*) from 會員資料表
where datediff(yy,出生日期,getdate()) >= 30 and datediff(yy,出生日期,getdate())&
lt;40

union

select 人數=count(*) from 會員資料表
where datediff(yy,出生日期,getdate()) >= 40 and datediff(yy,出生日期,getdate())&
lt;50

union

select 人數=count(*) from 會員資料表
where datediff(yy,出生日期,getdate()) >= 50 and datediff(yy,出生日期,getdate())&
lt;60

union

select 人數=count(*) from 會員資料表
where datediff(yy,出生日期,getdate()) >= 60

)

以後要查就用select * from myview就行了

縮小MSSQL的日誌檔

如何縮小MSSQL的日誌檔已經是一個經常性的問題了,不過這個問題在精華區已經有不少答案了,我這裏也不再贅述。
現在我們討論一下治本的問題,即如何使日誌檔不再增大?

先介紹一個簡單的方法。
就是把資料庫的故障還原模型設置為“簡單”(SQL2K)。這樣它就會在Checkpoint的時候截斷日誌。
具體操作方法是:
1、在Enterprise Manager中右鍵點資料庫,“屬性|選項|故障還原”,選擇“簡單”就可以了,如果是SQL7,在“屬性|選項”中有一個“trunc. log on chkpt. ”,選中就可以了。
2、如果不想用Enterprise Manager,在Query Analyser或者isql裏面執行
EXEC sp_dboption 'your_dbname', 'trunc. log on chkpt.', 'TRUE'
就可以了
但是,要注意的是,這樣做了之後,雖然日誌不會增大,但是也意味著你一旦出現誤操作,將不會有利用日誌恢復的機會。(如何利用日誌來恢復請參見精華區的FAQ)
所以,絕對不建議在生產資料庫上截斷日誌,除非你有充足的理由和足夠的把握,或者……
承擔責任的不是你。

既然這種方法不安全,下面我將介紹一種安全的方法。
大家都知道,SQL Server 在完成事務日誌備份時將自動截斷事務日誌中的不活動部分。這些不活動的部分包含已完成的事務,因此在恢復過程中不再使用。相反,事務日誌的活動部分包含仍在運行但尚未完成的事務。SQL Server 將重新使用事務日誌中這些截斷的非活動空間,而不是任由事務日誌繼續增大並佔用更多的空間。
所以,我們備份事務日誌就可以使日誌檔不再增大了。
但是呢,日誌檔一直放著也不是個辦法,刪除呢,又會失去恢復的可能性。
我們可以結合完全備份來做。做過完全備份之前的事務日誌就可以刪除了。
比如說,一個備份計畫,每天一次完全備份,保留7天內的,每15分鐘一次事務日誌備份,保留2天的。
用資料庫維護計畫嚮導可以很方便的建立備份計畫,不過一定要記得設置保留多久的備份哦,否則硬碟空間被備份給占滿了就壞事了。

資料重覆時,只更新一筆資料

.
SET ROWCOUNT 1
GO
UPDATE table_name
set field_1 = GETDATE()
WHERE field_2 = 'Y'

SQL Server 中系統資料表的作用

sysaltfiles 主資料庫 保存資料庫的文件
syscharsets 主資料庫 字符集與排序順序
sysconfigures 主資料庫 配置選項
syscurconfigs 主資料庫 當前配置選項
sysdatabases 主資料庫 server中的資料庫
syslanguages 主資料庫 語言
syslogins 主資料庫 登入帳號信息
sysoledbusers 主資料庫 鏈結server登入訊息
sysprocesses 主資料庫 程序
sysremotelogins 主資料庫 遠端登入帳號
syscolumns 每個資料庫資料列
sysconstrains 每個資料庫 限制
sysfilegroups 每個資料庫 文件組
sysfiles 每個資料庫 文件
sysforeignkeys 每個資料庫 外部關鍵字
sysindexs 每個資料庫 索引
sysmenbers 每個資料庫 角色成員
sysobjects 每個資料庫 所有資料庫對象
syspermissions 每個資料庫 權限
systypes 每個資料庫 用户定義資料類型
sysusers 每個資料庫 用户

將辨識欄位重新編號

一般我們都會使用Drop Table的方式先將整個Table刪除後再Create 相同名稱的Table來解決,不過這牽扯到程式開發者或是程式在執行時對於資料庫是否有Drop Table或是Create Table的問題,這時你可以使用SQL Server 2000 內建的功能來對重新起始你的資料表的辨識欄位值,如下:
方法一、
TRUNCATE TABLE [myTable]
myTable 是你的資料表名稱;

方法二、
1. DELETE [myTable]
2. DBCC CHECKIDENT('myTable', RESEED, 0)

myTable 是你的資料表名稱; RESEED 為重新編號的參數; 0 為由 1 開始編號。

不過(方法二)要注意的是你最好先將原資料表的資料完全刪除號再讓他幫你重新編號,不然不管你的資料辨識欄位是設定『不可重複』時,他一樣會從 1 開始編號,所以有可能會造成原本設計此欄位時『唯一性』的目的而產生編號重複的問題,因此建議避免此情況發生。

另外你也可以使用 DBCC CHECKIDENT('myTable', RESEED, 99)讓辨識欄位值由100開始編號。

找出欄位值重覆的記錄

最簡單的做法就是利用 Group By

如果要去除掉 Table (A) 裡面的重覆欄位記錄,有二種方法:

(第一種)
先把重覆的資料利用 Subquery Inert 到另一個 Table (B) ,刪掉 Table (A) 的重覆記錄後,再把 Table (B) 的資料插入 Table (A) 來。

(第二種)
先把重覆的資料利用 Subquery Inert 到另一個 Table (B),再把非重覆的資料Subquery Inert 到同一個 Table (B),最後把 Table (A) 殺了,用 Table (B) 取代 Table (A)。

用SQL的語法來新增或更新欄位的描述

用SQL的語法來新增或更新欄位的描述,
而這是使用SQL2000所新增的系統預存程序sp_addextendedproperty跟sp_updateextendedproperty
以及新增的函數::fn_listextendedproperty
ps.函數前是有兩個冒號(::)的

if not exists(SELECT * FROM ::fn_listextendedproperty (NULL, 'user', 'dbo', 'table', N'資料表名稱', 'column', N'欄位名稱'))
begin
exec sp_addextendedproperty N'MS_Description', N'欄位說明', N'user', N'dbo', N'table', N'資料表名稱', N'column', N'欄位名稱'
end
else
begin
exec sp_updateextendedproperty N'MS_Description', N'欄位說明', N'user', dbo, 'table', N'資料表名稱', 'column', N'欄位名稱'
end

from:http://www.dotblogs.com.tw/ajun/archive/2005/03/07/1043.aspx

顯示 SQL 欄位內容

Select sysobjects.name As TableName, syscolumns.name As ColName, systypes.name As ColType, syscolumns.length As ColLen, syscomments.text As ColDef, Cast(sysproperties.[value] As nvarchar) As ColDesc From sysobjects Left Outer Join syscolumns on sysobjects.id = syscolumns.id Left Outer Join sysproperties On syscolumns.colid = sysproperties.smallid Left Outer Join systypes On syscolumns.xtype = systypes.xtype Left Outer Join syscomments On syscolumns.cdefault = syscomments.id Where (sysobjects.name = N'資料表名稱') Order By syscolumns.colorder

取得MS SQL中資料欄位的描述內容

用ado.net的connection.GetSchema取得資料表結構算是蠻方便的.
但差的一點就是取不到欄位的說明.
因為又要開始寫文件了.而之前寫的SchemaGen不能支援MS SQL 2005.
所以現在正在著手寫SchemaGen 2005版.
另外也練習使用所謂的design pattern來進行...
至於用哪個...先試試看再說...

回到主題.
之前其實有寫過相關的主題.
不過當初主要是說明用T-SQL維護欄位的描述.
現在再針對::fn_listextendedproperty加一些說明

如果要針對某個資料表的某個欄位取得
可以使用下面的語法

select value from ::fn_listextendedproperty(NULL, 'user', 'dbo', 'table', N'資料表名稱', 'column', N'欄位名稱')

如果要取得某個資料表中所有欄位說明的話,可以使用

select * from ::fn_listextendedproperty(NULL, 'user', 'dbo', 'table', N'資料表名稱', 'column',NULL)

另外.如果你的資料表也有設定說明的話,
可以使用下面的語法取得資料表的說明

select * from ::fn_listextendedproperty(NULL, 'user', 'dbo', 'table', N'資料表名稱',NULL,NULL)

當然.要取的所有資料表的說明就是用下面這個

select * from ::fn_listextendedproperty(NULL, 'user', 'dbo', 'table',NULL,NULL,NULL)

另外,上面的參數中有使用NULL的,也可以改用default.意義應該是相同的.例如

select * from ::fn_listextendedproperty(default, 'user', 'dbo', 'table',default,default,default)

而修改或是新增欄位或是資料表說明的話,
可以參考上次寫的T-SQL維護欄位的描述,
使用sp_addextendedproperty及sp_updateextendedproperty來處理

相關連結 :
fn_listextendedproperty (Transact-SQL)
http://msdn2.microsoft.com/en-us/library/ms179853.aspx

sp_addextendedproperty (Transact-SQL)
http://msdn2.microsoft.com/en-us/library/ms180047.aspx

sp_updateextendedproperty (Transact-SQL)
http://technet.microsoft.com/zh-tw/library/ms186885.aspx

SQL語句導入導出大全

/******* 導出到excel
EXEC master..xp_cmdshell 'bcp SettleDB.dbo.shanghu out c:\temp1.xls -c -q -S"GNETDATA/GNETDATA" -U"sa" -P""'
/*********** 導入Excel
SELECT *
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions

/*動態文件名
declare @fn varchar(20),@s varchar(1000)
set @fn = 'c:\test.xls'
set @s ='''Microsoft.Jet.OLEDB.4.0'',
''Data Source="'+@fn+'";User ID=Admin;Password=;Extended properties=Excel 5.0'''
set @s = 'SELECT * FROM OpenDataSource ('+@s+')...sheet1$'
exec(@s)
*/

SELECT cast(cast(科目編號 as numeric(10,2)) as nvarchar(255))+' ' 轉換後的別名
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions

/********************** EXCEL導到遠程SQL
insert OPENDATASOURCE(
'SQLOLEDB',
'Data Source=遠程ip;User ID=sa;Password=密碼'
).庫名.dbo.表名 (列名1,列名2)
SELECT 列名1,列名2
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions


/** 導入文本文件
EXEC master..xp_cmdshell 'bcp dbname..tablename in c:\DT.txt -c -Sservername -Usa -Ppassword'

/** 導出文本文件
EXEC master..xp_cmdshell 'bcp dbname..tablename out c:\DT.txt -c -Sservername -Usa -Ppassword'

EXEC master..xp_cmdshell 'bcp "Select * from dbname..tablename" queryout c:\DT.txt -c -Sservername -Usa -Ppassword'

導出到TXT文本,用逗號分開
exec master..xp_cmdshell 'bcp "庫名..表名" out "d:\tt.txt" -c -t ,-U sa -P password'


BULK INSERT 庫名..表名
FROM 'c:\test.txt'
WITH (
FIELDTERMINATOR = ';',
ROWTERMINATOR = '\n'
)


--/* dBase IV文件
select * from
OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
,'dBase IV;HDR=NO;IMEX=2;DATABASE=C:\','select * from [客戶資料4.dbf]')
--*/

--/* dBase III文件
select * from
OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
,'dBase III;HDR=NO;IMEX=2;DATABASE=C:\','select * from [客戶資料3.dbf]')
--*/

--/* FoxPro 數據庫
select * from openrowset('MSDASQL',
'Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\',
'select * from [aa.DBF]')
--*/

/**************導入DBF文件****************/
select * from openrowset('MSDASQL',
'Driver=Microsoft Visual FoxPro Driver;
SourceDB=e:\VFP98\data;
SourceType=DBF',
'select * from customer where country != "USA" order by country')
go
/***************** 導出到DBF ***************/
如果要導出數據到已經生成結構(即現存的)FOXPRO表中,可以直接用下面的SQL語句

insert into openrowset('MSDASQL',
'Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\',
'select * from [aa.DBF]')
select * from 表

說明:
SourceDB=c:\ 指定foxpro表所在的文件夾
aa.DBF 指定foxpro表的文件名.

/*************導出到Access********************/
insert into openrowset('Microsoft.Jet.OLEDB.4.0',
'x:\A.mdb';'admin';'',A表) select * from 數據庫名..B表

/*************導入Access********************/
insert into B表 selet * from openrowset('Microsoft.Jet.OLEDB.4.0',
'x:\A.mdb';'admin';'',A表)

文件名為參數
declare @fname varchar(20)
set @fname = 'd:\test.mdb'
exec('SELECT a.* FROM opendatasource(''Microsoft.Jet.OLEDB.4.0'',
'''+@fname+''';''admin'';'''', topics) as a ')

SELECT *
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="f:\northwind.mdb";Jet OLEDB:Database Password=123;User ID=Admin;Password=;')...產品

********************* 導入 xml 文件

DECLARE @idoc int
DECLARE @doc varchar(1000)
--sample XML document
SET @doc ='



Customer was very satisfied




Important
Happy Customer.




'
-- Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc

-- Execute a SELECT statement using OPENXML rowset provider.
SELECT *
FROM OPENXML (@idoc, '/root/Customer/Order', 1)
WITH (oid char(5),
amount float,
comment ntext 'text()')
EXEC sp_xml_removedocument @idoc

???????

/**********************Excel導到Txt****************************************/
想用
select * into opendatasource(...) from opendatasource(...)
實現將一個Excel文件內容導入到一個文本文件

假設Excel中有兩列,第一列為姓名,第二列為很行帳號(16位)
且銀行帳號導出到文本文件後分兩部分,前8位和後8位分開。


鄒健:
如果要用你上面的語句插入的話,文本文件必須存在,而且有一行:姓名,銀行賬號1,銀行賬號2
然後就可以用下面的語句進行插入
注意文件名和目錄根據你的實際情況進行修改.

insert into
opendatasource('MICROSOFT.JET.OLEDB.4.0'
,'Text;HDR=Yes;DATABASE=C:\'
)...[aa#txt]
--,aa#txt)
--*/
select 姓名,銀行賬號1=left(銀行賬號,8),銀行賬號2=right(銀行賬號,8)
from
opendatasource('MICROSOFT.JET.OLEDB.4.0'
,'Excel 5.0;HDR=YES;IMEX=2;DATABASE=c:\a.xls'
--,Sheet1$)
)...[Sheet1$]



如果你想直接插入並生成文本文件,就要用bcp

declare @sql varchar(8000),@tbname varchar(50)

--首先將excel表內容導入到一個全局臨時表
select @tbname='[##temp'+cast(newid() as varchar(40))+']'
,@sql='select 姓名,銀行賬號1=left(銀行賬號,8),銀行賬號2=right(銀行賬號,8)
into '+@tbname+' from
opendatasource(''MICROSOFT.JET.OLEDB.4.0''
,''Excel 5.0;HDR=YES;IMEX=2;DATABASE=c:\a.xls''
)...[Sheet1$]'
exec(@sql)

--然後用bcp從全局臨時表導出到文本文件
set @sql='bcp "'+@tbname+'" out "c:\aa.txt" /S"(local)" /P"" /c'
exec master..xp_cmdshell @sql

--刪除臨時表
exec('drop table '+@tbname)


/********************導整個數據庫*********************************************/
用bcp實現的存儲過程

/*
實現數據導入/導出的存儲過程
根據不同的參數,可以實現導入/導出整個數據庫/單個表
調用示例:
--導出調用示例
----導出單個表
exec file2table 'zj','','','xzkh_sa..地區資料','c:\zj.txt',1
----導出整個數據庫
exec file2table 'zj','','','xzkh_sa','C:\docman',1

--導入調用示例
----導入單個表
exec file2table 'zj','','','xzkh_sa..地區資料','c:\zj.txt',0
----導入整個數據庫
exec file2table 'zj','','','xzkh_sa','C:\docman',0

*/
if exists(select 1 from sysobjects where name='File2Table' and objectproperty(id,'IsProcedure')=1)
drop procedure File2Table
go
create procedure File2Table
@servername varchar(200) --服務器名
,@username varchar(200) --用戶名,如果用NT驗證方式,則為空''
,@password varchar(200) --密碼
,@tbname varchar(500) --數據庫.dbo.表名,如果不指定:.dbo.表名,則導出數據庫的所有用戶表
,@filename varchar(1000) --導入/導出路徑/文件名,如果@tbname參數指明是導出整個數據庫,則這個參數是文件存放路徑,文件名自動用表名.txt
,@isout bit --1為導出,0為導入
as
declare @sql varchar(8000)

if @tbname like '%.%.%' --如果指定了表名,則直接導出單個表
begin
set @sql='bcp '+@tbname
+case when @isout=1 then ' out ' else ' in ' end
+' "'+@filename+'" /w'
+' /S '+@servername
+case when isnull(@username,'')='' then '' else ' /U '+@username end
+' /P '+isnull(@password,'')
exec master..xp_cmdshell @sql
end
else
begin --導出整個數據庫,定義游標,取出所有的用戶表
declare @m_tbname varchar(250)
if right(@filename,1)<>'\' set @filename=@filename+'\'

set @m_tbname='declare #tb cursor for select name from '+@tbname+'..sysobjects where xtype=''U'''
exec(@m_tbname)
open #tb
fetch next from #tb into @m_tbname
while @@fetch_status=0
begin
set @sql='bcp '+@tbname+'..'+@m_tbname
+case when @isout=1 then ' out ' else ' in ' end
+' "'+@filename+@m_tbname+'.txt " /w'
+' /S '+@servername
+case when isnull(@username,'')='' then '' else ' /U '+@username end
+' /P '+isnull(@password,'')
exec master..xp_cmdshell @sql
fetch next from #tb into @m_tbname
end
close #tb
deallocate #tb
end
go


/************* Oracle **************/
EXEC sp_addlinkedserver 'OracleSvr',
'Oracle 7.3',
'MSDAORA',
'ORCLDB'
GO

delete from openquery(mailser,'select * from yulin')

select * from openquery(mailser,'select * from yulin')

update openquery(mailser,'select * from yulin where id=15')set disorder=555,catago=888

insert into openquery(mailser,'select disorder,catago from yulin')values(333,777)

補充:

對於用bcp導出,是沒有字段名的.

用openrowset導出,需要事先建好表.

用openrowset導入,除ACCESS及EXCEL外,均不支持非本機數據導入

/*********** 導入Excel
SELECT *
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions

/*動態文件名
declare @fn varchar(20),@s varchar(1000)
set @fn = 'c:\test.xls'
set @s ='''Microsoft.Jet.OLEDB.4.0'',
''Data Source="'+@fn+'";User ID=Admin;Password=;Extended properties=Excel 5.0'''
set @s = 'SELECT * FROM OpenDataSource ('+@s+')...sheet1$'
exec(@s)
*/

SELECT cast(cast(科目編號 as numeric(10,2)) as nvarchar(255))+' ' 轉換後的別名
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions

/********************** EXCEL導到遠程SQL
insert OPENDATASOURCE(
'SQLOLEDB',
'Data Source=遠程ip;User ID=sa;Password=密碼'
).庫名.dbo.表名 (列名1,列名2)
SELECT 列名1,列名2
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions


/** 導入文本文件
EXEC master..xp_cmdshell 'bcp dbname..tablename in c:\DT.txt -c -Sservername -Usa -Ppassword'

/** 導出文本文件
EXEC master..xp_cmdshell 'bcp dbname..tablename out c:\DT.txt -c -Sservername -Usa -Ppassword'

EXEC master..xp_cmdshell 'bcp "Select * from dbname..tablename" queryout c:\DT.txt -c -Sservername -Usa -Ppassword'

導出到TXT文本,用逗號分開
exec master..xp_cmdshell 'bcp "庫名..表名" out "d:\tt.txt" -c -t ,-U sa -P password'


BULK INSERT 庫名..表名
FROM 'c:\test.txt'
WITH (
FIELDTERMINATOR = ';',
ROWTERMINATOR = '\n'
)


--/* dBase IV文件
select * from
OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
,'dBase IV;HDR=NO;IMEX=2;DATABASE=C:\','select * from [客戶資料4.dbf]')
--*/

--/* dBase III文件
select * from
OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
,'dBase III;HDR=NO;IMEX=2;DATABASE=C:\','select * from [客戶資料3.dbf]')
--*/

--/* FoxPro 數據庫
select * from openrowset('MSDASQL',
'Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\',
'select * from [aa.DBF]')
--*/

/**************導入DBF文件****************/
select * from openrowset('MSDASQL',
'Driver=Microsoft Visual FoxPro Driver;
SourceDB=e:\VFP98\data;
SourceType=DBF',
'select * from customer where country != "USA" order by country')
go
/***************** 導出到DBF ***************/
如果要導出數據到已經生成結構(即現存的)FOXPRO表中,可以直接用下面的SQL語句

insert into openrowset('MSDASQL',
'Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\',
'select * from [aa.DBF]')
select * from 表

說明:
SourceDB=c:\ 指定foxpro表所在的文件夾
aa.DBF 指定foxpro表的文件名.




/*************導出到Access********************/
insert into openrowset('Microsoft.Jet.OLEDB.4.0',
'x:\A.mdb';'admin';'',A表) select * from 數據庫名..B表

/*************導入Access********************/
insert into B表 selet * from openrowset('Microsoft.Jet.OLEDB.4.0',
'x:\A.mdb';'admin';'',A表)

文件名為參數
declare @fname varchar(20)
set @fname = 'd:\test.mdb'
exec('SELECT a.* FROM opendatasource(''Microsoft.Jet.OLEDB.4.0'',
'''+@fname+''';''admin'';'''', topics) as a ')

SELECT *
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="f:\northwind.mdb";Jet OLEDB:Database Password=123;User ID=Admin;Password=;')...產品

********************* 導入 xml 文件

DECLARE @idoc int
DECLARE @doc varchar(1000)
--sample XML document
SET @doc ='



Customer was very satisfied




Important
Happy Customer.




'
-- Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc

-- Execute a SELECT statement using OPENXML rowset provider.
SELECT *
FROM OPENXML (@idoc, '/root/Customer/Order', 1)
WITH (oid char(5),
amount float,
comment ntext 'text()')
EXEC sp_xml_removedocument @idoc



???????

/**********************Excel導到Txt****************************************/
想用
select * into opendatasource(...) from opendatasource(...)
實現將一個Excel文件內容導入到一個文本文件

假設Excel中有兩列,第一列為姓名,第二列為很行帳號(16位)
且銀行帳號導出到文本文件後分兩部分,前8位和後8位分開。


鄒健:
如果要用你上面的語句插入的話,文本文件必須存在,而且有一行:姓名,銀行賬號1,銀行賬號2
然後就可以用下面的語句進行插入
注意文件名和目錄根據你的實際情況進行修改.

insert into
opendatasource('MICROSOFT.JET.OLEDB.4.0'
,'Text;HDR=Yes;DATABASE=C:\'
)...[aa#txt]
--,aa#txt)
--*/
select 姓名,銀行賬號1=left(銀行賬號,8),銀行賬號2=right(銀行賬號,8)
from
opendatasource('MICROSOFT.JET.OLEDB.4.0'
,'Excel 5.0;HDR=YES;IMEX=2;DATABASE=c:\a.xls'
--,Sheet1$)
)...[Sheet1$]



如果你想直接插入並生成文本文件,就要用bcp

declare @sql varchar(8000),@tbname varchar(50)

--首先將excel表內容導入到一個全局臨時表
select @tbname='[##temp'+cast(newid() as varchar(40))+']'
,@sql='select 姓名,銀行賬號1=left(銀行賬號,8),銀行賬號2=right(銀行賬號,8)
into '+@tbname+' from
opendatasource(''MICROSOFT.JET.OLEDB.4.0''
,''Excel 5.0;HDR=YES;IMEX=2;DATABASE=c:\a.xls''
)...[Sheet1$]'
exec(@sql)

--然後用bcp從全局臨時表導出到文本文件
set @sql='bcp "'+@tbname+'" out "c:\aa.txt" /S"(local)" /P"" /c'
exec master..xp_cmdshell @sql

--刪除臨時表
exec('drop table '+@tbname)


/********************導整個數據庫*********************************************/

用bcp實現的存儲過程


/*
實現數據導入/導出的存儲過程
根據不同的參數,可以實現導入/導出整個數據庫/單個表
調用示例:
--導出調用示例
----導出單個表
exec file2table 'zj','','','xzkh_sa..地區資料','c:\zj.txt',1
----導出整個數據庫
exec file2table 'zj','','','xzkh_sa','C:\docman',1

--導入調用示例
----導入單個表
exec file2table 'zj','','','xzkh_sa..地區資料','c:\zj.txt',0
----導入整個數據庫
exec file2table 'zj','','','xzkh_sa','C:\docman',0

*/
if exists(select 1 from sysobjects where name='File2Table' and objectproperty(id,'IsProcedure')=1)
drop procedure File2Table
go
create procedure File2Table
@servername varchar(200) --服務器名
,@username varchar(200) --用戶名,如果用NT驗證方式,則為空''
,@password varchar(200) --密碼
,@tbname varchar(500) --數據庫.dbo.表名,如果不指定:.dbo.表名,則導出數據庫的所有用戶表
,@filename varchar(1000) --導入/導出路徑/文件名,如果@tbname參數指明是導出整個數據庫,則這個參數是文件存放路徑,文件名自動用表名.txt
,@isout bit --1為導出,0為導入
as
declare @sql varchar(8000)

if @tbname like '%.%.%' --如果指定了表名,則直接導出單個表
begin
set @sql='bcp '+@tbname
+case when @isout=1 then ' out ' else ' in ' end
+' "'+@filename+'" /w'
+' /S '+@servername
+case when isnull(@username,'')='' then '' else ' /U '+@username end
+' /P '+isnull(@password,'')
exec master..xp_cmdshell @sql
end
else
begin --導出整個數據庫,定義游標,取出所有的用戶表
declare @m_tbname varchar(250)
if right(@filename,1)<>'\' set @filename=@filename+'\'

set @m_tbname='declare #tb cursor for select name from '+@tbname+'..sysobjects where xtype=''U'''
exec(@m_tbname)
open #tb
fetch next from #tb into @m_tbname
while @@fetch_status=0
begin
set @sql='bcp '+@tbname+'..'+@m_tbname
+case when @isout=1 then ' out ' else ' in ' end
+' "'+@filename+@m_tbname+'.txt " /w'
+' /S '+@servername
+case when isnull(@username,'')='' then '' else ' /U '+@username end
+' /P '+isnull(@password,'')
exec master..xp_cmdshell @sql
fetch next from #tb into @m_tbname
end
close #tb
deallocate #tb
end
go


/************* Oracle **************/
EXEC sp_addlinkedserver 'OracleSvr',
'Oracle 7.3',
'MSDAORA',
'ORCLDB'
GO

delete from openquery(mailser,'select * from yulin')

select * from openquery(mailser,'select * from yulin')

update openquery(mailser,'select * from yulin where id=15')set disorder=555,catago=888

insert into openquery(mailser,'select disorder,catago from yulin')values(333,777)



補充:

對於用bcp導出,是沒有字段名的.

用openrowset導出,需要事先建好表.

用openrowset導入,除ACCESS及EXCEL外,均不支持非本機數據導入

如何一次備份 SQL Server 中所有資料庫

-- 取得資料庫本機的 Backup 資料目錄
DECLARE @backup_path nvarchar(256);
DECLARE @backup_file nvarchar(256);
SET @backup_path = (SELECT SUBSTRING(SUBSTRING(physical_name, 1, CHARINDEX(N'master.mdf', LOWER(physical_name)) - 1), 1, CHARINDEX(N'\DATA\', LOWER(physical_name)) - 1) + '\Backup\'
FROM master.sys.master_files
WHERE database_id = 1 AND file_id = 1);


-- 用來暫存備份指令的變數
declare @backup_sql nvarchar(max)
set @backup_sql = '';

-- 用來暫存資料庫名稱的變數
declare @dbname nvarchar(256)

-- 宣告 cursor 以取得資料庫名稱
declare icur cursor static for select name from sys.databases where name != 'tempdb'

OPEN icur

fetch next from icur into @dbname
while(@@FETCH_STATUS=0)
BEGIN
set @backup_file = @backup_path + @dbname + '.bak'
set @backup_sql = 'BACKUP DATABASE ['+@dbname+'] TO DISK='''+@backup_file+''''

exec (@backup_sql)

FETCH NEXT FROM icur INTO @dbname
END

close icur
deallocate icur

備份完成的資料庫預設會擺在 C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Backup 目錄下。

分享一些與日期相關的 SQL 語法技巧

日期格式很常用,但有些特殊的需求要計算出來還蠻麻煩了,底下這些是我之前記錄下來的一些小技巧,真的要寫的時候若一些 SQL 函數不熟還真不容易寫出來呢!

顯示當下日期時間

select getdate()
顯示本月第一天的語法(不含時間的部分)

select DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)
顯示上個月最後一天(不含時間的部分)

select DATEADD(dd, -1, DATEADD(mm, DATEDIFF(mm, 0, getdate()), 0))
顯示這個月最後一天(不含時間的部分)

select DATEADD(mm, 1, DATEADD(dd, -1, DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)))
將「日期字串」轉成「日期格式 」

SELECT CONVERT(datetime, '20080401 11:35:00.000')
P.S. 其實不是 100% 會轉成功,不過大部分人看的懂得日期時間格式應該都會自動轉換成功。

將「日期格式」轉成「日期字串」(可自訂輸出格式)

請參考此文章:用 SQL Server 中的 CONVERT 函數處理日期字串

取得目前月份的數值,若小於 10 則補 0 ( 回傳字串格式 ) ( 例如: 2008-04-11 會回傳 04 )

SELECT REPLACE(STR(datepart(mm, getdate()), 2, 0), ' ', '0')
P.S. 若用 datepart(mm, getdate()) 的話只會回傳 4 而已,並不會補零 ( 因為是 int 型別 )

善用 SQL Server 中的 CONVERT 函數處理日期字串

輸出格式:2008-02-27 00:25:13
SELECT CONVERT(char(19), getdate(), 120)

輸出格式:2008-02-27
SELECT CONVERT(char(10), getdate(), 20)

輸出格式:2008.02.27
SELECT CONVERT(char(10), getdate(), 102)

輸出格式:08.02.27
SELECT CONVERT(char(8), getdate(), 2)

輸出格式:2008/02/27
SELECT CONVERT(char(10), getdate(), 111)

輸出格式:08/02/27
SELECT CONVERT(char(8), getdate(), 11)

輸出格式:20080227
SELECT CONVERT(char(8), getdate(), 112)

輸出格式:080227
SELECT CONVERT(char(6), getdate(), 12)

想查詢完整的列表與說明可以到 MSDN 的 Transact-SQL Reference 去查詢 CAST and CONVERT 的詳細說明。

精妙SQL語句介紹

說明:複製表(只複製結構,源表名:a 新表名:b)

  SQL: select * into b from a where 1<>1   

  說明:拷貝表(拷貝資料,源表名:a 目標表名:b)

  SQL: insert into b(a, b, c) select d,e,f from b;   

  說明:顯示文章、提交人和最後回復時間

  SQL: select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b  

  說明:外連接查詢(表名1:a 表名2:b)

  SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c   

  說明:日程安排提前五分鐘提醒

  SQL: select * from 日程安排 where datediff('minute',f開始時間,getdate())>5   

  說明:兩張關聯表,刪除主表中已經在副表中沒有的資訊

  SQL:

  delete from info where not exists ( select * from infobz where info.infid=infobz.infid )   

  說明:--

  SQL:

  SELECT A.NUM, A.NAME, B.UPD_DATE, B.PREV_UPD_DATE FROM TABLE1,(SELECT X.NUM, X.UPD_DATE, Y.UPD_DATE PREV_UPD_DATE FROM (SELECT NUM, UPD_DATE, INBOUND_QTY, STOCK_ONHAND FROM TABLE2 WHERE TO_CHAR(UPD_DATE,'YYYY/MM') = TO_CHAR(SYSDATE, 'YYYY/MM')) X, (SELECT NUM, UPD_DATE, STOCK_ONHAND FROM TABLE2 WHERE TO_CHAR(UPD_DATE,'YYYY/MM') = TO_CHAR(TO_DATE(TO_CHAR(SYSDATE, 'YYYY/MM') || '/01','YYYY/MM/DD') - 1, 'YYYY/MM') ) Y, WHERE X.NUM = Y.NUM (+)AND X.INBOUND_QTY + NVL(Y.STOCK_ONHAND,0) <> X.STOCK_ONHAND ) B WHERE A.NUM = B.NUM   

  說明:--

  SQL:

  select * from studentinfo where not exists(select * from student where studentinfo.id=student.id) and 系名稱='"&strdepartmentname&"' and 專業名稱='"&strprofessionname&"' order by 性別,生源地,高考總成績

SQL 常用到的日期時間格式轉換

Transact-SQL 常用到的日期時間格式轉換,方法如下:

SELECT CONVERT(VARCHAR(18) , getdate(), 100)
=> 12 31 2007 10:30AM

SELECT CONVERT(VARCHAR(10) , GETDATE(), 101 )
=> 12/31/2007

SELECT CONVERT(VARCHAR(10) , GETDATE(), 102 )
=> 2007.12.31

SELECT CONVERT(VARCHAR(10) , GETDATE(), 103 )
=> 31/12/2007

SELECT CONVERT(VARCHAR(10) , GETDATE(), 104 )
=> 31.12.2007

SELECT CONVERT(VARCHAR(10) , GETDATE(), 105 )
=> 31-12-2007

SELECT CONVERT(VARCHAR(10) , GETDATE(), 106 )
=> 31 12 2007

SELECT CONVERT(VARCHAR(11) , GETDATE(), 107 )
=> 12 31, 2007

SELECT CONVERT(VARCHAR(8) , GETDATE(), 108 )
=> 10:30:20

SELECT CONVERT(VARCHAR(25) , GETDATE(), 109)
=> 12 31 2007 10:30:20:517AM

SELECT CONVERT(VARCHAR(10) , GETDATE(), 110 )
=> 12-31-2007

SELECT CONVERT(VARCHAR(10) , GETDATE(), 111 )
=> 2007/12/31

SELECT CONVERT(VARCHAR(8) , GETDATE(), 112 )
=> 20071231

SELECT CONVERT(VARCHAR(23) , GETDATE(), 113 )
=> 31 12 2007 10:30:20:517

SELECT CONVERT(VARCHAR(12) , GETDATE(), 114 )
=> 10:30:20:517

SELECT CONVERT(VARCHAR, GETDATE(), 120 )
=> 2007-12-31 10:30:20

最後
SELECT REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR, GETDATE(), 120 ),'-',''),' ',''),':','')
=> 20071231103020

C#日期所有函數

DateTime dt = DateTime.Now;
// Label1.Text = dt.ToString();//2005-11-5 13:21:25
// Label2.Text = dt.ToFileTime().ToString();//127756416859912816
// Label3.Text = dt.ToFileTimeUtc().ToString();//127756704859912816
// Label4.Text = dt.ToLocalTime().ToString();//2005-11-5 21:21:25
// Label5.Text = dt.ToLongDateString().ToString();//2005年11月5日
// Label6.Text = dt.ToLongTimeString().ToString();//13:21:25
// Label7.Text = dt.ToOADate().ToString();//38661.5565508218
// Label8.Text = dt.ToShortDateString().ToString();//2005-11-5
// Label9.Text = dt.ToShortTimeString().ToString();//13:21
// Label10.Text = dt.ToUniversalTime().ToString();//2005-11-5 5:21:25
// 2005-11-5 13:30:28.4412864
// Label1.Text = dt.Year.ToString();//2005
// Label2.Text = dt.Date.ToString();//2005-11-5 0:00:00
// Label3.Text = dt.DayOfWeek.ToString();//Saturday
// Label4.Text = dt.DayOfYear.ToString();//309
// Label5.Text = dt.Hour.ToString();//13
// Label6.Text = dt.Millisecond.ToString();//441
// Label7.Text = dt.Minute.ToString();//30
// Label8.Text = dt.Month.ToString();//11
// Label9.Text = dt.Second.ToString();//28
// Label10.Text = dt.Ticks.ToString();//632667942284412864
// Label11.Text = dt.TimeOfDay.ToString();//13:30:28.4412864
// Label1.Text = dt.ToString();//2005-11-5 13:47:04
// Label2.Text = dt.AddYears(1).ToString();//2006-11-5 13:47:04
// Label3.Text = dt.AddDays(1.1).ToString();//2005-11-6 16:11:04
// Label4.Text = dt.AddHours(1.1).ToString();//2005-11-5 14:53:04
// Label5.Text = dt.AddMilliseconds(1.1).ToString();//2005-11-5 13:47:04
// Label6.Text = dt.AddMonths(1).ToString();//2005-12-5 13:47:04
// Label7.Text = dt.AddSeconds(1.1).ToString();//2005-11-5 13:47:05
// Label8.Text = dt.AddMinutes(1.1).ToString();//2005-11-5 13:48:10
// Label9.Text = dt.AddTicks(1000).ToString();//2005-11-5 13:47:04
// Label10.Text = dt.CompareTo(dt).ToString();//0
//// Label11.Text = dt.Add(?).ToString();//问号为一个时间段
// Label1.Text = dt.Equals("2005-11-6 16:11:04").ToString();//False
// Label2.Text = dt.Equals(dt).ToString();//True
// Label3.Text = dt.GetHashCode().ToString();//1474088234
// Label4.Text = dt.GetType().ToString();//System.DateTime
// Label5.Text = dt.GetTypeCode().ToString();//DateTime

// Label1.Text = dt.GetDateTimeFormats('s')[0].ToString();//2005-11-05T14:06:25
// Label2.Text = dt.GetDateTimeFormats('t')[0].ToString();//14:06
// Label3.Text = dt.GetDateTimeFormats('y')[0].ToString();//2005年11月
// Label4.Text = dt.GetDateTimeFormats('D')[0].ToString();//2005年11月5日
// Label5.Text = dt.GetDateTimeFormats('D')[1].ToString();//2005 11 05
// Label6.Text = dt.GetDateTimeFormats('D')[2].ToString();//星期六 2005 11 05
// Label7.Text = dt.GetDateTimeFormats('D')[3].ToString();//星期六 2005年11月5日
// Label8.Text = dt.GetDateTimeFormats('M')[0].ToString();//11月5日
// Label9.Text = dt.GetDateTimeFormats('f')[0].ToString();//2005年11月5日 14:06
// Label10.Text = dt.GetDateTimeFormats('g')[0].ToString();//2005-11-5 14:06
// Label11.Text = dt.GetDateTimeFormats('r')[0].ToString();//Sat, 05 Nov 2005 14:06:25 GMT

Label1.Text = string.Format("{0:d}",dt);//2005-11-5
Label2.Text = string.Format("{0:D}",dt);//2005年11月5日
Label3.Text = string.Format("{0:f}",dt);//2005年11月5日 14:23
Label4.Text = string.Format("{0:F}",dt);//2005年11月5日 14:23:23
Label5.Text = string.Format("{0:g}",dt);//2005-11-5 14:23
Label6.Text = string.Format("{0:G}",dt);//2005-11-5 14:23:23
Label7.Text = string.Format("{0:M}",dt);//11月5日
Label8.Text = string.Format("{0:R}",dt);//Sat, 05 Nov 2005 14:23:23 GMT
Label9.Text = string.Format("{0:s}",dt);//2005-11-05T14:23:23
Label10.Text = string.Format("{0:t}",dt);//14:23
Label11.Text = string.Format("{0:T}",dt);//14:23:23
Label12.Text = string.Format("{0:u}",dt);//2005-11-05 14:23:23Z
Label13.Text = string.Format("{0:U}",dt);//2005年11月5日 6:23:23
Label14.Text = string.Format("{0:Y}",dt);//2005年11月
Label15.Text = string.Format("{0}",dt);//2005-11-5 14:23:23
Label16.Text = string.Format("{0:yyyyMMddHHmmssffff}",dt);

取月份最後一天

做法都是用隔月的第一天減一天

'VB

Private Sub Command1_Click()
Dim d As Date
d = "2006/05/03"
MsgBox (DateAdd("M", 1, Format(d, "YYYY/MM") & "/01") - 1)
End Sub

'VB.NET

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim d As Date
d = "2006/05/03"
MsgBox(Date.Parse(d.AddMonths(1).ToString("yyyy/MM") & "/01").AddDays(-1))

End Sub

'SQL

在SQL 有LASTDATE() 可以用

如何在 IIS 中實作 SSL

網際網路已開啟新的方式對組織而言通訊,同時從內部和外部。 員工、 廠商和客戶之間的較佳的通訊可讓組織剪下成本、 讓產品更快,市場和建置更強的客戶關係。 這項改良的通訊需要網際網路和內部網路--有時候--傳輸敏感性資訊。 因此就一定要能夠進行與已知的合作對象的私密、 防篡改通訊。 若要將這有關,組織可以建置安全的基礎結構使用數位憑證與技術,例如 Secure Sockets Layer (SSL),根據公開金鑰加密。 本文將逐步將告訴您,如何以一個 Information Services (IIS) 電腦上設定 SSL。
回此頁最上方
需求以下項目將說明建議使用的硬體、軟體、網路基礎架構、技巧和知識,以及需要的 Service Pack::
Windows 2000 Server、 Advanced Server 或 Professional,搭配 Internet Information Services (IIS) 5.0 版與 Microsoft Certificate Server 版本 2.0 安裝和設定。
Windows Server 2003 Standard Edition、 Windows Server 2003 Enterprise Edition、 Windows Server 2003 Datacenter Edition 或 Windows Server 2003 Web Edition 的電腦與網際網路資訊服務 (IIS) 6.0 和 「 憑證服務 」 安裝和設定。如果主控憑證伺服器電腦不是同一部電腦有 IIS,您需要有效的網路或網際網路連線到伺服器主控憑證伺服器。
回此頁最上方
建立憑證要求首先,Web 伺服器必須請憑證要求。 如果要執行這項操作,請依照下列步驟執行。:
啟動 Internet Service Manager (ISM),它會載入 Microsoft Management Console (MMC) 的 Internet Information Server 嵌入式管理單元。. 要執行這項操作,請按一下 [ 開始 ] 、 指向 [ 程式集 ] ,指向 [ 系統管理工具 ] ,然後再按 [ 網際網路服務管理員 或 網際網路資訊服務 (IIS) 管理員 。
連按兩下該伺服器名稱,讓您看到所有 Web 站台。 在 IIS 6.0 中, 展開 [ 網站 ] 。
用滑鼠右鍵按一下您要安裝憑證,所在的網站,然後按一下 [ 內容 ] 。
按一下 [ 目錄安全性 ] 索引標籤,然後按一下 [ 伺服器憑證 在 安全通訊 ] 以啟動 「 Web 伺服器憑證精靈 」。
在 IIS 6.0 中, 按一下 [ 下一步 ] 。 如果您執行 IIS 5.0,請移至步驟 6。
選取 [ 建立新的憑證 然後按一下 [ 下一步 ] 。
選取 準備要求現在,但傳送更新的版本 並按一下 [ 下一步 ] 。
輸入憑證的名稱。 您可以以符合憑證名稱為 Web 站台的名稱。 現在,選取位元長度 ; 位元長度,更強憑證加密。 如果您的使用者可能來自具有加密限制國家,請選取 Server Gated Cryptography 。
請輸入您的組織名稱及組織單位 (例如,MyWeb 及 Development Dept)。 按一下 [ 下一步 ] 。
輸入完全符合規定的網域名稱 (FQDN) 或伺服器名稱作為一般名稱。 如果您正在建立將用於透過網際網路憑證,最好是使用 FQDN (例如,www.MyWeb.com)。 按一下 [ 下一步 ] 。
請輸入您的位置資訊,然後按一下 [ 下一步 ] 。
輸入路徑和檔案名稱儲存到,憑證資訊,然後按一下 [ 下一步 ] ,以繼續。請注意 如果您輸入任何而不是預設的位置和檔案名稱,務必要注意您選擇,名稱和位置,因為您將需要存取這個檔案在稍後步驟中。
請確認您有輸入,資訊然後按一下 [ 下一步 ] ,以完成程序,並建立憑證要求。
回此頁最上方
提交憑證要求憑證要求您只建立必須提交至憑證授權單位 (CA)。 這可能是您自己的伺服器在它或如 VeriSign 線上的 CA 上安裝 Certificate Server 2.0。 請連絡您所選擇的憑證提供者並決定您的需要憑證的最佳的等級。 有不同的方法的送出您的要求。 請連絡您所選擇的憑證授權單位要求並接收您的憑證。 您可以建立您自己的憑證 with Certificate Server 2.0,但您的用戶端必須隱含地信任您作為憑證授權單位。 下列步驟假設您使用 Certificate Server 2.0 作為憑證提供者。 請注意 「 IIS 憑證精靈 」 只會辨識預設的 Web 伺服器範本。 當您選取的線上企業 CA 時,除非 CA 使用預設的 Web 伺服器範本將不會列出 「 授權 」。
開啟瀏覽器,並瀏覽至 http:// YourWebServerName / CertSrv /。
在 IIS 5.0,選取 要求憑證 ] 然後按一下 [ 下一步 ] 。 在 IIS 6.0,按一下 [ 要求憑證 。
在 IIS 5.0 中, 選取 [ 進階要求 ] 然後按一下 [ 下一步 ] 。 在 IIS 6.0,按一下 [ 進階的憑證要求 。
在 IIS 5.0 中, 選取 [ 送出 ] 使用 Base64 憑證要求 然後按一下 [ 下一步 ] 。 在 IIS 6.0,按一下 [ 送出 ] 憑證藉由使用 Base-64 編碼的 CMC 或 PKCS # 10 檔案,來要求或提交更新要求使用 Base-64 編碼的 PKCS # 7 檔案 。
在 Microsoft 記事本中, 開啟您在 < 建立憑證要求 > 一節中所建立要求文件。 在 IIS 6.0,您也可以按一下 [ 瀏覽 ] 要插入的檔案 。
將文件的內容複製。 內容應該類似下列:
-----BEGIN NEW CERTIFICATE REQUEST-----
MIICcjCCAhwCAQAwYjETMBEGA1UEAxMKcm9ic3NlcnZlcjELMAkGA1UECxMCTVMx
CzAJBgNVBAoTAk1TMREwDwYDVQQHEwhCZWxsZXZ1ZTERMA8GA1UECBMIV2FzaGl0
b24xCzAJBgNVBAYTAlVTMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALYK4sYDNQ7h
LmSfL0qpIvUfY7Ddw7fNCvDp3rM7z4QqoLhA2c8TkyamqWTBsV0WRHIidf/J6mU4
wN4wrUzJTLUCAwEAAaCCAVMwGgYKKwYBBAGCNw0CAzEMFgo1LjAuMjE5NS4yMDUG
CisGAQQBgjcCAQ4xJzAlMA4GA1UdDwEB/wQEAwIE8DATBgNVHSUEDDAKBggrBgEF
BQcDATCB/QYKKwYBBAGCNw0CAjGB7jCB6wIBAR5aAE0AaQBjAHIAbwBzAG8AZgB0
ACAAUgBTAEEAIABTAEMAaABhAG4AbgBlAGwAIABDAHIAeQBwAHQAbwBnAHIAYQBw
AGgAaQBjACAAUAByAG8AdgBpAGQAZQByA4GJAGKa0jzBn8fkxScrWsdnU2eUJOMU
K5Ms87Q+fjP1/pWN3PJnH7x8MBc5isFCjww6YnIjD8c3OfYfjkmWc048ZuGoH7Zo
D6YNfv/SfAvQmr90eGmKOFFiTD+hl1hM08gu2oxFU7mCvfTQ/2IbXP7KYFGEqaJ6
wn0Z5yLOByPqblQZAAAAAAAAAAAwDQYJKoZIhvcNAQEFBQADQQCgRCWkaXlY2nVa
tbn6p5miPwWfrbViYo0B62wkuH0f7J0nSGcxMnn/6Q/iLEIsgHqFhox5PWCzIV0J
tXKPWrBL
-----END NEW CERTIFICATE REQUEST-------
注意 如果您儲存文件使用預設的名稱和位置,它位於 C:\Certreq.txt。 請注意 請務必只所示複製所有內容。
將文件的內容貼到 Web 表單的 Base64 編碼憑證要求 ] 文字方塊。
憑證範本 下, 選取 Web 伺服器 或 使用者 ,然後按一下 [ 送出 ] 。
如果 憑證伺服器 設定為 [ 永遠 Issue 憑證 ,您可以立即存取憑證。 如果要執行這項操作,請依照下列步驟執行。:
按一下 [ 下載 CA 憑證 (請勿按 [ 下載 CA 憑證 ] 路徑 或 下載憑證鏈結 )。
接到提示時, 選取 [ 儲存 ] 這個檔案到磁碟 並將憑證儲存到您的桌面或其他您會記得的位置。 您可能會立即直接到 「 [ 安裝憑證及設定以 SSL 的網站 」 一節。
回此頁最上方
發行及下載憑證若要發行 「 憑證伺服器中的憑證,請依照下列步驟執行:
開啟 CA MMC 嵌入式管理單元。 要執行這項操作,請按一下 [ 開始 ] 、 指向 [ 程式集 ] ,指向 [ 系統管理工具 ] ,然後再按一下 [ 憑證授權單位 ] 。
在 IIS 5.0,展開 [ 憑證授權單位 」 然後按一下 [ 擱置要求 ] 資料夾。 您的擱置中的憑證要求出現在右窗格中。 在 IIS 6.0 中, 展開伺服器名稱。
您剛才提交的擱置中的憑證要求上按一下滑鼠右鍵,選取 [ 所有工作 ] ,並再按一下 [ 發行 ] 。 請注意 您選取 超過下列大小就發出 後,憑證不會再顯示這個視窗和資料夾中。 它現在位於 [ 發出的憑證資料夾中。
您已發行 (和授權) 憑證之後,您可以回到 [ 憑證伺服器 Web 介面,來選取和下載憑證。 如果要執行這項操作,請依照下列步驟執行。:
瀏覽至 http:// YourWebServerName / CertSrv /。
在預設頁面上, 選取 [ 檢查擱置的憑證 然後按一下 [ 下一步 ] 。 在 IIS 6.0,按一下 [ 檢視擱置中的憑證要求的狀態 。
選取您的擱置中的憑證,然後按一下 [ 下一步 ] ,以移至下載頁面。
在下載頁面上, 按一下 [ 下載 CA 憑證 (請勿按 [ 下載 CA 憑證 ] 路徑 或 下載憑證鏈結 )。
接到提示時, 選取 [ 儲存 ] 這個檔案到磁碟 並將憑證儲存到您的桌面或其他您會記得的位置。
回此頁最上方
安裝憑證並設定一個 SSL 網站如果要安裝憑證,請依照下列步驟執行::
開啟網際網路服務管理員,然後展開伺服器名稱,這樣您就可以檢視網站。
用滑鼠右鍵按一下您要為其建立憑證要求的 Web 網站然後按一下 [ 內容 ] 。
按一下 [ 目錄安全設定 ] 索引標籤。 在 [ 安全通訊 ,] 下按一下 [ 伺服器憑證 ]。 這會啟動 「 憑證安裝精靈 」。 按一下 [ 下一步 ] ,以繼續。
選取 處理序暫止的要求並安裝憑證 並按一下 [ 下一步 ] 。
型別的憑證,您在 [ 超過下列大小就發出及下載憑證 ] 下載位置區段,然後按一下 [ 下一步 ] 。 「 精靈 」 會顯示 [ 憑證摘要 ]。 請確認資訊是正確,然後按一下 [ 下一步 ] ,以繼續。
按一下 [ 完成 ] 以完成程序。
回此頁最上方
設定及測試憑證設定及測試憑證,請依照下列步驟執行:
在 [ 目錄安全設定 ] 索引標籤,在 安全通訊 ,請注意有是現在三個可用的選項。 若要設定網站需要安全連線,請按一下 [ 編輯 ] 。 [ 安全通訊 ] 對話方塊隨即出現。
選取 [ 必須使用安全通道 (SSL) ,按一下 [ 確定 ] 。
按一下 [ 套用 ] 然後按 [ 確定 ] 以關閉屬性工作表。
瀏覽至站台,並確認它運作。 如果要執行這項操作,請依照下列步驟執行。:
透過 HTTP 存取網站在瀏覽器中輸入 http://localhost/Postinfo.html 。 您收到類似下列的錯誤訊息:
HTTP 403.4-禁止: 需要 SSL。
嘗試瀏覽至相同的 Web 網頁在瀏覽器中輸入 https://localhost/postinfo.html 使用安全的連線 (HTTPS)。 您可能會收到安全性警示,指出憑證無法從受信任的根 CA 按一下 [ 是 ] 以繼續在 Web 網頁。 如果頁面出現,您已成功安裝您的憑證。
回此頁最上方
疑難排解
使用 SSL 會減慢 HTTP 伺服器和瀏覽器之間的效能。 如需詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件::
150031 (http://support.microsoft.com/kb/150031/ ) 使用 SSL 建立瀏覽器的效能負荷
當您在使用 Microsoft Visual InterDev 6.0 版給作者 Web 站台 」 SSL 時, 有一些問題和要考慮的限制。 如需詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件::
238662 (http://support.microsoft.com/kb/238662/ ) 使用 Visual InterDev 及 Secure Sockets Layer
本文將告訴您只能伺服器憑證。 伺服器憑證可讓使用者驗證您的伺服器,請檢查 Web 內容的有效性並建立安全的連線。 如果您也要驗證使用者瀏覽至您的網站使用者,您可能會考慮使用用戶端憑證。 典型的用戶端憑證含有多個項目的資訊: 使用者的憑證授權單位,公開金鑰,用來建立安全的通訊和驗證資訊,例如的到期日和序號識別之識別身份。
回此頁最上方
參魷 \ cs6 \ f1 \ cf6 \ lang1024 < 參考 >如需詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件::
228991 (http://support.microsoft.com/kb/228991/ ) 如何建立和 Internet Information Server 4.0 中安裝的 SSL 憑證
257591 (http://support.microsoft.com/kb/257591/ ) Secure Sockets Layer (SSL) 信號交換的描述
299525 (http://support.microsoft.com/kb/299525/ ) 如何設定 SSL 使用 IIS 5.0 與 Certificate Server 2.0
298805 (http://support.microsoft.com/kb/298805/ ) 如何互動與 Internet Information Services 中的您的 Web 網站的所有客戶啟用 SSL 如需詳細資訊,請參閱下列 Microsoft Developer Network (MSDN) 網站::
http://msdn2.microsoft.com/en-us/library/aa302412.aspx (http://msdn2.microsoft.com/en-us/library/aa302412.aspx)
回此頁最上方

用oledb 查 指定db內所有table

用oledb 查 指定db內所有table
///
/// 查詢db內所有table
///
/// db
/// StringCollection
protected StringCollection do_qry_tab(string Catalog)
{
StringCollection SC = new StringCollection();
OleDbConnection m_objConn = new OleDbConnection();
OleDbDataAdapter m_adper = new OleDbDataAdapter();
String CONNSTR = string.Empty;
CONNSTR = "Data Source=" + txt_server.Text + ";Initial Catalog=" + Catalog + ";Provider=SQLOLEDB;Persist Security Info=True;User ID=" + txt_id.Text + ";Password=" + txt_pw.Text + "";
m_objConn.ConnectionString=CONNSTR;
#region TRY
try
{
m_objConn.Open();
DataTable dt = new DataTable();
dt = m_objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new Object[] { null, null, null, "TABLE" }); // 若是查view 用"VIEW"
foreach (DataRow dr in dt.Rows)
{
SC.Add(dr["TABLE_NAME"].ToString());
}

}
catch (Exception)
{
throw;
}
finally
{
m_objConn.Close();
}
#endregion
return SC;
}

在 class 中叫用Request的方法

如果您在寫 asp.net, 在 *.aspx.vb or *.aspx.cs 中要取用Request / Cookie 等值,是很方便的, 但有時您會希望在撰寫 Class 時也能取用, 那麼您可以這麼做
1.直接將值在aspx.cs中取出後傳給此class
2.在class裡直接寫
System.Web.HttpContext.Current.Request...

PageBase介紹

PageBase撰寫

首先在專案上按滑鼠右鍵→加入新項目→選擇類別→名稱為【PageBase.vb】,
接著如果您沒有開啟個App_Code的資料夾,系統會問是否要新增App_Code資料夾,
並將該類別的程式內容放入該資料夾中,此時選是,會在App_Code中增加一個PageBase.vb的程式,
並且程式內容為一個空的Class
接著,把剛剛CodeFile要繼承System.Web.UI.Page的那行指令複製到PageBase中如下

Imports Microsoft.VisualBasic

Public Class PageBase
Inherits System.Web.UI.Page

End Class

此時就能夠發現該Class有了Page的相關事件可以選用
接著就來寫一下測試的Function,Property來測試看看,我們寫了個SayHi的Funcation,以及一個屬性來測試一下,原始碼如下

Imports Microsoft.VisualBasic

Public Class PageBase
Inherits System.Web.UI.Page


Public Function SayHello(ByVal InStr As String) As String
Return "Hello," + InStr
End Function

Dim _BrwP As Boolean = False

Public Property BrwP() As Boolean '瀏覽屬性
Get
Return _BrwP
End Get
Set(ByVal value As Boolean)
_BrwP = value
End Set
End Property

Public Sub ChkBrwP(ByVal UID As String)
If UID = "topcat" Then
Me.BrwP = True
Else
Me.BrwP = False
End If
End Sub

Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Response.Write("PageBase Load.
")
End Sub
End Class

寫完後請記得儲存一下,其他畫面才能夠直接使用剛剛撰寫在PageBase中的程式與屬性
再來新增一個aspx來測試一下,相關內容如下:
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
http://www.w3.org/1999/xhtml" >


CodeFile:default2.aspx.vb
原本繼承System.Web.UI.Page的地方,現在改成繼承剛剛的PageBase

Partial Class Default2
Inherits PageBase

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim UID As String = Request.QueryString("UID")

Dim Rc As String = Me.SayHello(UID)
Response.Write("Default2.aspx Load.
")
Response.Write(Rc & "
")
Me.ChkBrwP(UID)
Response.Write(Me.BrwP.ToString)

End Sub

Protected Sub btn2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btn2.Click
Response.Redirect("default2.aspx?UID=John")
End Sub

Protected Sub btn1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btn1.Click
Response.Redirect("default2.aspx?UID=topcat")
End Sub
End Class


====另一個sample=====
public class BasePage : System.Web.UI.Page
{
public BasePage():base()
{
}
protected override void OnPreLoad(EventArgs e)
{
base.OnPreLoad(e);
if (this.ValidatePermission() == false)
{
throw new Exception("滾吧!!你還沒有獲得這個頁面的授權!!");
}
}

protected virtual bool ValidatePermission()
{
return false;
}
}

加密的類別

using System;
using System.Security ;
using System.Security.Cryptography ;
using System.Diagnostics ;
using System.Web ;
using System.Text ;

namespace Bigeagle.Util
{
/// <summary>
/// 一個加密類
/// <br>Author: Bigeagle@163.net</br>
/// <br>Date: 2001/09/25</br>
/// <br>History: 2001/10/25 finished</br>
/// </summary>
/// <remarks>
/// 封裝常用的加密算法
/// </remarks>
public class Cryptography
{

/// <summary>
/// md5加密指定字符串
/// </summary>
/// <param name="a_strValue">要加密的字符串</param>
/// <returns>加密後的字符串</returns>
public static string EncryptMD5String(string a_strValue)
{
#if DEBUG
Debug.Assert(a_strValue.Trim() != "" , "空字符串" , "空字符串不需要加密") ;
#endif//DEBUG

//轉換成bytearray
Byte[] hba = ((HashAlgorithm) CryptoConfig.CreateFromName("MD5")).
ComputeHash(StringToByteArray(a_strValue));

return ByteArrayToString(hba) ;
}

/// <summary>
/// 判斷兩個加密字符串是否相同
/// </summary>
/// <param name="a_str1"></param>
/// <param name="a_str2"></param>
/// <returns>如果相同返回真</returns>
public static bool IsSame(string a_str1 , string a_str2)
{
Byte[] b1 = StringToByteArray(a_str1) ;
Byte[] b2 = StringToByteArray(a_str2) ;
if(b1.Length != b2.Length)
{
return false ;
}

for(int i = 0 ; i < b1.Length ; i ++)
{
if(b1[i] != b2[i])
{
return false ;
}
}

return true ;
}

/// <summary>
/// 轉換string到Byte樹組
/// </summary>
/// <param name="s">要轉換的字符串</param>
/// <returns>轉換的Byte數組</returns>
public static Byte[] StringToByteArray(String s)
{
/*
Char[] ca = s.ToCharArray();
Byte[] ba = new Byte[ca.Length];
for(int i=0; i<ba.Length; i++) ba[i] = (Byte)ca[i];
return ba;*/

return Encoding.UTF8.GetBytes(s) ;
}

/// <summary>
/// 轉換Byte數組到字符串
/// </summary>
/// <param name="a_arrByte">Byte數組</param>
/// <returns>字符串</returns>
public static string ByteArrayToString(Byte[] a_arrByte)
{
/*
//char[] ca = new char[a_arrByte.Length] ;
for(int i = 0 ; i < a_arrByte.Length ; i ++)
{
result += (char)a_arrByte[i] ;
}*/

return Encoding.UTF8.GetString(a_arrByte) ;
}


/// <summary>
/// 3des加密字符串
/// </summary>
/// <param name="a_strString">要加密的字符串</param>
/// <param name="a_strKey">密鑰</param>
/// <returns>加密後並經base64編碼的字符串</returns>
/// <remarks>靜態方法,採用默認ascii編碼</remarks>
public static string Encrypt3DES(string a_strString, string a_strKey)
{
TripleDESCryptoServiceProvider DES = new
TripleDESCryptoServiceProvider();
MD5CryptoServiceProvider hashMD5 = new MD5CryptoServiceProvider();

DES.Key = hashMD5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(a_strKey));
DES.Mode = CipherMode.ECB;

ICryptoTransform DESEncrypt = DES.CreateEncryptor();

byte[] Buffer = ASCIIEncoding.ASCII.GetBytes(a_strString);
return Convert.ToBase64String(DESEncrypt.TransformFinalBlock
(Buffer, 0, Buffer.Length));
}//end method

/// <summary>
/// 3des加密字符串
/// </summary>
/// <param name="a_strString">要加密的字符串</param>
/// <param name="a_strKey">密鑰</param>
/// <param name="encoding">編碼方式</param>
/// <returns>加密後並經base63編碼的字符串</returns>
/// <remarks>重載,指定編碼方式</remarks>
public static string Encrypt3DES(string a_strString, string a_strKey , Encoding encoding)
{
TripleDESCryptoServiceProvider DES = new
TripleDESCryptoServiceProvider();
MD5CryptoServiceProvider hashMD5 = new MD5CryptoServiceProvider();

DES.Key = hashMD5.ComputeHash(encoding.GetBytes(a_strKey));
DES.Mode = CipherMode.ECB;

ICryptoTransform DESEncrypt = DES.CreateEncryptor();

byte[] Buffer = encoding.GetBytes(a_strString);
return Convert.ToBase64String(DESEncrypt.TransformFinalBlock
(Buffer, 0, Buffer.Length));
}


/// <summary>
/// 3des解密字符串
/// </summary>
/// <param name="a_strString">要解密的字符串</param>
/// <param name="a_strKey">密鑰</param>
/// <returns>解密後的字符串</returns>
/// <exception cref="">密鑰錯誤</exception>
/// <remarks>靜態方法,採用默認ascii編碼</remarks>
public static string Decrypt3DES(string a_strString, string a_strKey)
{
TripleDESCryptoServiceProvider DES = new
TripleDESCryptoServiceProvider();
MD5CryptoServiceProvider hashMD5 = new MD5CryptoServiceProvider();

DES.Key = hashMD5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(a_strKey));
DES.Mode = CipherMode.ECB;

ICryptoTransform DESDecrypt = DES.CreateDecryptor();

string result = "";
try
{
byte[] Buffer = Convert.FromBase64String(a_strString);
result = ASCIIEncoding.ASCII.GetString(DESDecrypt.TransformFinalBlock
(Buffer, 0, Buffer.Length));
}
catch(Exception e)
{
#if DEBUG
Console.WriteLine("錯誤:{0}" , e) ;
#endif//DEBUG
throw(new Exception("Invalid Key or input string is not a valid base64 string" , e)) ;
}

return result ;
}//end method

/// <summary>
/// 3des解密字符串
/// </summary>
/// <param name="a_strString">要解密的字符串</param>
/// <param name="a_strKey">密鑰</param>
/// <param name="encoding">編碼方式</param>
/// <returns>解密後的字符串</returns>
/// <exception cref="">密鑰錯誤</exception>
/// <remarks>靜態方法,指定編碼方式</remarks>
public static string Decrypt3DES(string a_strString, string a_strKey , Encoding encoding)
{
TripleDESCryptoServiceProvider DES = new
TripleDESCryptoServiceProvider();
MD5CryptoServiceProvider hashMD5 = new MD5CryptoServiceProvider();

DES.Key = hashMD5.ComputeHash(encoding.GetBytes(a_strKey));
DES.Mode = CipherMode.ECB;

ICryptoTransform DESDecrypt = DES.CreateDecryptor();

string result = "";
try
{
byte[] Buffer = Convert.FromBase64String(a_strString);
result = encoding.GetString(DESDecrypt.TransformFinalBlock
(Buffer, 0, Buffer.Length));
}
catch(Exception e)
{
#if DEBUG
Console.WriteLine("錯誤:{0}" , e) ;
#endif//DEBUG
throw(new Exception("Invalid Key or input string is not a valid base64 string" , e)) ;
}

return result ;
}//end method


}
}

讓 DropDownList DataBind 不再發生錯誤

DropDownList 在執行 DataBind 動作時,若 Items 集合中不存在繫結的欄位值時會發生 Exception。不過 DropDownList 這種設計方式常會造成困擾,很多時候繫結的欄位值無法預期,而且 DropDownList 控制項在這種狀況釋出的錯誤在頁面程式碼中無法處理。

為了解決這種情形,比較快的方式就是直接改掉 DropDownList,在控制項中處理這種無法繫結的情形才是最終的解決方案。那我們該從何處下手呢?想想通常 DropDownList 控制項做資料繫結的是什麼屬性呢?沒錯,就是 SelectedValue 屬性,那我們就從覆寫 SelectedValue 屬性下手,改寫 SelectedValue 屬性的 Set 動作;當寫入 SelectedValue 屬性時的新值不存在 Items 集合中時,就直接設定其 SelectedIndex = -1。這樣就可以很簡單決解掉 DropDownList 繫結錯誤的問題了。

Public Class TBDropDownList
Inherits DropDownList

''' <summary>
''' 覆寫 SelectedValue 屬性。
''' </summary>
Public Overrides Property SelectedValue() As String
Get
Return MyBase.SelectedValue
End Get
Set(ByVal value As String)
Dim oItem As ListItem = Me.Items.FindByValue(value)
If (oItem Is Nothing) Then
Me.SelectedIndex = -1 '當 Items 不存在時
Else
MyBase.SelectedValue = value
End If
End Set
End Property

End Class

=========分隔線=======

我自己是用這種方法,見紅字部份

ddl_City.DataSource = ds.Tables["CITY"];
ddl_City.DataValueField = "DATA_INDEX";
ddl_City.DataTextField = "DATA_VALUE";
//以下兩行避免bind不到資料
ddl_City.AppendDataBoundItems = true;
ddl_City.Items.Add("");
ddl_City.DataBind();

========又一條分格線======

找到的另一種方法

UserRoleID.SelectedIndex = UserRoleID.Items.IndexOf(UserRoleID.Items.FindByValue(dr["UserRoleID"].ToString()));

就是如果通過FindByValue沒有找到指定項則為null,而Items.IndexOf(null)會返回-1.

ListItem item = DropDownList1.Items.FindByValue("qqcrazyer");
if(item != null)
{
item.Selected = true;
}

說明: 執行當前 Web 請求期間,出現未處理的異常。請檢查堆棧跟蹤信息,以瞭解有關該錯誤以及代碼中導致錯誤的出處的詳細信息。

異常詳細信息: System.ArgumentOutOfRangeException: 「UserRoleID」有一個無效 SelectedValue,因為它不在項目列表中

SMTP發信方式

在.NET中的System.Web.Mail名字空間下,有一個專門使用SMTP協議來發送郵件的類:SmtpMail,它已能滿足最普通的發送郵件的需求。這個類只有一個自己的公共函數--Send()和一個公共屬性-SmtpServer,您必須透過SmtpServer屬性來指定發送郵件的伺服器的名稱(或IP地址),然後再調用Send()函數來發送郵件。

代碼示例如下:
(in C#)
using System.Web.Mail;
public void sendMail()
{
try
{
System.Web.Mail.MailMessage myMail=new MailMessage();
myMail.From = "myaccount@test.com";
myMail.To = "myaccount@test.com";
myMail.Subject = "MailTest";
myMail.Priority = MailPriority.Low;
myMail.BodyFormat = MailFormat.Text;
myMail.Body = "Test";
SmtpMail.SmtpServer="smarthost"; //your smtp server here

 SmtpMail.Send(myMail);
}
catch(Exception e)
{
throw e;
}
}

您可以在Send函數的參數MailMessage對像中設定郵件的相關屬性,如優先級、附件等等。除了以MailMessage對像為參數(如上述代碼),Send函數還可以簡單的直接以郵件的4個主要資訊(from,to,subject,messageText)作為字元串參數來調用。

asp.net中獲取前一頁地址

上頁地址:
Request.UrlReferrer
Request.ServerViables["http_referer"]

在 gridview 裡顯示項次流水編號

< ItemTemplate>
<%#Container.DataItemIndex + 1%>
</ItemTemplate>

取WEB.CONFIG連線字串

// 取連線字串
public static string GetConnStr_NIM()
{
return ConfigurationManager.AppSettings.Get("DB_CONN"); //WEB.CONFIG的連線名稱
}

部署Crystal Report for ASP.NET 2.0

我們在另外一台電腦安裝Web專案時,
如果有用到Crystal Report , 則必需要安裝CRRedist2005_x86.msi及CRRedist2005_x86_cht.msi

通常如果有VS 2005的光碟,則可以選擇自訂安裝來安裝Crystal Report 10
但是如果沒有光碟,可以使用以下方法:

1.開啟VS 2005
2.選擇「檔案」-->「新增」-->「專案」-->選擇「其他專案類型」-->「安裝和部署」
3.選擇「Web安裝專案」
4.名稱就先取做 "WebSteup1"吧,按下確定產生專案
5.在方案總管選擇專案名稱後按右鍵 -->「屬性」
6.Click「必要條件」,然後打勾 Crystal Report for .NET Framework 2.0
7.build 一下專案

然後到專案目錄下的Debug\CrystalReports裡,就會看到有二個安裝檔CRRedist2005_x86.msi及CRRedist2005_x86_cht.msi,把這二個檔copy到伺服器裡安裝即可。

url rewrite 元件

常常有些人會問如何隱藏 Querystring,原因是 Querystring 裡面包含一些參數不想被使用者知道。以下文章就介紹如何使用 UrlRewriter.NET 套件,來幫助我們實現 Url Rewriting 將 Querystring 隱藏起來。

首先至 <a href="http://urlrewriter.net/">Open Source URL Rewriter for .NET / IIS / ASP.NET </a>下載 UrlRewriter.NET 套件
下載 urlrewiternet20rc1b6.zip 後,將 UrlRewriterV2\bin\Release\Intelligencia.UrlRewriter.dll 加入參考
設定 Web.config 檔案
</configuration>

<configSections>
<section name="rewriter"
requirePermission="false"
type="Intelligencia.UrlRewriter.Configuration.RewriterConfigurationSectionHandler, Intelligencia.UrlRewriter"/>
</configSections>

<system.web>
<httpModules>
<add name="UrlRewriter"
type="Intelligencia.UrlRewriter.RewriterHttpModule, Intelligencia.UrlRewriter"/>
</httpModules>
</system.web>

<rewriter>
<rewrite url="~/Books/(\d+)/Default.aspx" to="~/Books.aspx?bookID=$1"/>
</rewriter>

</configuration>
其中比較注意的是 <rewriter> 區塊的部分,url 表示來源網址,to 表示目的網址。舉例來說,你的網址是 Books/1234/Default.aspx 時,UrlRewiter 就幫你 Url 轉向 Books.aspx?bookID=1234。其中 (\d+) 是一種 Regular Expression(Regex)的表示方法,表示由 0-9 組合而成的字串組合,$1 則代表 url 符合 Regex 的字串變數。當你有多組 Regex,則就會有 $1、$2、$3...以此類推。

Calendar 控制項日期複選

Calendar 控制項可以透過 SelectedDate 屬性來取目前選取的日期,不過它沒有提供日期複選的功能。為達到日期複選的功能,我們在 DayRender 事件中,為每一個日期儲存格加入一個 HtmlInputCheckBox 控制項做日期選取,當 PostBack 時再透過 Request.Form 來取得用戶端複選的日期。

Partial Class _Default
Inherits System.Web.UI.Page

Protected Sub Calendar1_DayRender(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DayRenderEventArgs) Handles Calendar1.DayRender
Dim oCheckBox As New HtmlControls.HtmlInputCheckBox()

oCheckBox.Value = e.Day.Date.ToShortDateString
oCheckBox.ID = "SelectDate"
e.Cell.Controls.Clear()
e.Cell.Controls.Add(oCheckBox)
e.Cell.Controls.Add(New LiteralControl(e.Day.DayNumberText))
End Sub

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
Me.Response.Write("SelectDate: " & Me.Request.Form("SelectDate"))
End Sub
End Class
Partial Class _Default
Inherits System.Web.UI.Page

Protected Sub Calendar1_DayRender(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DayRenderEventArgs) Handles Calendar1.DayRender
Dim oCheckBox As New HtmlControls.HtmlInputCheckBox()

oCheckBox.Value = e.Day.Date.ToShortDateString
oCheckBox.ID = "SelectDate"
e.Cell.Controls.Clear()
e.Cell.Controls.Add(oCheckBox)
e.Cell.Controls.Add(New LiteralControl(e.Day.DayNumberText))
End Sub

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
Me.Response.Write("SelectDate: " & Me.Request.Form("SelectDate"))
End Sub
End Class
執行程式,勾選了6/2、6/10、6/18 三個日期。

當按下按鈕產生 PostBack 時,透過 Request.Form 即可取得複選的日期。

asp.net ajax 彈不出alert對話框的解決辦法

想用js腳本輸出一些提示,可是不管是用 Page.RegisterClientScriptBlock還是用 Page.RegisterStartupScript

注冊,該死的提示信息總是不出來。其實不是不出來,只是我們叫錯了它們的名字,我們只要用下面的這條語句︰
ScriptManager.RegisterClientScriptBlock(UpdatePanel1, this.GetType(), "click", "alert('提示信息')", true);

就可以正常的彈出alert對話框了。

注︰如果在頁面中有多個UpdatePanel,如果每個UpdatePanel的UpdateMode都是“always”[默認值]的話,

那麼你使用那個UpdatePanel的實例作為參數都可以;如果每個UpdaePanel的UpdateMode=conditional,

那麼你必須使用正在更新的那個UpdatePanel作為參數,這樣腳本才能起作用。

所以...我把msg Function 改為..

///
/// display msg : msg("")
///

///
protected void AJAX_msg(string msgstr)
{
msgstr = msgstr.Replace("'", "").Replace("\n", "").Replace("\r", "").Replace('"', '”').Replace("(", "(").Replace(")", ")").Replace(";", ";");
string javastr = "alert('" + msgstr.ToString() + "' );\n";
ScriptManager.RegisterClientScriptBlock(UpdatePanel1, this.GetType(), "AJAX_msg", javastr, true);
}

C#中一些字符串操作的常用用法

//獲得漢字的區位碼
  byte[] array = new byte[2];
  array = System.Text.Encoding.Default.GetBytes("啊");

int i1 = (short)(array[0] - ''\0'');
  int i2 = (short)(array[1] - ''\0'');

//unicode解碼方式下的漢字碼
  array = System.Text.Encoding.Unicode.GetBytes("啊");
  i1 = (short)(array[0] - ''\0'');
  i2 = (short)(array[1] - ''\0'');

//unicode反解碼為漢字
  string str = "4a55";
  string s1 = str.Substring(0,2);
  string s2 = str.Substring(2,2);

int t1 = Convert.ToInt32(s1,16);
  int t2 = Convert.ToInt32(s2,16);

array[0] = (byte)t1;
  array[1] = (byte)t2;

string s = System.Text.Encoding.Unicode.GetString(array);

//default方式反解碼為漢字
  array[0] = (byte)196;
  array[1] = (byte)207;
  s = System.Text.Encoding.Default.GetString(array);

//取字符串長度
  s = "iam方槍槍";
  int len = s.Length;//will output as 6
  byte[] sarr = System.Text.Encoding.Default.GetBytes(s);
  len = sarr.Length;//will output as 3+3*2=9

//字符串相加
  System.Text.StringBuilder sb = new System.Text.StringBuilder("");
  sb.Append("i ");
  sb.Append("am ");
  sb.Append("王小明");

/////////////////////////////////////////////////////////////////////
string --> byte array

byte[] data=Syste.Text.Encoding.ASCII.GetBytes(string);

string --> byte

byte data = Convert.ToByte(string);

byte[]-->string

string string = Encoding.ASCII.GetString( bytes, 0, nBytesSize );

Response.Redirect 打開新窗口的兩種方法

一般情況下,Response.Redirect 方法是在服務器端進行轉向,因此,除非使用 Response.Write("<script>window.location='http://dotnet.aspx.cc';</script>") 方法外,是不能在新窗口打開所指定的 URL 地址的。但是,如果仔細分析一下,如果設置 form 元素的 target 屬性,還是有辦法打開新窗口的。下面就是可以採用的兩種方法。

方法一:在服務器端設置 target 屬性,這個方法也非常適用於客戶端不支持腳本的情況。代碼如下:

<%@ Page Language="C#" AutoEventWireup="true" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

protected void Page_Load(object sender, EventArgs e)
{
form1.Target = "_blank";
}

protected void Button1_Click(object sender, EventArgs e)
{
//Response.Redirect("http://dotnet.aspx.cc");
}
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title></title>
</head>
<body id="b" runat="server">
<form id="form1" runat="server">
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="打開新窗口或者新 Tab " />
</form>
</body>
</html>

辦法二:採用客戶端腳本的方法設置 target 屬性。代碼如下:

<%@ Page Language="C#" AutoEventWireup="true" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

protected void Page_Load(object sender, EventArgs e)
{
Button1.Attributes.Add("onclick", "this.form.target='_newName'");
}

protected void Button1_Click(object sender, EventArgs e)
{
//Response.Redirect("http://dotnet.aspx.cc");
}
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title></title>
</head>
<body id="b" runat="server">
<form id="form1" runat="server">
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="打開新窗口或者新 Tab " />
</form>
</body>
</html>

上面兩種方法中的 target 屬性可以採用任何合法的名稱,但要注意,如果相同名稱的窗口已經打開,則新窗口會在已經存在名稱的窗口裡打開。

如果需要設置彈出窗口的寬度和高度,可以修改為下面的方法:

<%@ Page Language="C#" AutoEventWireup="true" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

protected void Page_Load(object sender, EventArgs e)
{
string WindowName = "win" + System.DateTime.Now.Ticks.ToString();
Page.RegisterOnSubmitStatement("js", "window.open('','" + WindowName + "','width=600,height=200')");
form1.Target = WindowName;
}

protected void Button1_Click(object sender, EventArgs e)
{
//Response.Redirect("http://dotnet.aspx.cc");
}
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title></title>
</head>
<body id="b" runat="server">
<form id="form1" runat="server">
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="打開新窗口或者新 Tab " />
</form>
</body>
</html>

.NET環境下幾種不同的郵件發送解決方案

無法查看此摘要。請 按這裡查看文章。

C#使用MY物件

如何在 C# 中調用 VB.Net 2005 的 My 物件及其他函數
相信玩過 VB 2005 的朋友都知道它內建了個 My 物件,功能強大使用方便。
My 物件將特定功能封裝,無需宣告,不用建個體,直接使用,提供 VB 開發者輕鬆建構應用程式。

物 件 動 作
My.Application 物件 存取應用程式資訊和服務。
My.Computer 物件 存取主機電腦及其資源、服務和資料。
My.Forms 物件 存取目前專案中的表單。
My.Log 物件 存取應用程式記錄檔。
My.Request 物件 存取目前的 Web 要求。
My.Resources 物件 存取資源項目。
My.Response 物件 存取目前的 Web 回應。
My.Settings 物件 存取使用者和應用程式層級設定。
My.User 物件 存取目前使用者的安全性內容。
My.WebServices 物件 存取目前專案所參考的 XML Web Service。

SqlDataReader 範本

Dim dr as SqlDataReader
Dim Conn as SqlConnection
Dim cmd as SqlCommand

Conn= new SqlConnection("資料庫的連線字串,請自己修改")
cmd = new SqlCommand("SELECT * from 資料表", mySqlConnection)

try
Conn.Open()
dr = cmd.ExecuteReader()

do while (dr.Read())
'--把資料展現到畫面上。請自由發揮
loop

catch e as Exception
Response.Write(e.ToString())

finally
if Not (dr is Nothing) ' --關閉 DataReader
dr.Close()
end if

if (Conn.State = ConnectionState.Open) ' --關閉 DB的連線
Conn.Close()
end if
end try


//-----------------方法二-----------

Dim queryString As String = "SELECT * From 資料表;"

Using Conn As New SqlConnection("資料庫的連線字串")
Dim my_command As New SqlCommand(queryString, Conn)
Conn.Open()
'-- 資料庫連線!但後面「不」需要寫關閉的動作(Conn.Close()),因為Using....End Using 會自己處理

Dim reader As SqlDataReader = my_command.ExecuteReader()

While reader.Read()
'-- 自己寫程式,展現欄位的值。
End While

'-- 關閉DataReader
reader.Close()
End Using

擴展 GridView 控制項 加入匯出 Excel & Word 功能

擴展 GridView 控制項 加入匯出 Excel & 匯出 Word

Imports System
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Text
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Drawing

Namespace WebControls
< _
Description("TBGridView 控制項"), _
ToolboxData("<{0}:TBGridView runat=server>") _
> _
Public Class TBGridView
Inherits GridView

'''
''' GridView 控制項匯出 Excel 文件。
'''

Public Sub ExportExcel()
Export(Encoding.UTF8, "gridview.xls", "application/ms-excel")
End Sub

'''
''' GridView 控制項匯出 Word 文件。
'''

Public Sub ExportWord()
Export(Encoding.UTF8, "gridview.doc", "application/ms-word")
End Sub

'''
''' GridView 控制項匯出。
'''

''' 編碼方式。
''' 檔案名稱。
''' 內容類型標頭。
Public Sub Export(ByVal Encoding As Encoding, ByVal FileName As String, ByVal ContentType As String)
Dim oResponse As HttpResponse
Dim oStringWriter As System.IO.StringWriter
Dim oHtmlWriter As System.Web.UI.HtmlTextWriter
Dim bAllowPaging As Boolean
Dim sText As String
Dim sFileName As String

If TypeOf Me.Page Is TBBasePage Then
DirectCast(Me.Page, TBBasePage).IsVerifyRender = False '頁面不需驗證控制項
End If

'檔案名稱需經 UrlEncode 編碼,解決中文檔名的問題
sFileName = HttpUtility.UrlEncode(FileName, Encoding)

oResponse = HttpContext.Current.Response
oResponse.Clear()
sText = "<meta http-equiv='Content-Type'; content='text/html';charset='{0}'>"
sText = String.Format(sText, Encoding.WebName)
oResponse.Write(sText)
oResponse.AddHeader("content-disposition", "attachment;filename=" & sFileName)
oResponse.ContentEncoding = Encoding
oResponse.Charset = Encoding.WebName
oResponse.ContentType = "application/ms-excel"

' If you want the option to open the Excel file without saving than
' comment out the line below
' oResponse.Cache.SetCacheability(HttpCacheability.NoCache)

oStringWriter = New System.IO.StringWriter()
oHtmlWriter = New System.Web.UI.HtmlTextWriter(oStringWriter)
bAllowPaging = Me.AllowPaging
If bAllowPaging Then
Me.AllowPaging = False
If Me.RequiresDataBinding Then
Me.DataBind()
End If
End If

Me.RenderControl(oHtmlWriter)

If bAllowPaging Then
AllowPaging = bAllowPaging
End If
oResponse.Write(oStringWriter.ToString())
oResponse.End()
End Sub

End Class
End Namespace

程式設定EXCEL 格式

private void button1_Click(object sender, EventArgs e)
...{
if (openFileDialog1.ShowDialog() == DialogResult.OK)
...{
Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();
Microsoft.Office.Interop.Excel.Worksheet excelWs;
Microsoft.Office.Interop.Excel.Workbook excelWorkbook = excelApp.Workbooks.Open(openFileDialog1.FileName,
Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing);

excelWs = (Microsoft.Office.Interop.Excel.Worksheet)excelWorkbook.Worksheets.get_Item(1);//取得第一個sheet

設定小大位置#region 設定小大位置
excelWs.Cells.VerticalAlignment = Microsoft.Office.Interop.Excel.XlVAlign.xlVAlignTop; //垂直調準
excelWs.Cells.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignLeft;//水平調準
excelWs.Cells.EntireRow.AutoFit(); //自動調整列高
excelWs.Cells.EntireColumn.AutoFit(); //自動調整欄寬
#endregion

設定顏色#region 設定顏色
excelWs.get_Range("B:B", Type.Missing).Font.Color = 255;
excelWs.get_Range("D:D", Type.Missing).Font.Color = 255;
excelWs.get_Range("E:J", Type.Missing).Font.Color = 255;
#endregion

調整儲存格格式#region 調整儲存格格式
excelWs.get_Range("B:B", Type.Missing).NumberFormatLocal = "@";
excelWs.get_Range("E:F", Type.Missing).NumberFormatLocal = "@";
excelWs.get_Range("I:J", Type.Missing).NumberFormatLocal = "@";
#endregion

ClearCom(excelWs);
excelWorkbook.Close(true, Type.Missing, Type.Missing);

ClearCom(excelWorkbook);
excelApp.Workbooks.Close();
excelApp.Quit();
ClearCom(excelApp);

excelWs = null;
excelWorkbook = null;
excelApp = null;
MessageBox.Show("設定完成");
}
}

static void ClearCom(object o)
...{
try
...{
System.Runtime.InteropServices.Marshal.ReleaseComObject(o);
}
catch ...{ }
finally
...{
o = null;
}
}

ASP.NET中獲取URL的方法

HttpContext.Current.Request.PhysicalPath.ToString()

ASP.NET中獲取URL的方法
HttpContext.Current.Request.Url.ToString() 並不可靠。
如果當前URL為
http://localhost/search.aspx?user=http://csharp.xdowns.com&tag=%BC%BC%CA%F5
通過HttpContext.Current.Request.Url.ToString()獲取到的卻是
http://localhost/search.aspxuser=http://csharp.xdowns.com&tag=¼¼Êõ
正確的方法是:HttpContext.Current.Request.Url.PathAndQuery
通過ASP.NET獲取URL地址方法

如果測試的url地址是http://www.test.com/testweb/default.aspx, 結果如下:
Request.ApplicationPath: /testweb
Request.CurrentExecutionFilePath: /testweb/default.aspx
Request.FilePath: /testweb/default.aspx
Request.Path: /testweb/default.aspx
Request.PhysicalApplicationPath: E:\WWW\testwebRequest.PhysicalPath:
Request.PhysicalPath: E:\WWW\testweb\default.aspx
Request.RawUrl: /testweb/default.aspx
Request.Url.AbsolutePath: /testweb/default.aspx
Request.Url.AbsoluteUrl: http://www.test.com/testweb/default.aspx
Request.Url.Host: www.test.com
Request.Url.LocalPath: /testweb/default.aspx

移除最後一個逗號

string str="a,b,c,d,";
str=str.TrimEnd(',');

2009年4月24日 星期五

部落格無「網」不利 部落客網路開店正紅

部落格行銷是近年最熱門的行銷術之一,甚至部落客也因為網友的點閱率大增,變身為部落客紅人,現在連網路購物商場也成為部落客創業的新趨勢。

  對商品業者而言,部落格可能是有效的行銷工具之一,由於現在消費者在購物前,習慣上網蒐集其他網友的意見及反應,而部落客把店家的產品、活動或訊息,透過使用後發表的心得文字、照片或影片呈現、分享,透過網友間彼此的互動討論,帶動商品的買氣及部落格人氣指數。

  原本是促進商品行銷活動一環的部落客,現在也流行在網路商場開店,利用擁有的人氣口碑,連帶衝高商店買氣,現在部落客的行銷魅力可說是無「網」不利。

  例如貓咪達人陳怡芬開設的「咪達寵物精品」,兩隻貓寶貝「咪董」、「鈴董」從網誌可愛到網店裡,當起動物模特兒示範商品特色。陳怡芬也利用部落格圖文穿插的方式撰寫商品介紹,設計各種情境商品照,讓消費者輕鬆瞭解商品的特色。

  另外,經營部落格的鐵律,是頻繁更新部落格來吸引網友定期瀏覽、提升人氣指數。陳怡芬也指出,雖然尋找新商品的過程很辛苦,但以一天更新1至2項商品的頻率,網友們才天天期盼,來店率才會大增。

  而部落格的互動性,更是網路店家採購進貨或提升能見度、顧客好感度的最佳參考。把顧客族群鎖定在上班族的梁瓊文,除了是部落客外,也在網路商店經營「方便美食主義」。

  梁瓊文透過部落格向網友介紹如何3分鐘變出美食的快速烹調秘訣,吸引上班族爭相走告賣場產品,包括三星蔥仔餅、3分鐘義大利麵等快速烹煮食品的美味,讓其他網友也被吸引至他的網路賣場,來客數增加下,也帶動網友買氣。

  PChome開店事業部總監魏丞慶表示,部落客網路創業是近期的趨勢,藉由擅長的領域,透過網誌分享多方面的資訊,並提供網友實用的建議,長期所累積的口碑,使這群部落客在網路販售的商品,更容易被消費者接受。

2009年4月23日 星期四

關於「預設管理共用」在使用時的注意事項

上次在客戶那邊遇到一個資料備份的問題,由於客戶之前的伺服器都是透過一個特定的網路分享目錄進行資料備份 ( 例如: \\xxxx\share1 ),但是主機重整之後想說直接改用預設管理共用(Default Administrative Shares)的方式備份檔案 ( 例如: \\xxxx\c$\share1 ),但卻怎麼設定都沒辦法從遠端寫入資料,即便將該使用者在分享目錄的本機安全性權限設定為「完全控制」,一樣無法寫入遠端的預設管理共用目錄。

上網搜尋了一些資料後才發現,原來在 Windows 2000 與 Windows XP 中,只有當使用者是 Administrators, Backup Operators, 或 Server Operator 群組的成員,才具有權限可以寫入預設管理共用的目錄。當然,該使用者還是必須要有該目錄的本機存取權限才行。

另外,預設管理共用 (Default Administrative Shares) 也有許多同義字,包括 特殊共用 (Special Shares)、自動隱藏共用 (Automatic Hidden Shares) 等。

如果你想查詢你的電腦中有哪些預設共用或所有已分享的共用目錄,可以點選 [控制台] -> [系統管理工具] -> [電腦管理] 中的 [系統工具] -> [共用資料夾] -> [共用]

如何建立及刪除用戶端電腦上的隱藏或系統管理共用

如何在 Microsoft Windows XP Professional、Windows 2000 Professional 及 Windows NT 4.0 Workstation 電腦上,建立及刪除隱藏或系統管理共用。

隱藏共用的共用名稱之後會指定以錢幣符號 ($)。當您查看電腦上的共用,或使用 net view 命令時,不會列出隱藏共用。<適用於>一節中所列的 Windows 版本,會建立隱藏系統管理共用,供系統管理員、程式及服務管理網路上的電腦環境之用。預設 Windows 可以啟用下列隱藏系統管理共用:
根磁碟分割或磁碟區
系統根資料夾
FAX$ 共用
IPC$ 共用
PRINT$ 共用
根磁碟分割與磁碟區共用會以磁碟機代號名稱加上 $ 符號。例如,磁碟機代號 C 與 D 共用即為 C$ 與 D$。

系統根資料夾 (%SYSTEMROOT%) 共用則是 ADMIN$。這是您的 Windows 資料夾,而此系統管理共用則可方便於系統管理員透過網路存取系統根資料夾階層。

FAX$ 共用是供傳真用戶端傳送傳真之用。這個共用資料夾會快取檔案,並存取儲存在檔案伺服器上的封面頁。

IPC$ 共用會在用戶端與伺服器利用具名管道建立暫時連線,以利網路程式之間通訊時使用。主要會用於網路伺服器的遠端管理。

PRINT$ 共用會用於印表機的遠端管理。

電腦所建立的隱藏系統管理共用 (如 ADMIN$ 與 C$) 可以刪除,但電腦會在您停止後重新啟動伺服器服務,或重新啟動電腦之後,重新建立這些隱藏系統管理共用。使用者建立的隱藏共用可以刪除,但不會在重新啟動電腦之後重新建立。Microsoft Windows XP Home Edition 不會建立隱藏系統管理共用。

建立隱藏共用
如果要建立隱藏共用,請依照下列步驟執行:
1.在 [控制台] 中,按兩下 [系統管理工具],再按兩下 [電腦管理]。
2.展開 [共用資料夾],用滑鼠右鍵按一下 [共用],然後按一下 [新增檔案共用]。
3.在 [共用的資料夾] 方塊中輸入所要共用的資料夾路徑,或按一下 [瀏覽],以尋找資料夾。
4.輸入所要使用的共用名稱,並加上錢幣符號,然後按一下 [下一步]。
5.如果要將共用限制為僅供系統管理員存取,請選取 [系統管理員有完全控制權;其他使用者沒有任何存取權] 核取方塊,然後按一下 [完成]。
6.按一下 [是],以建立其他共用,或按一下 [否],以返回 [電腦管理] 主控台。

刪除隱藏共用
如果要刪除隱藏共用,請依照下列步驟執行:
1.在 [控制台] 中,按兩下 [系統管理工具],再按兩下 [電腦管理]。
2.展開 [共用資料夾],再按一下 [共用]。
3.在 [共用的資料夾] 欄位中,用滑鼠右鍵按一下所要刪除的共用,再按一下 [停止共用],然後按一下 [確定]。

預設管理共用(Administrative Shares)與隱藏共用 [Archive]

在 NT 的作業系統(WinNT/Windows 2000/Windows XP/Windows Server 2003)中有所謂的 預設管理共用(Default Administrative Shares),或稱為特殊共用(Special Shares)、自動隱藏共用(Automatic Hidden Shares),這是除了使用者或管理員建立的共用之外,系統建立做為管理用的共用,這些共用(建議)是不要修改或刪除的。您最可能看到的特殊共用是顯示為 C$、D$、E$ 等等及 ADMIN$ 共用。這些共用可讓管理員(Administrators、Backup Operators 和 Server Operators )連線到沒有共用顯示的磁碟上。

預設管理共用是作業系統安裝的一部分。根據電腦的設定不同,可能會有一部分或所有下列的特殊共用。
ADMIN$:在電腦的遠端管理中使用。這個路徑通常是
\WINNT(也就是系統根目錄 systemroot)。這樣的設定可以讓管理員在不知道目錄名稱的情況下連到 Windows 的安裝目錄。

driveletter$:所指定磁碟的根目錄。這樣的設定是方便管理員遠端管理電腦之用。在 Windows 2000 Professional 電腦中,只有 Administrators 和 Backup Operators 可以連線到這個共用。

IPC$:在遠端管理和檢視共用資源時使用。這個共用是通訊的根本,請不要變更、修改或刪除它。

PRINT$:支援共用印表機的資源。當電腦安裝第一台共享的印表機之後,\Systemroot\System32\Spool\Drivers 就會自動共享為 PRINTER$,讓用戶端電腦下載印表機驅動程式之用。Administrators、Backup Operators 和 Server Operators 有完全控制(Full Control)的權限,而 Everyone 有唯讀(Read)的權限。

FAX$:REPL$!?當傳真用戶端傳送傳真時在伺服器中建立。
NETLOGON:systemroot\SYSVOL\sysvol\domail\SCRIPTS。由處理網域登入時的 Windows NT Server 伺服器的 Net Logon 服務使用。這些資源只提供給伺服器,而不提供給 Windows NT Workstation。
SYSCOL:systemroot\SYSCOL\sysvol。
 
要連線到另一台電腦中的非共用磁碟,請在視窗中使用位址列,並輸入位址,使用語法為:
\\computer_name\[driveletter]$

關閉網路芳鄰分享服務

在公司或家中使用筆電常常為了方便,把目錄甚至整個磁碟利用網芳分享出去,但是當筆電帶到別人公司時,已開的網芳不小心就全都露了,有時還可以順便測試別人家的網芳是否有病毒

大部分的狀況,Windows 裝完,只要有裝網卡,都會啟動網芳相關的服務,即使您沒有使用網芳分享,也是一樣。

以下就來介紹如何關閉網芳分享的服務,及在必要時再開啟它的方法。

網芳的服務可分為「Server」及「Workstation」,如果您要把印表機/檔案分享出去,則需要啟動「Server」的服務,而如果您要讀取或使用別人網芳上的檔案或印表機,則需要啟動「Workstation」的服務。Workstation 因為有多項服務依存在它上面,還是保留它自動啟動。本次的目的主要是不讓自己的網芳分享出去,所以,只處理「Server」的服務。

如果您希望預設是提供網芳服務,則您只需要把附件下載後,在不想提供網芳服務時,執行「網路芳鄰關閉.bat」即可關閉網芳服務。在關閉時,仍然可以透過網芳讀取別人的檔案或印表機。

如果您希望預設是不提供網芳服務,則您可以先把「Computer Browser」及「Server」兩項服務由自動啟動,改成手動啟動。當您需要提供網芳服務時,再執行「網路芳鄰啟用.bat」即可啟用網芳服務。

以下是批次檔的內容:
※ 網路芳鄰關閉.bat
@echo off
echo.================================================================
echo.{STOP} Computer Browser and Server Service (網路芳鄰之分享)
echo.----------------------------------------------------------------
echo.2008-10-28 by Dung-Liang Lee (dllee) http://blog.yam.com/dllee
echo.================================================================
net stop "Computer Browser"
net stop Server

※ 網路芳鄰啟用.bat
@echo off
echo.================================================================
echo.{START} Computer Browser and Server Service (網路芳鄰之分享)
echo.----------------------------------------------------------------
echo.2008-10-28 by Dung-Liang Lee (dllee) http://blog.yam.com/dllee
echo.================================================================
echo.start Computer Browser and Server Service...
NET START "Computer Browser"
IF ERRORLEVEL 2 GOTO THEEND
IF ERRORLEVEL 1 GOTO sNOTrun
GOTO THEEND

:sNOTrun
echo.
echo.部分服務無法啟動!! Some service is not start-up!!
echo.您可以再試一次。 You can try again.

:THEEND
pause

關閉WinXP預設分享磁碟

※windows XP 本身會有預設的分享資料夾,只是隱藏起來而已。
在命令提示字元打上 net share 就可以看出來預設的分享,例如 admin$、C$...等等
在分享的資料夾後面加上$就會隱藏起來了!
刪除的語法是
net share /del c$

其中的C$可以換成其它的分享資料夾。
但是刪除完一開機又會再出現,那只好從regedit裡改了。
將下列文字用筆記本存成:關閉WinXP預設分享磁碟.reg

=======從下一列開始==============================================
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters]
"AutoShareServer"=dword:00000000
"AutoShareWks"=dword:00000000
=======到上一列結束==============================================

然後點兩下此檔案便可關閉預設分享。
IPC$是預設開啓,要用另外的方法關閉。

※您或許不知道, 除了平時我們自行設定分享出來的資料夾外, Windows XP 預設會將系統資料夾、各磁碟機, 暗自分享出來。這些系統暗自分享的資料夾, 由於名稱都被動過手腳, 所以並不會在網路上的芳鄰中出現, 使用者往往也就忽略了其中的危險性。其實只要在要連線的資料夾名稱後面加上一個 "$" 符號, 就可以輕易讓它們現出原形:

先開啟網路上的芳鄰, 並切換到自己電腦
在網址列輸入" \\電腦名稱\C$"
接著就可以切換到 C 磁碟下
雖說想要遠端存取這些資料夾必須具備電腦系統管理員的權限, 一般人並無法擅自闖入, 不過要是碰到熟悉 XP 運作原理的電腦高手, 難保資料不會有外洩的顧慮, 建議您修改登錄檔內容, 將這些系統預設開啟的分享資料夾封印起來:

切換到 "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanman-server\parameters" 機碼
在右邊窗格按滑鼠右鈕執行 "DWORD 值(D)" 命令, 準備新增登錄值
將登錄值命名為 "AutoShareServer"
登錄值內容維持預設的 "0", 如此即可關閉各磁碟的分享
接著再新增一個 DWORD 類型的登錄值, 並命名為 "AutoShareWKs"
登錄值內容同樣維持預設的 "0", 即可取消系統資料夾的分享
修改完畢後, 必須重新開機才可讓設定生效, 您可再次進入網路上的芳鄰看看修改成果, 此後再次嘗試切換到自己電腦的 C$ 資料夾, 會發現進不去了, 表示設定已生效。

2009年4月22日 星期三

程式畫面顯示亂碼的問題


亂碼畫面

解決方法
可將.aspx 及 .aspx.cs檔案,放置記事本中,將其檔案編碼由 ANSI 改成 UTF-8 在另存新檔就可以瞜

2009年4月21日 星期二

CSS 於 MasterPage 無法正常套用問題

將CSS Link 於 MasterPage ,但卻無法正常套用CSS樣式
其原因可能是




可將CSS檔案,放置記事本中,將其檔案編碼由 ANSI 改成 UTF-8 在另存新檔就可以瞜

ASP.Net 讀取Word檔, 點選後出現另存新檔(SaveAS)對話框 (使用C#)

ASP.Net 讀取Word檔, 點選後出現另存新檔(SaveAS)對話框 (使用C#)

//呼叫方法
DownloadFile("applyform.doc", System.IO.File.ReadAllBytes(context.Server.MapPath("/temp/applyfrm.doc")));

///
/// 下載Word檔
///

/// 另存新檔的檔名
/// Word檔內容
private void DownloadFile(string FileNameWhenUserDownload, byte[] FileContent)
{
Response.ClearHeaders();
Response.Clear();
Response.Expires = 0;
Response.Buffer = true;
Response.AddHeader("Accept-Language", "zh-tw");
Response.AddHeader("content-disposition", "attachment; filename=" + FileNameWhenUserDownload);
Response.ContentType = "Application/msword";
Response.BinaryWrite(FileBody);
Response.End();
}