2011年9月24日 星期六

select count(0) 和select count(*)

select count(*) :查询所有列
select count(0):忽略所有列,用数字效率要高一些,毕竟是要统计行数,与列无关。

2011年9月20日 星期二

google 你+ (社群系統啟動了)

google 真是猛,一推出測試就有此驚豔的GUI界面和強悍的功能表現
趕快加入:你+
值得推薦


cast 日期時間的比較

參考:datetime (Transact-SQL)

--
select CAST ('2011/3/3 11:11:11' as time)
select CAST ('2011/3/3 11:11:11' as date)
select CAST ('2011/3/3 11:11:11' as smalldatetime)
select CAST ('2011/3/3 11:11:11' as datetime)
select CAST ('2011/3/3 11:11:11' as datetime2)
select CAST ('2011/3/3 11:11:11' as datetimeoffset)

over (Partition by...) 用法

row_number() over(partition by ... order by ...)
rank() over(partition by ... order by ...)
dense_rank() over(partition by ... order by ...)
count() over(partition by ... order by ...)
max() over(partition by ... order by ...)
min() over(partition by ... order by ...)
sum() over(partition by ... order by ...)
avg() over(partition by ... order by ...)
first_value() over(partition by ... order by ...)
last_value() over(partition by ... order by ...)
lag() over(partition by ... order by ...)
lead() over(partition by ... order by ...)

2011年9月19日 星期一

MS-SQL 資料庫自動備份/手動還原工具

MS-SQL DB Backup / Restore Tools (v) 1.00
(MS-SQL 資料庫自動備份/手動還原工具)





必安裝作業系統環境需求:
1.Framework 3.5 SP1(含)以上
2.Microsoft SQL Server 2008 Management Studio Express 微軟官網下載


可備份/還原的MS-SQL版本:
1.MS-SQL 2000/全部版本
2.MS-SQL 2005/全部版本
3.MS-SQL 2008/全部版本


【備份模式:近端 (local)】
1.允許備份所有資料庫
2.資料庫備份檔在本機端
3.備份區分:
週.月方式,共7個時間點(24hr)
4.將手動還原時,自動強制關閉所有連線的程式後;進行還原動作
(設置連線MS-SQL帳號權限要夠大)


【備份模式:遠端 (remote)】
1.允許備份所有資料庫
2.資料庫備份檔在遠端
3.備份區分:
週.月方式,共7個時間點(24hr)
4.將手動還原時,自動強制關閉所有連線的程式後;進行還原動作
(設置連線MS-SQL帳號權限要夠大)

近期將釋放此工具版本,使用分:免費版/註冊版
免費版:只能自動備份一組時間,執行完備份後;自動結束!
註冊版:無功能限制
註冊費:500 NT(新臺幣),註冊採用匯款/ATM方式

測試滿意後,再進行付費註冊即可
近期將會釋放版本
----
MS-SQL DBBRT 最新日期:2011/9/22 版本:1.00 下載

IIS 默認的文檔無效解決方法

請參考此篇
--
另一解決方式:
重新啟動IIS

透過批次檔及排程自動備援MS-SQL

參考
--
引用:
援伺服器中建立一個批次檔(.bat),其內容如下:
xcopy \\192.168.1.3\dabasesync\db.bak d:\databasesync\ /y /s
osql -S "備援伺服器電腦名稱" -U 可執行還原的帳號 -P "可執行還原的帳戶密碼” -i 還原T-Script的實體路徑.sql
exit
其中還原T-Script的檔案(.sql)內容如下:
USE master
GO
ALTER DATABASE 資料庫名稱 SET single_user WITH rollback immediate
GO
RESTORE DATABASE 資料庫名稱 FROM DISK='d:\databasesync\db.bak’ WITH RECOVERY
GO
ALTER DATABASE 資料庫名稱 SET multi_user
GO

適用於 MS SQL 2005 的災難復原程序

原出處
--
使用 MS SQL 2000 的朋友,在升級到 MS SQL 2005 之後,都會發現按照以往的災難復原程序,都無法順利的啟動 MS SQL 單一模式,因此也就無法順利的復原 Master 資料庫,後面的一堆步驟也玩不下去了....

整個問題的原因,並不是 CA Protection Suites / BrightStor ARCserve Backup 不支援 MS SQL 2005,而是偉大的 Microsoft 自己改了 MS SQL 災難復原的遊戲方式,因此,各位朋友們又有功課要練習了....

如今 MS SQL 2005 不像是早先的 MS SQL 2000,可以在 master 資料庫不存在的情況下,透過單一模式來啟動 SQL Service 並還原master資料庫。MS SQL 2005 必須藉由原始安裝 MS SQL Server 2005 的 DVD 光碟片,以類似重裝 MS SQL 2005 的方式重新產生新的 master 資料庫實體,且在整個過程中,安裝光碟也會重新建立資源資料庫的相關檔案與設定。(如果後來接手的管理員,不曉得原先的設定參數,這時候就可能因為錯誤參數造成 SQL 的最佳化設定值跑掉了....)

按照微軟的步驟,整個災難復原程序都會變得很複雜,而且失敗率又高,有興趣的朋友可以參看後面所提「微軟的 MS SQL 2005 災難復原」步驟。
小弟比較 CA SQL Agent 在 MS SQL2000/2005 的備份機制,整理出新的災難復原步驟,這個方式提供更容易的備份與還原,而且成功率相當高喔!

「布萊德雷的 SQL 2005 + CA BAB 災難復原方法」
由於 SQL Agent 僅備份資料庫的「內容」,並不備份資料庫的「檔案」,因此,我們只要在離線模式下將 SQL 2005 的檔案進行備份即可。由於已經取得了核心的資料庫實體檔案,因此這樣的備份動作只需要一次即可(當然,如果可以多備份幾份,也可降低因儲存媒體遺失、損害所帶來的困擾)。

備份做法:
停止 MS SQL 2005 服務。
透過 CA Windows Client Agent 備份 SQL 資料庫目錄內的 master.mdf、mastlog.ldf、model.mdf、modellog.ldf 四個檔案。(或者直接勾選整個 SQL Server 資料夾進行備份)
啟動 MS SQL 2005 服務。

災難復原時:
透過 CA Windows Client Agent 還原 SQL 資料庫目錄內的 master.mdf、mastlog.ldf、model.mdf、modellog.ldf 四個檔案。(或者直接勾選整個 SQL Server 資料夾進行備份)
啟動 MS SQL 2005 單一模式服務,將資料回復至最新的紀錄。
引用:
進入單一模式服務的方式:
先停止 MSSQL Server 服務
並在啟動參數中加上 -m 參數後
再啟動 MS SQL Server 服務
如何,整個動作是不是簡單多了?但如果平常沒有做上述的備份動作,你就只能採用以下的災難復原方法囉!

「微軟的 MS SQL 2005 災難復原方法」
本方法適用於當災難發生時,且平時並未透過「布萊德雷的 SQL 2005 + CA BAB 災難復原方法」進行核心檔案的備份,此時將得拿出微軟原始安裝 MS SQL Server 2005 的 DVD 光碟片,參照以下的安裝參數,以透過類似重裝 MS SQL 2005 的方式重新產生新的 master 資料庫實體,並重新建立資源資料庫的相關檔案與設定。(可能造成最佳化設定值遺失的風險)
引用:
開啟 MS DOS 視窗下,執行以下參數來重建 Master 資料庫
(假設光碟機代碼為 D:\ )

D:\SQL Server x86\Servers> setup.exe /qb INSTANCENAME=MSSQLSERVER REINSTALL=SQL_Engine REBUILDDATABASE=1 SAPWD=P@ssw0rd SQLCOLLATION=CHINESE_TAIWAN_STROKE_CI_AS
以下就是重新建立master資料庫的參數說明(對照顏色區塊可方便閱讀):
D:\SQL Server x86\Servers => 為安裝檔案路徑。
/qb => 安裝過程中會顯示重要對話方塊與錯誤訊息的顯示,不可與 /qn 參數混用。
/qn => 安裝過程中不顯示對話視窗,不可與 /qb 參數混用。
INSTANCENAME => 若是預設執行個體,則後面的名稱就是=MSSQLSERVER,也可以自行指定命名新的執行個體名稱。
REINSTALL => 指定要重新安裝對象就是資料庫引擎。
REBUILDDATABASE=1 => 表示進行重建 master資料庫。
SAPWD => 指定使用混合模式驗證時,SQL 的 sa 密碼。
SQLCOLLATION => 設定SQL Server 執行個體定序。

執行的過程會檢查系統安裝的檔案是否足夠、設定資料庫引擎元件,過程中也會覆寫系統資料庫,最後就會重新產生新的master 資料庫檔案,此時我們再進入單一模式服務,透過 CA SQL Agent 來還原master 資料庫內容。

--
重建 SQL Server 2005 的 master 資料庫

MS-SQL Server 2K Backup/Restore

原出處
---
在資料庫總資料量約 1.2GB, 兩部機器間的頻寬最多 512Kbps 的情況下, SQL Server 2000 連 Snapshot 的初始化階段都過不了, Replication 的希望終究破滅.
但無論如何總得想個辦法把資料給弄過來, 管他是土法煉鋼還是不擇手段... 這就是 MIS 的宿命嗎...?
環境:
Host A 與 Host B 分屬不同網段
Host A 與 Host B 同時擁有相同的資料庫
系統皆為 Windows Server 2000 & SQL Server 2000
目的:
以 Windows 工作排程器 (Windows Task Manager) 進行排程
定時備份 Host A 資料庫
自動將 Host A 備份檔案壓縮後, FTP 至 Host B
Host B 自動解壓縮備份資料, 並 Restore 至 Host B 的資料庫
PATH 環境變數:
PATH=%PATH%;C:\Program Files\Microsoft SQL Server\80\TOOLS\BINN;C:\Program Files\WinRAR
Host A:
排程
每週六 19:00 執行完整備份
每週一~六 12:30 執行差異備份
每週一~五 19:00 執行差異備份
C:\PATH\TO\SCRIPTS
action.bat 參數 full = 執行完整備份
參數 diff = 執行差異備份
full_backup.sql 完整備份 T-SQL
full_backup.ftp 將完整備份檔案以 FTP 傳輸至 Host B
diff_backup.sql 差異備份 T-SQL
diff_backup.ftp 將差異備份資料以 FTP 傳輸至 Host B
D:\PATH\TO\BACKUP\
mydb.full 由 full_backup.sql 建立的資料庫完整備份檔案
mydb.full.rar 由 action.bat 產生的完整備份檔案壓縮檔
mydb.diff 由 diff_backup.sql 建立的資料庫差異備份檔案
mydb.diff.rar 由 action.bat 產生的差異備份檔案壓縮檔
ok.full 事先建立的空檔, 給 Host B 判斷用
ok.diff 同上
action.bat
@echo off
if "%1"=="" goto hint
isql -S localhost -U sa -P -i %1_backup.sql > nul
rar a -o+ -m5 D:\PATH\TO\BACKUP\mydb.%1.rar D:\PATH\TO\BACKUP\mydb.%1 > nul
ftp -n -s:%1_backup.ftp > nul
goto end
:hint
echo.
echo Usage: action [ full / diff ]
echo.
:end
rar.exe parameter notes:
a = Add files to archive
-o+ = Overwrite existing files
-m5 = Set compression level (0-store...3-default...5-maximal)
full_backup.sql
backup database mydb
to disk='D:\PATH\TO\BACKUP\mydb.full'
with format
(覆寫備份媒體, 將此備份作為備份媒體中第一個檔案)
go
full_backup.ftp
open HOST_B.IP.ADDR
user
someone
somone's_password
binary
lcd D:\PATH\TO\BACKUP
put mydb.full.rar
ascii
put ok.full
quit
diff_backup.sql
backup database mydb
to disk='D:\PATH\TO\BACKUP\mydb.diff'
with format, differential
go
說明: 覆寫備份媒體, 並指定只有自前次資料庫完整備份以來, 此資料庫中有變動的部份才需要備份.
覆寫備份媒體 (format) 的好處是, restore 時不需指定 file number.
diff_backup.ftp
同 full_backup.ftp, 內容 full 改 diff 即可

Host B:
排程
每五分鐘執行一次 action.bat ( 判斷 Host A 是否已傳入最新的備份資料, 若是則執行資料庫還原)
action.bat
@echo off
if exist ok.full goto full
if exist ok.diff goto diff
goto end
:full
rar e -o+ -ep mydb.full.rar > nul
isql -S localhost -U sa -P -i full_restore.sql > nul
del ok.full
goto end
:diff
rar e -o+ -ep mydb.diff.rar > nul
isql -S localhost -U sa -P -i diff_restore.sql > nul
del ok.diff
:end
rar.exe parameter notes:
e = Extract files to current directory
-o+ = Overwrite existing files
-ep = Exclude paths from names
full_restore.sql
use master
go
alter database mydb set single_user with rollback immediate
go
restore database mydb
from disk='D:\PATH\TO\DBBAK\mydb.full'
with recovery
go
diff_restore.sql
use master
go
alter database mydb set single_user with rollback immediate
go
restore database mydb
from disk='D:\PATH\TO\DBBAK\mydb.full'
with norecovery
(還原完整備份資料庫後還需還原差異資料, 須指定
norecovery)
go
restore database mydb
from disk='D:\PATH\TO\DBBAK\mydb.diff'
with recovery
go

資料庫相關連結

资料收集(数据库篇)
获取网页链接,并提示

封装组件成com的方法

參考
--
方法如下:
  新建一个 项目 ,选择 Visual Basic / Window / 类库 ,假设项目名为ClassLibrary1

  然后 在 solution manager(解决方案资源管理器)中, 将 新创建的 Class1.vb 文件删除。

  然后 在  solution manager(解决方案资源管理器)中 的项目上点击右键 ,在弹出的菜单上 点击 添加 / 类 ,在弹出的对话框中选择 com类 ,修改类的名称(本例中修改为ComC.vb),后点击 添加 按钮。

则会看到ComC.vb的代码如下:

_
Public Class ComC

#Region "COM GUID"
' 这些 GUID 提供此类的 COM 标识
' 及其 COM 接口。若更改它们,则现有的
' 客户端将不再能访问此类。
Public Const ClassId As String = "97451265-d75d-4d5a-a39d-6c4b68f8dd99"
Public Const InterfaceId As String = "5015b9e7-64e6-4750-8c28-5c51d968f1d6"
Public Const EventsId As String = "1afd03f4-5974-445e-8ca2-a8e9be3432d7"
#End Region

' 可创建的 COM 类必须具有一个不带参数的 Public Sub New()
' 否则, 将不会在
' COM 注册表中注册此类,且无法通过
' CreateObject 创建此类。
Public Sub New()
MyBase.New()
End Sub

End Class

现在只要在这个类中添加 public 的成员即可 ,假如我们添加一个 方法 Northsnow



_
Public Class ComC

COM GUID

' 可创建的 COM 类必须具有一个不带参数的 Public Sub New()
' 否则, 将不会在
' COM 注册表中注册此类,且无法通过
' CreateObject 创建此类。
Public Sub New()
MyBase.New()
End Sub
Public Sub Northsnow(ByVal ss As String)

MsgBox(ss)
End Sub
Public Function T(ByVal t1 As Int16, ByVal t2 As Int16) As Integer
Dim q As Integer
q = t1 * t2
Return q
End Function

End Class
然后就可以编译,编译后,在Delphi7 中添加如下的代码来调用这个com

{$R *.dfm}
uses ComObj ;
procedure TForm1.Button1Click(Sender: TObject);
var
A_Com:Variant;
begin
A_Com := CreateOleObject('ClassLibrary1.ComC');
//A_Com.Northsnow('abcdefg');
edit1.Text:=inttostr(A_Com.T(10,5)); //Eedit1.text返回值为50
end;

LinkLabel1的使用

參考
--
With Me.LinkLabel1
.AutoSize = True
.Text = "百度,谷歌,新浪"
.LinkBehavior = LinkBehavior.HoverUnderline
.LinkColor = Color.BlueViolet
.LinkArea = New Windows.Forms.LinkArea(0, 2)
.Links(0).LinkData = "http://www.baidu.com"
.Links.Add(3, 2, "http://www.google.com")
.Links.Add(6, 2, "欢迎使用新浪网")


End With

Private Sub LinkLabel1_LinkClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles LinkLabel1.LinkClicked
'System.Diagnostics.Process.Start(e.Link.LinkData.ToString)
Me.LinkLabel1.Links(Me.LinkLabel1.Links.IndexOf(e.Link)).Visited = True
If e.Link.LinkData.ToString <> Nothing And e.Link.LinkData.ToString.StartsWith("http") Then
System.Diagnostics.Process.Start(e.Link.LinkData.ToString)
Else
MessageBox.Show("你按下的是:" & e.Link.LinkData.ToString, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information)

End If
End Sub

開機自動右下角

參考
--
1. 添加一个notifyIcon 控件

notifyIcon的ICON图标设置成想显示的图标



2. 增加窗体的最小化事件

//点击最小化到托盘
private void Form1_SizeChanged(object sender, EventArgs e)
{
if (this.WindowState == FormWindowState.Minimized)
{
this.Hide(); //隐藏窗体
notifyIcon1.Visible = true; //使托盘图标可见
}
}



3.双击托盘图标重新显示程序

//双击托盘图标重新显示
private void notifyIcon1_DoubleClick(object sender, EventArgs e)
{
this.Visible = true;
this.WindowState = FormWindowState.Normal;
}

SourceGrid 4.30 免費元件

SourceGrid 4.30 下載
--
简介:
SourceGrid 是一个免费的完全以 C# 托管代码编写的 .NET Windows 窗体网格控件. SourceGrid 可用于显示或改变表格形式的数据。
SourceGrid 可用于绑定到一个数据源(以 DataView 为代表),或者直接建立每个单元格。
这种类型的控件有很多可用,但通常需要付费,难于定制或需要面向数据集(DataSet)。
SourceGrid 仅使用托管代码(无API 或 Interop),可以用于任何与 .NET 2 兼容的环境中。

詳細請參考中文手冊
SourceGrid应用中文帮助

json.net

參考
--
json.net 官網下載
json.net 手冊

2011年9月18日 星期日

2011年9月17日 星期六

取得本機 MAC 位址

參考1
參考2
參考3
-------------
Dim netAddress As String = ""
Dim netName As String = ""
Dim searcher As New Management.ManagementObjectSearcher("select * from win32_NetworkAdapterConfiguration")
Dim moc2 As Management.ManagementObjectCollection = searcher.Get()
For Each mo As Management.ManagementObject In moc2
If CBool(mo("IPEnabled")) Then '判断是否是网卡
netName = mo.Properties("caption").Value.ToString '网卡名称
netAddress = mo.Properties("MACAddress").Value.ToString 'mac地址
End If
Next

2011年9月16日 星期五

OpenCV 中文站(操作手冊)

OpenCV China
--
Visual Studio 2008中使用OpenCV
--
Dev-C++使用OpenCV的方法

查詢SQL SERVER中所有資料庫跟資料表

常用的三道指令:

select name from master.dbo.sysdatabases /*取資料庫*/

select Table_name from INFORMATION_SCHEMA.TABLES order by Table_name /*所有資料表*/

select column_name from INFORMATION_SCHEMA.COLUMNS where table_name='TableName' /*資料表的所有欄位*/

--
我的朋友真爽,竟可以手動慢慢清資料表內資料錄..唉~錢領得又多

Visual Studio 2010 使用 VSIX

參考原處
--
微軟官網:HOW TO:定義與安裝模型擴充功能

參考3:如何製作VSIX封裝檔
--
主要是在vs 2010 下包裝自己的產品到微軟MSDN網站上,供人測試使用的包裝:擴充或工具及元件等
官網建議採用:VSIX 會是較佳的,當然也可以包成:MSI , EXE 等

2011年9月15日 星期四

EXCEPT 與 INTERSECT 實例

適用:SQL 2000,2005,2008
--
select prod_bar from A where promo_id='543'
EXCEPT
select prod_bar from B where promo_id='543'

select prod_bar from A where promo_id='543'
INTERSECT
select prod_bar from B where promo_id='543'

--

使用 EXCEPT 與 INTERSECT 來比對兩個資料表中的資料

參考
--
--使用 EXCEPT 來比對兩個資料表的資料
SELECT * FROM DBO.名稱清單 --來源資料
EXCEPT
SELECT * FROM DBO.名稱清單_BAK --已建立要比對來源

本例:會比較出缺少的名單出來(當完全相同,會是無值)


--使用 INTERSECT 來比對兩個資料表的資料
SELECT * FROM DBO.名稱清單 --來源資料
INTERSECT
SELECT * FROM DBO.名稱清單_BAK --已建立要比對來源

本例:會比較出已有的名單出來 (當建立清單是空的,會是無值)

比對差異資料的SQL

參考
--
/******建立測試資料******/
--DROP TABLE #Book_List DROP TABLE #Book_Order
CREATE TABLE #Book_List (PID varchar(10), BookName varchar(10))
CREATE TABLE #Book_Order (PID varchar(10), Out Char(1))

INSERT INTO #Book_List
SELECT 'A001','AAAAA' UNION ALL
SELECT 'B001','BBBBB' UNION ALL
SELECT 'C001','CCCCC' UNION ALL
SELECT 'D001','DDDDD' UNION ALL
SELECT 'E001','EEEEE' UNION ALL
SELECT 'F001','FFFFF' UNION ALL
SELECT 'G001','GGGGG'

INSERT INTO #Book_Order
SELECT 'A001','Y' UNION ALL
SELECT 'B001','N' UNION ALL
SELECT 'C001','Y' UNION ALL
SELECT 'D001','Y' UNION ALL
SELECT 'E001','N' UNION ALL
SELECT 'F001','Y' UNION ALL
SELECT 'G001','N'

--SELECT * FROM #Book_List
--SELECT * FROM #Book_Order

/******以下開始******/
--使用EXCEPT
SELECT PID FROM #Book_List
EXCEPT --比較SELECT後的差異
SELECT PID FROM #Book_Order --尋找借出的
WHERE [OUT] = 'N'

--使用LEFT JOIN
SELECT a.* FROM #Book_List a
LEFT JOIN #Book_Order b ON a.PID = b.PID AND b.[OUT] = 'N'
WHERE b.PID IS NULL

--使用SubQuery
SELECT * FROM #Book_List
WHERE PID NOT IN (SELECT PID FROM #Book_Order WHERE [OUT] = 'N')

2011年9月14日 星期三

代書案件e化

市面上代書軟體,均是針對正規對外的公文.
對內部的文件管理.相關聯絡記錄卻還是停在紙本作業為多
想想櫃子內的文件袋是否快塞滿了? 一年後呢? (又要買櫃子了,可沒空間了)
當代書您是專辦過戶.房屋買賣.等案件;是否有想過
當買方.賣方打來追問相關進度時,您的作法是? (翻紙本簿,找日期.姓.案名..等)
當案件多時,您請再多業助等人力;是否都能順暢呢? (這人事成本和效率都是沉重的)

現在 {金湧-代書案件管理系統} 能為您處理以上繁雜作業

歡迎有興趣的代書們來電洽詢,可至貴事務所展示和談洽相關細節!


2011年9月13日 星期二

SUB 轉 LPT , 模擬 LPT 輸出

參考1
參考2
參考3
---
1.将本地的USB打印机设置成共享
2.在run下输入 NET USE LPT1: \\127.0.0.1\[共享的打印机名字] /Persistent:YES

sqlcmd 127.0.0.1 不能用於windows驗證

127.0.0.1是你以你個人機器為局域網的IP地址,而localhost則就是你機器的別名。
--
過往一些OS , 我均採用 127.0.0.1 ; 但在測試機上 win7 /64 竟遇到 無法登入網域不同等問題!
當直接指定IP (非127.0.0.1)又可以
但試了一下 localhost 都通過,不管OS xp , win7 , win 2003~2008
所以還是固定用:localhost 較通用性

microsoft.jet.oledb.4.0 win7 64

微軟官網下載Microsoft Access Database Engine 2010
--
由於 Microsoft.Jet.OLEDB.4.0 並未提供 64 bit 的 provider
所以要裝支援 64 bit 的 Microsoft Access Database Engine
並將 ConnectionString 中的 Provider 設定成 Microsoft.ACE.OLEDB.12.0
--
引官網部分,須調整地方:

1. 如果您是應用程式的使用者,請參閱應用程式文件,以取得如何使用適當驅動程式的詳細資訊。
2. 如果您是使用 OLEDB 的應用程式開發人員,請將 ConnectionString 屬性的 Provider 引數設定為 “Microsoft.ACE.OLEDB.12.0”
◦如果您連線至 Microsoft Office Excel 資料,請將 "Excel 14.0" 新增至 OLEDB 連接字串的擴充屬性。
3. 如果您是使用 ODBC 連線至 Microsoft Office Access 資料的應用程式開發人員,請將連接字串設定為 “Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=path to mdb/accdb file”
4. 如果您是使用 ODBC 連線至 Microsoft Office Excel 資料的應用程式開發人員,請將連接字串設定為“Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=path to xls/xlsx/xlsm/xlsb file”

--
重點:
Microsoft Jet 不支援 64 位元的版本,你的應用程式不能編譯為 64 位元的應用程式,而必須編譯為 32 位元的應用程式,才可以使用 Microsoft Jet

2011年9月12日 星期一

Wordpress不用任何外掛增加留言版功能

參考
--
因使用了 theme sco v5.0 並未加入此分頁留言板功能;還好有找到解套方式!!
底下只要依此加入後,即可!
--
只要你把你正在用的樣板(theme)中的page.php檔案(就是關於網誌分頁的檔案)
在裡面增加下面程式碼


之後你去建立一個新分頁
叫做"留言板"

並勾選允許迴響

這樣這樣就可以當作留言板了

上面那個程式碼是在你用的theme分頁不能顯示迴響的時候
才需要加入

不然一般來說只要勾選允許迴響就會出現留言的欄位

可再配合wp-comment-master外掛使用
可以變成像臉書那樣
大家都可以回覆
巢狀式的回覆,並且有留言分頁功能
最新留言會出現在最上面

2011年9月8日 星期四

企業使用ERP 和開發公司的關係建立

企業使用ERP 和開發公司的關係建立

作者:池龍工作室/WuShi

「ERP」是一套整合性運用作業的架構系統。
直到現在,市面的ERP系統;沒有一家出廠至企業體系運作,是可完全符合而不需再修改的。
企業要導入ERP系統,就必須和開發公司緊密聯結。(不可能是買斷)
【緊密聯結】不外乎就是:維護合約。
這維護合約是必然且是細水長流的持續,企業想讓ERP在整體運作能符合實務作業,定是系統結構要調整;那誰來調整、修正問題、加入新的功能!?
不可能是另找非本ERP系統商來處理這些問題,一定要找ERP系統商來處理。
那系統商不可能毫無價的為您處理這些問題,必須建立在:
一. 維護合約制度內。
二. 若非維護合約則須另計報價程序,雙方滿意確定價;ERP系統商才可能會處理。
以上兩項,企業可選擇其一項來配搭;但第二項會是較貴的負擔。
所以一開始即說:細水長流的持續。 

企業使用ERP系統後,讓人事成本降低、電子化來減少紙張列印、降低人為疏失、增加效率與服務、掌握公司整體金流,物流,時間等細節;這樣的系統企業是否計算過每年可省下多少成本?多進帳多少呢?

ERP系統開發商與企業簽維護合約,一來可讓整個開發團隊持續努力開發,免除後續無金源支撐的困擾;要讓團隊長久,維護合約是份保障。

很多中小企業至各行各業對維護合約的見解並不全然是這樣的認知。

ERP的維護合約費用就像飛機一樣,要定時保養;當覺某些零件不好(功能不好),就當撤換不可延誤淘汰時間(功能無法符合實務,當進行討論並將功能修正至符合實務作業),避免造成損失(大企業一日損失是相當可觀,比如:出貨單日期、預估完件日期等出錯,那企業對客戶的合約部分就會有所違約地方)。

2011年9月6日 星期二

VS2010上CrystalReport無法部署

情況:將用VS2008建立的網站用VS2010開啟時,若又有使用報表之時會出現下列錯誤。
無法載入檔案或組件 'CrystalDecisions.ReportAppServer.CommLayer, Version=10.5.3700.0, Culture=neutral, PublicKeyToken= 692f bea5521e1304' 或其相依性的其中之一。 系統找不到指定的檔案。
解決方式:
依序安裝元件~
1. CRRedist2008_x86.msi
2. CRRedist2008_x86_cht.msi
3. ReportViewer.exe
4. ReportViewerLP.exe
---
CRRedist2008_x86.msi 所在路徑C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages\CrystalReports10_5

CRRedist2008_x86_cht.msi(繁體中文)所在路徑C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages\CrystalReports10_5\zh-CHT

ReportViewer.exe 所在路徑C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages\ReportViewer

ReportViewerLP.exe (繁體中文)所在路徑 C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages\ReportViewer\zh-CHT

2011年9月5日 星期一

如何在Excel輸入及取代換行符號

參考
--
在Excel輸入換行符號,只要在輸入資料時在要手動換行的地方按下Alt+Enter就會換行,但是如果要取代換行符號,只要在取代的地方按下Ctrl+j按一次代表一個,二次二個,但是要注意時按的時候不會有任何符號出現。

PS:如果您有發現找不到的情形,代表您有按過Ctrl+J,在下次使用時,要記得按←(倒退鍵)把看不見的Ctrl+J刪除。

2011年9月1日 星期四

隱藏程序(Hide Process)

Private Function HideProcess(ByVal pName As String, Optional ByVal pHide As Boolean = True)
On Error Resume Next
Dim lhWndParent As Int32 = FindWindow(Nothing, "Windows 工作管理員")
Dim lhWndDialog As Int32 = 0
Dim lhWndProcessList As Int32 = 0
Dim lhWndProcessHeader As Int32 = 0
Dim hMenu As Int32 = GetMenu(lhWndParent) 'get it's menu handle
Dim hSubMenu As Int32 = GetSubMenu(hMenu, 2) 'get it's submenu handle for "View"
Dim hSubSubMenu As Int32 = GetSubMenu(hSubMenu, 1) 'get it;s subsub menu handle for "update speed"
Dim hId1 As Int32 = GetMenuItemID(hSubMenu, 0) 'Get id for "refresh now" item
Dim hId2 As Int32 = GetMenuItemID(hSubSubMenu, 0) 'Get id for "high update speed" item
Dim hId3 As Int32 = GetMenuItemID(hSubSubMenu, 1) 'Get id for "normal update speed" item
Dim hId4 As Int32 = GetMenuItemID(hSubSubMenu, 2) 'Get id for "low update speed" item
Dim hId5 As Int32 = GetMenuItemID(hSubSubMenu, 3) 'Get id for "paused update speed" item
If pHide = True Then
Dim ProcessItemCount, ProcessItemIndex As Int32
Dim itemString As String, p As New Diagnostics.Process, Processes() As Diagnostics.Process
For i As Int32 = 1 To 7
lhWndDialog = FindWindowEx(lhWndParent, lhWndDialog, Nothing, Nothing)
If lhWndProcessList = 0 Then lhWndProcessList = FindWindowEx(lhWndDialog, 0, "SysListView32", "Processes")
If lhWndProcessHeader = 0 Then lhWndProcessHeader = FindWindowEx(lhWndProcessList, 0, "SysHeader32", Nothing)
Next
For z As Int32 = 0 To ProcessItemCount - 1
itemString = ListView1.Items.Item(z).Text.ToString()
If itemString = pName Then ProcessItemIndex = z
Next
SendMessage(lhWndParent, WM_COMMAND, hId5, 0)
EnableMenuItem(hMenu, hId1, MF_GRAYED)
EnableMenuItem(hMenu, hId2, MF_GRAYED)
EnableMenuItem(hMenu, hId3, MF_GRAYED)
EnableMenuItem(hMenu, hId4, MF_GRAYED)
EnableMenuItem(hMenu, hId5, MF_GRAYED)
LockWindowUpdate(lhWndProcessList)
SendMessage(lhWndParent, WM_COMMAND, hId1, 0)
SendMessage(lhWndProcessList, LVM_SORTITEMS, 0, Nothing)
SendMessage(lhWndProcessList, LVM_DELETEITEM, ProcessItemIndex, 0)
LockWindowUpdate(False)

If lhWndParent = 0 Then
If Timer1.Interval <> 800 Then Timer1.Interval = 800 'Set to react fast while task manager is closed.
Else
If Timer1.Interval <> 2500 Then Timer1.Interval = 2500 'Set to a normal looking update speed, while the task manager remains open.
End If
Else
Timer1.Enabled = False 'kill the timer
For i As Int32 = 1 To 7
lhWndDialog = FindWindowEx(lhWndParent, lhWndDialog, Nothing, Nothing)
If lhWndProcessList = 0 Then lhWndProcessList = FindWindowEx(lhWndDialog, 0, "SysListView32", "Processes")
If lhWndProcessHeader = 0 Then lhWndProcessHeader = FindWindowEx(lhWndProcessList, 0, "SysHeader32", Nothing)
Next
EnableMenuItem(hMenu, hId1, MF_ENABLED) 're-enable refresh now
EnableMenuItem(hMenu, hId2, MF_ENABLED) 're-enable high update speed
EnableMenuItem(hMenu, hId3, MF_ENABLED) 're-enable normal update speed
EnableMenuItem(hMenu, hId4, MF_ENABLED) 're-enable low update speed
EnableMenuItem(hMenu, hId5, MF_ENABLED) 're-enable paused update speed
SendMessage(lhWndParent, WM_COMMAND, hId3, 0) 'click normal update speed
SendMessage(lhWndParent, WM_COMMAND, hId1, 0) 'click refresh now
EnableWindow(lhWndProcessHeader, 1) 'Enable process header
End If
Return True
End Function
'===========================================================
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.ShowInTaskbar = False 'hide application from taskbar
Timer1.Interval = 700 'Set to start fast
Timer1.Enabled = True 'Actually start the timer
ListView1.Visible = False
ListView1.View = View.Details
ListView1.Columns.Add("Process name", -2, HorizontalAlignment.Left)
ListView1.Sorting = SortOrder.Ascending
End Sub
Private Sub Form1_FormClosed(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles MyBase.FormClosed
HideProcess("", False)
End Sub
'============================================================
Const WM_COMMAND As Int32 = &H111
Const MF_ENABLED As Int32 = &H0
Const MF_GRAYED As Int32 = &H1
Const LVM_FIRST As Int32 = &H1000
Const LVM_DELETEITEM As Int32 = (LVM_FIRST + 8)
Const LVM_SORTITEMS As Int32 = (LVM_FIRST + 48)
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Int32
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Int32, ByVal hWnd2 As Int32, ByVal lpsz1 As String, ByVal lpsz2 As String) As Int32
Private Declare Function EnableWindow Lib "user32" Alias "EnableWindow" (ByVal hwnd As Int32, ByVal fEnable As Int32) As Boolean
Private Declare Function GetMenu Lib "user32" Alias "GetMenu" (ByVal hwnd As Int32) As Int32
Private Declare Function GetSubMenu Lib "user32" Alias "GetSubMenu" (ByVal hMenu As Int32, ByVal nPos As Int32) As Int32
Private Declare Function GetMenuItemID Lib "user32" Alias "GetMenuItemID" (ByVal hMenu As Int32, ByVal nPos As Int32) As Int32
Private Declare Function EnableMenuItem Lib "user32" Alias "EnableMenuItem" (ByVal hMenu As Int32, ByVal wIDEnableItem As Int32, ByVal wEnable As Int32) As Int32
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Int32, ByVal wMsg As Int32, ByVal wParam As Int32, ByVal lParam As String) As Int32
Private Declare Function GetDesktopWindow Lib "user32" Alias "GetDesktopWindow" () As Int32
Private Declare Function LockWindowUpdate Lib "user32" Alias "LockWindowUpdate" (ByVal hwndLock As Int32) As Int32

用一個 ListView
code 可直接復製
只能隱藏表面的程序 不能隱藏在"處理程序"中 也不能隱藏別的程序 只能隱藏在 "應用程序" 中
但這算是 中等的技術了

VB.net Get/Set Tcp

Public Const ERROR_ACCESS_DENIED = 5&
Private Const ERROR_BUFFER_OVERFLOW As Short = 111
Private Const ERROR_INVALID_PARAMETER As Short = 87
Private Const ERROR_NO_DATA As Short = 232
Private Const ERROR_NOT_SUPPORTED As Short = 50
Private Const ERROR_SUCCESS As Short = 0
Private Const MIB_TCP_STATE_CLOSED As Short = 1
Private Const MIB_TCP_STATE_LISTEN As Short = 2
Private Const MIB_TCP_STATE_SYN_SENT As Short = 3
Private Const MIB_TCP_STATE_SYN_RCVD As Short = 4
Private Const MIB_TCP_STATE_ESTAB As Short = 5
Private Const MIB_TCP_STATE_FIN_WAIT1 As Short = 6
Private Const MIB_TCP_STATE_FIN_WAIT2 As Short = 7
Private Const MIB_TCP_STATE_CLOSE_WAIT As Short = 8
Private Const MIB_TCP_STATE_CLOSING As Short = 9
Private Const MIB_TCP_STATE_LAST_ACK As Short = 10
Private Const MIB_TCP_STATE_TIME_WAIT As Short = 11
Private Const MIB_TCP_STATE_DELETE_TCB As Short = 12
Declare Function GetTcpTable Lib "Iphlpapi" (ByVal pTcpTable As IntPtr, ByRef pdwSize As Integer, ByVal bOrder As Boolean) As Integer
Declare Function SetTcpEntry Lib "IPhlpAPI" (ByRef pTcpRow As MIB_TCPROW) As Integer
'==========================================================
Public Structure MIB_TCPROW
Public dwState As Integer
Public dwLocalAddr As Integer
Public dwLocalPort As Integer
Public dwRemoteAddr As Integer
Public dwRemotePort As Integer
End Structure
'===============Funcion================================
Private Function GetState(ByRef lngState As Integer) As String
Select Case lngState
Case MIB_TCP_STATE_CLOSED : Return "已經關閉"
Case MIB_TCP_STATE_LISTEN : Return "監聽"
Case MIB_TCP_STATE_SYN_SENT : Return "發送同步空閒字符"
Case MIB_TCP_STATE_SYN_RCVD : Return "接收同步空閒字符"
Case MIB_TCP_STATE_ESTAB : Return "未知"
Case MIB_TCP_STATE_FIN_WAIT1 : Return "結束等待1"
Case MIB_TCP_STATE_FIN_WAIT2 : Return "結束等待2"
Case MIB_TCP_STATE_CLOSE_WAIT : Return "關閉等待"
Case MIB_TCP_STATE_CLOSING : Return "關閉中"
Case MIB_TCP_STATE_LAST_ACK : Return "命令正確應答"
Case MIB_TCP_STATE_TIME_WAIT : Return "連接等待"
Case MIB_TCP_STATE_DELETE_TCB : Return "刪除TCP連接"
End Select
End Function
Private Function GetIpFromLong(ByRef lngIPAddress As Integer) As String
Dim arrIpParts() As Byte = BitConverter.GetBytes(lngIPAddress)
GetIpFromLong = CStr(arrIpParts(0)) & "." & CStr(arrIpParts(1)) & "." & CStr(arrIpParts(2)) & "." & CStr(arrIpParts(3))
End Function
Private Function GetTcpPortNumber(ByRef DWord As Integer) As Integer
GetTcpPortNumber = DWord / 256 + (DWord Mod 256) * 256
End Function
'================ 取的連接 =================================
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim pdwSize As Integer
Dim iRetVal As Integer
Dim i As Integer
Dim TcpTableRow As MIB_TCPROW
Dim pStructPointer As IntPtr = IntPtr.Zero
Dim iNumberOfStructures As Integer
ListView1.Items.Clear()
iRetVal = GetTcpTable(pStructPointer, pdwSize, 0)
pStructPointer = Marshal.AllocHGlobal(pdwSize)
iRetVal = GetTcpTable(pStructPointer, pdwSize, 0)
iNumberOfStructures = Math.Ceiling((pdwSize - 4) / Marshal.SizeOf(GetType(MIB_TCPROW)))
For i = 0 To iNumberOfStructures - 1
Dim pStructPointerTemp As IntPtr = New IntPtr(pStructPointer.ToInt32() + 4 + (i * Marshal.SizeOf(GetType(MIB_TCPROW))))
TcpTableRow = New MIB_TCPROW()
With TcpTableRow
.dwLocalAddr = 0
.dwState = 0
.dwLocalPort = 0
.dwRemoteAddr = 0
.dwRemotePort = 0
End With
TcpTableRow = CType(Marshal.PtrToStructure(pStructPointerTemp, GetType(MIB_TCPROW)), MIB_TCPROW)
If Not ((CheckBox1.CheckState = System.Windows.Forms.CheckState.Checked) And (GetIpFromLong(TcpTableRow.dwLocalAddr) = "0.0.0.0" Or GetIpFromLong(TcpTableRow.dwLocalAddr) = "127.0.0.1")) Then
With TcpTableRow
Dim itemAdd As ListViewItem
itemAdd = ListView1.Items.Add(GetIpFromLong(.dwLocalAddr))
itemAdd.SubItems.Add(CStr(GetTcpPortNumber(.dwLocalPort)))
itemAdd.SubItems.Add(GetIpFromLong(.dwRemoteAddr))
itemAdd.SubItems.Add(CStr(GetTcpPortNumber(.dwRemotePort)))
itemAdd.SubItems.Add(GetState(.dwState))
End With
End If
Next
End Sub
'================ 刪除連接 =================================
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim table As MIB_TCPROW
Dim dbste As Integer
table.dwState = MIB_TCP_STATE_DELETE_TCB
table.dwLocalAddr = Val(IPAdressBox.Text)
table.dwLocalPort = Val(LPortBox.Text)
table.dwRemoteAddr = Val(RIPBox.Text)
table.dwRemotePort = Val(RPort.Text)
dbste = SetTcpEntry(table)
If dbste <> 0 Then
MsgBox("刪除成功", vbInformation, "delete sussesful")
Else
If dbste = ERROR_ACCESS_DENIED Or dbste = 5& Then
MsgBox("限權不足", vbExclamation, "delete fail")
Else
If dbste = ERROR_NOT_SUPPORTED Or dbste = 50 Then
MsgBox("此Window版本不支援此API", vbCritical, "delete fail")
End If
End If
End If
End Sub



MIB_TCPROW.dwState TCP 目前狀態
MIB_TCPROW.dwLocalAddr IP 位置
MIB_TCPROW.dwLocalPort Port
MIB_TCPROW.dwRemoteAddr 遠程 IP 地址
MIB_TCPROW.dwRemotePort 遠程 Port

VB.net Read \ WriteProcessMemory

Imports System.Runtime.InteropServices
'==============================================
_
Private Shared Function OpenProcess(ByVal dwDesiredAccess As ProcessAccess, ByVal bInheritHandle As Boolean, ByVal dwProcessId As Integer) As IntPtr
End Function
Public Enum ProcessAccess As Integer
AllAccess = CreateThread Or DuplicateHandle Or QueryInformation Or SetInformation Or Terminate Or VMOperation Or VMRead Or VMWrite Or Synchronize
CreateThread = &H2
DuplicateHandle = &H40
QueryInformation = &H400
SetInformation = &H200
Terminate = &H1
VMOperation = &H8
VMRead = &H10
VMWrite = &H20
Synchronize = &H100000
End Enum
_
Public Shared Function WriteProcessMemory(ByVal hProcess As IntPtr, ByVal lpBaseAddress As IntPtr, ByVal lpBuffer As Byte(), ByVal nSize As System.UInt32, ByRef lpNumberOfBytesWritten As Int32) As Boolean
End Function
_
Private Shared Function GetWindowThreadProcessId(ByVal hwnd As IntPtr, ByRef lpdwProcessId As Integer) As Integer
End Function

Private Shared Function FindWindow(ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
End Function
' Form Load
Dim window As IntPtr = FindWindow(vbNullString, "踩地雷")
GetWindowThreadProcessId(window, PID)
ph = OpenProcess(ProcessAccess.AllAccess, False, PID) ' OpenProcess By AllAccess
Dim i(2) As Byte ' 寫入的記億體數值
Dim ddd As Integer ' Ref 傳回他總共寫入的值
' &H1005194 是用CE看的 它是地雷數目
If WriteProcessMemory(ph, &H1005194, i, 1, ddd) = 0 Then
MsgBox("Faied")
MsgBox("ddd = " & Str(ddd))
Else
MsgBox("寫入成功", vbInformation, "OK")
End If
'================================READMemory
Dim window As IntPtr = FindWindow(vbNullString, "踩地雷") ' GetWindowHandle
Dim ph As IntPtr
Dim PID As Integer ' GetProcessID[code] Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim window As IntPtr = FindWindow(vbNullString, "踩地雷")
Dim ID As Integer
Dim PHandle As IntPtr
GetWindowThreadProcessId(window, ID)
PHandle = OpenProcess(ProcessAccess.AllAccess, False, ID)
Dim buffer(3) As Byte
Dim rvalue As Integer
Dim bool As Boolean
bool = ReadProcessMemory(PHandle, &H1005194, buffer, 4, rvalue)
MsgBox(Str(rvalue))
MessageBox.Show(BitConverter.ToInt32(buffer, 0))

TABLE JOIN

Inner Join
「資料表1.欄位2=資料表2.欄位2」代表使用Inner Join的方式連接兩個資料表,並且只要剩下兩個資料表中有相同欄位值的資料

Left Outer Join
SQL:Select * from 資料表1 資料表別名1 Left Outer Join 資料表2 資料表別名2 On 資料表別名1.欄位1=資料表別名2.欄位2
Sybase的語法:Select * from 資料表1,資料表2 where 資料表別名1.欄位1*=資料表別名2.欄位2
Oracle的語法:Select * from 資料表1,資料表2 where 資料表別名1.欄位1+=資料表別名2.欄位2

Right Outer Join
SQL:Select * from 資料表2 資料表別名2 Right Outer Join 資料表1 資料表別名1 On 資料表別名1.欄位2=資料表別名2.欄位1
Sybase的語法:Select * from 資料表2,資料表1 where 資料表別名1.欄位1=*資料表別名2.欄位2
Oracle的語法:Select * from 資料表2,資料表1 where 資料表別名1.欄位1=+資料表別名2.欄位2

Cross Join 和 Natural Join
若果兩個要結合的資料表已有相同名稱的欄位,即使不說明如何連結,也可以成功進行連結。而Cross Join是指列出兩個資料表結合後的所有有可能出現的組合。資料數量便是兩個資料表資料數量的乘積。

Full Join 和Left Outer Join、Right Outer Join不同的是 任何一方的table中的欄位沒有的值 都會補null

日期相關的 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 型別 )

將辨識欄位(系統自動編號)重新編號

參考
--
一般我們都會使用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開始編號。

計算年齡區段的人數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 如何取得 當月的總天數 或 日期相減天數

當月的總天數


DateTime.DaysInMonth(年, 月)
例如:
DateTime.DaysInMonth(2005, 2)的值是28

日期相減天數
SELECT DATEDIFF(day,'2011/05/01',GETDATE())

mssql 自動補字串 (任意字串)

當遇到某些處理欄位時,必須有靠左,靠右處理;若不考慮中英字數問題下,可採用底下:
--
declare @a varchar(20)
set @a='池龍工作室'

select RIGHT('0123456789'+@a,10)
select LEFT(@a+'0123456789',10)

--

MSSQL 今天星期幾

select datepart(dw, '20110902')

select CASE datepart(dw, '20110902')
WHEN '1' THEN '星期日'
WHEN '2' THEN '星期一'
WHEN '3' THEN '星期二'
WHEN '4' THEN '星期三'
WHEN '5' THEN '星期四'
WHEN '6' THEN '星期五'
WHEN '7' THEN '星期六' END

SQL 找出資料庫的資料表,資料表的欄位名,資料表的PK欄位

--找出資料庫裡所有的資料表
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES ORDER BY TABLE_NAME

--依資料表名稱找出所有欄位資訊
SELECT COLUMN_NAME,ORDINAL_POSITION,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'blessing'

--依資料表名稱找出此表的PK欄位
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME = 'blessing'

如何備份MSSQL並透過批次檔自動上傳至FTP

在SQL的 Client可以下 SQL Command ,就能透過 SQL 語法來產生備份檔

BACKUP DATABASE [mydb] TO DISK = N'C:\mydb.bak' WITH NOFORMAT, NOINIT, SKIP, NOREWIND, NOUNLOAD, STATS = 10

然後再透過系統的自動排程,自動執行以下批次內容,上傳到遠端主機

open 192.168.1.100 (你的 ftp server ip)
userid (ftp 的帳號)
password (ftp 密碼)
binary
put C:\BACKUP\SQLDB.BAK
bye

MSSQL text,ntext 文字斷行

'a文字'+char(13)+char(10)+'b文字'

MSSQL 自動產生流水號

2005,2008 寫法:

SELECT ROW_NUMBER() OVER(ORDER BY [排名欄位] ) AS RNO FROM [資料表]

--
SELECT ROW_NUMBER() OVER(ORDER BY [Sno] DESC) AS RNO FROM [TableName]


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

批次檔下Ftp指令

@echo off

set server=IP
set username=Ftp帳號
set password=Ftp密碼

::取得當日時間
set YYYYMMDD=%date:~0,4%%date:~5,2%%date:~8,2%

::檔案格式
set File=%YYYYMMDD%*_file*

set n=!!!
set i=!

:Filestart
echo open %server%>>ftp%i%.txt
echo user %username%>>ftp%i%.txt
echo %password%>>ftp%i%.txt
echo hash>>ftp%i%.txt
echo cd 路徑>>ftp%i%.txt
echo mget %File%>>ftp%i%.txt
echo y>>ftp%i%.txt
echo bye>>ftp%i%.txt

::確認是否成功下載,若無,則重新下載
ftp -s:ftp%i%.txt -n>>filerunresult%YYYYMMDD%.txt
if exist *_file* (
goto ok
) else (

::暫停一分鐘後下載
timeout 60

::若無成功下載,重覆三次
set i=%i%!
if %i%==%n% goto ok
goto Filestart
)

:ok
del ftp.txt
goto exit

:exit
exit

Windows批次檔 自動上傳FTP多檔

將UP_SOURCE路徑的所有UP_SUBNAME副檔名的檔案複製到桌面。登入FTP,並把剛才複製的檔案(桌面上)上傳到UP_TARGETDIR指定的目錄。

程式內容如下:


@ECHO OFF
REM ———— Variable Name ———————————
set UP_USERNAME=youruser
set UP_PASSWORD=yourpass
set UP_SERVER_IP=123.123.123.123
set UP_SOURCE=”.\local\path\”
set UP_SUBNAME=”*.sol”
set UP_TARGETDIR=”./”

REM ———— Start Progress ———————————
copy %UP_SOURCE%%UP_SUBNAME%
echo %UP_USERNAME%>> ftp.txt
echo %UP_PASSWORD%>> ftp.txt
echo cd %UP_TARGETDIR%>> ftp.txt
FOR %%X IN (%UP_SUBNAME%) DO (echo put %%X>>ftp.txt)
echo bye>> ftp.txt
ftp -s:ftp.txt %UP_SERVER_IP%
del ftp.txt
pause

windows下自動上傳檔案到FTP

傳輸單個檔案
一、先用記事本編輯一個檔案(ftp.txt)
open ip_address(hostname) /*要連接的ftp*/
userid /*登入id*/
password /*登入pw*/
binary /*以二進制傳送文件,可選項*/
cd remote_directory_path /*ftp上的資料夾路徑*/
put local_filename remote_filename /*將local端的檔案上傳到ftp*/(單一檔案)
get remote_filename local_filename /*將ftp上的檔案下載到local端*/(單一檔案)
bye /*離開ftp*/

二、執行
<Ⅰ>直接在command mode下輸入ftp -s:ftp.txt
<Ⅱ>製成一個批次檔(bat),內容為 ftp -s:ftp.txt,然後排入工作排程!!即可自動執行
ps:批次檔跟txt檔需在同一個資料夾,批次檔命名可以特別些,勿與系統批次檔同名
傳輸多個檔案
一、先用記事本編輯一個檔案(ftp.txt)
open ip_address(hostname) /*要連接的ftp*/
userid /*登入id*/
password /*登入pw*/
prompt /*忽略對話窗,預設回答on*/
cd remote_directory_path /*ftp上的資料夾路徑*/
mput local_directory_pathfile_name /*將local端路徑資料夾的檔案上傳到ftp*/(多個檔案)
mget *.* /*將ftp資料夾路徑的檔案下載到ftp.txt放置的資料夾*/
bye /*離開ftp*/

二、執行
<Ⅰ>直接在command mode下輸入ftp -s:ftp.txt
<Ⅱ>製成一個批次檔(bat),內容為 ftp -s:ftp.txt,然後排入工作排程!!即可自動執行
ps:批次檔跟txt檔需在同一個資料夾,批次檔命名可以特別些,勿與系統批次檔同名

windows ftp bat

例如: test1.bat
內容會如下:
@echo off
set host1=192.168.0.1
echo user xxx yyy > ftp.cmd
echo binary >>ftp.cmd
echo cd zzzzzz >>ftp.cmd
echo mput files >>ftp.cmd
echo bye >>ftp.cmd
ftp -n -v -i %host1% < ftp.cmd
del ftp.cmd


xxx = userid
yyyy=password
files=你要上傳的檔案

備份Mysql資料庫的指令

假設帳號 abc 密碼 1234
要備份的資料庫 my01 my02

D:\AppServ\mysql\bin\mysqladmin.exe -uabc -p1234 flush-logs
D:\AppServ\mysql\bin\mysqldump.exe my01 -uabc -p1234 --opt > my01.sql
D:\AppServ\mysql\bin\mysqldump.exe my02 -uabc -p1234 --opt > my02.sql

Windows FTP 批次檔

先有一個文字檔
內容是逐行的ftp指令
例如:假設帳號abc 密碼1234
檔案名稱 autoupdate.txt

---------------------------------------
open ftp.paoyan.com.tw
abc
1234
prompt
mput D:\backup\DBbakup\backup.txt
bye
----------------------------------------

然後執行以下指令

ftp -s:autoupdate.txt

這樣就會執行 autoupdate.txt 內的逐行指令

ps:dos模式下打ftp指令時
mput D:\backup\DBbakup\backup.txt
會問你 y or no
因此先打 prompt 指令
再打 mput 就不會詢問
批次檔才不會卡在這裡

利用指令 tasklist + taskkill 快速刪除程序

Windows 下,正常人類要刪除某個程序,大部分都利用快速鍵 [Ctrl] + [Shift] + [Esc] 開啟工作管理員來強制結束應用程式,今天發現 Windows下也有類似 Linux 指令可以快速的刪除程序。可以先用 tasklist 找出程序的 pid (process id) ,然後再用 taskkill 刪除程序。
tasklist | find /i "{程序名稱}"
taskkill /f /pid {PID}
或利用程序名稱,直接刪除程序
taskkill /f /im {程序名稱}

例 WinXP 下要刪除 notepad.exe(記事本) 的應用程序,可以在命令提示字元下輸入:
tasklist | find /i "notepad" ( /i : 代表忽略大小寫 )
先找出名為 notepad 程序的 pid (第二欄即是pid),再用 taskkill 刪除
taskkill /f /pid 3316

OR 直接刪除所有名稱為 notepad.exe 的程序
taskkill /f /im notepad.exe



更多用法可參考:
tasklist /?
taskkill /?

用 taskkill 來結束處理程序中的程式

*當一些程式無法停止的時候可使用這個方法

用 taskkill 來結束處理程序中的程式

taskkill 描述:
這個命令列工具可以用來結束一個或數個處理程序。
可以依處理程序識別碼或影像名稱來清除處理程序。

TASKKILL [/S system [/U username [/P [password]]]]
{ [/FI filter] [/PID processid | /IM imagename] } [/F] [/T]


以結束flashget.exe 為說明

“開始→執行”命令,在“執行”對話方塊中輸入“cmd”命令,進入命令提示字元視窗(DOS模式視窗),在命令提示字元下輸入Taskkill /im flashget.exe" /f 就可以把flashget.exe 這個程序強制停止。