2026年3月25日 星期三

營利事業統一編號檢查碼邏輯修正

 營利事業統一編號檢查碼邏輯修正

--

舊版的統一編號邏輯檢查已經不適用囉!


趕緊修正一下




   Public Shared Function NEW_ValidateTaxID(ByVal vstrTaxID As String) As Boolean


        '空值或非8碼或非純數字


        If String.IsNullOrEmpty(vstrTaxID) OrElse vstrTaxID.Trim().Length <> 8 OrElse Not Integer.TryParse(vstrTaxID, Nothing) Then


            Return False


        End If




        Dim TaxID_7 As Boolean = (vstrTaxID.Substring(6, 1) = "7")


        Dim logics As Integer() = New Integer() {1, 2, 1, 2, 1, 2, 4, 1} '邏輯乘數


        Dim Z As Integer = 0 '垂直乘積之和 全部加總


        Dim Z1 As Integer = 0


        Dim Z2 As Integer = 0




        '邏輯乘數的數量與統編長度8碼一致


        For i As Integer = 0 To logics.Length - 1


            Dim num As Integer = Convert.ToInt32(vstrTaxID.Substring(i, 1)) '統編單一數字拆解


            Dim j As Integer = num * logics(i) '乘積直寫並上下相加


            Dim SumXX As Integer = (j \ 10) + (j Mod 10) '垂直乘積之和(上下數字相加)




            If TaxID_7 AndAlso i = 6 Then '統編第7位數字是"7" && 走訪到統編第7位數字時


                '"乘積之和"為"10",但政府文件要我們取"0或1"兩種情況(不是10)來相加。


                Z1 += 0


                Z2 += 1


                'Z 不理它


            Else


                Z += SumXX


                Z1 += SumXX


                Z2 += SumXX


            End If


        Next 'end for




        'int old_checkNum = 10; '2023年以前的舊版


        Dim checkNum As Integer = 5




        If TaxID_7 Then


            If (Z1 Mod checkNum = 0) OrElse (Z2 Mod checkNum = 0) Then


                Return True


            End If


        ElseIf Z Mod checkNum = 0 Then


            Return True


        End If




        Return False


    End Function

2026年3月18日 星期三

MS-SQL 分頁

引用來源: [MSSQL]分頁

---

方法一 : 使用ROW_NUMBER()搭配OVER(ORDER BY Field)(SQL Server 2008 開始)

ROW_NUMBER()

ROW_NUMBER ( )

    OVER ( [ PARTITION BY value_expression , ... [ n ] ] order_by_clause )

先用ROW_NUMBER()替每筆資料設定編號,再根據條件取得分頁內容(ROW_NUMBER從1開始)

DECLARE @PageIndex INT = 1, @PageSize INT = 25


SELECT * FROM

(

    SELECT

        *, ROW_NUMBER() OVER (ORDER BY FieldA DESC) as RowId

    FROM

        TableA

    WHERE

        Conditions

) AS vw

WHERE

    RowId BETWEEN (@PageIndex - 1) * @PageSize + 1 AND @PageIndex * @PageSize

方法二 : 使用OFFSET搭配FETCH(SQL Server 2012 開始)

OFFSET FETCH


OFFSET - FETCH 是 ORDER BY 子句的延伸功能。


FETCH

          [ [ NEXT | PRIOR | FIRST | LAST

                    | ABSOLUTE { n | @nvar }

                    | RELATIVE { n | @nvar }

               ]

               FROM

          ]

{ { [ GLOBAL ] cursor_name } | @cursor_variable_name }

[ INTO @variable_name [ ,...n ] ]

可以指定跳過的行數,指定要取回的資料列筆數(要從跳過 0 ROW開始)

DECLARE @PageIndex INT = 1, @PageSize INT = 25


SELECT

    *

FROM

    TableA

ORDER BY

    FieldA DESC

OFFSET (@PageIndex - 1)*@PageSize ROWS

FETCH NEXT @PageSize ROWS ONLY;

FETCH 寫法效能比 ROW_NUMBER() 快很多


2026年1月22日 星期四

MS-SQL 找尋 約束

 /*顯示資料內所有約束*/

SELECT * FROM sys.default_constraints WHERE parent_object_id = OBJECT_ID('A_TMP')

/*找詢約束*/

if (SELECT count(name) FROM sys.default_constraints WHERE parent_object_id = OBJECT_ID('A_TMP') and name='A_prod_name')>0

begin

   print '1'

end 

else

begin

   print '0'

end

2025年11月20日 星期四

使用 Robocopy 進行「資料夾」鏡像同步

參考來源+引用: 【程式開發筆記】讓電腦定時幫你備份重要資料,「鏡像同步、差異備份」樣樣通,Robocopy - 大漠國渡 

---

使用 Robocopy 進行「資料夾」鏡像同步

輸入「Robocopy <你的來源資料夾> <你的目的地資料夾> /mir /xo /e」

範例 : Robocopy D:\TEST D:\TEST2 /mir /xo /e

接下來將檔案儲存程「Windows 批次檔案 (.bat)」,「檔名」跟「路徑」就自己決定吧


// 第一種,會覆寫「目的地資料夾」安全性設定。

Robocopy <來源資料夾(檔案)> <目的地資料夾(檔案)> /mir /xo /e

// 第二種,不覆寫「目的地資料夾」安全性設定。

Robocopy <來源資料夾(檔案)> <目的地資料夾(檔案)> /e /xo /purge


「指令參數」說明

/e

複製子資料夾 (包含空的資料夾)

/xo

比較「來源檔案」與「目的地檔案」,若「來源檔案」較新則複製,否則排除不複製 (差異備份,所需參數)

/purge

刪除不存在於「來源資料夾」中的檔案 (差異備份,所需參數)

/mir 

鏡像資料夾 (相當於同時使用 /e 和 /purge 參數)。


「進階指令」說明

Robocopy <來源資料夾(檔案)> <目的地資料夾(檔案)> /e /xo /mir /mt: /dcopy:dat /xa:sh /xj /unicode /eta /R:5 /W:30 /tee /unilog+:D:\mirrorDir.txt /v

「指令參數」說明

/mt:<n> 

使用 n 個執行緒,執行工作。(如同 n 個人一起搬運檔案) 預設值是 8,最上值128。

需搭配使用 /log 參數,集中倒出,提升效能。

  

/log:<logfile>

使用系統編碼(Big5)寫入記錄檔。(若記錄檔已存在,覆寫現有的記錄檔)


/log+:<logfile>

使用系統編碼(Big5)寫入記錄檔。(若記錄檔已存在,接續寫入記錄檔)


/unilog:<logfile>

使用 UTF-8 編碼寫入記錄檔。(若記錄檔已存在,覆寫現有的記錄檔)


/unilog+:<logfile>

使用 UTF-8 編碼寫入記錄檔。(若記錄檔已存在,接續寫入記錄檔)


/dcopy:<copyflags> 

複製資料夾的內容。

D - 資料

A - 屬性

T - 時間戳記

E - 擴充屬性

X - 略過替代資料流

此選項的預設值為 DA (資料和屬性)。


/xa:[RASHCNETO]

符合以下屬性的檔案不處理。

R - 唯讀

A - 封存

S - 系統

H - 隱藏

C - 已壓縮

N - 未編製內容索引

E - 已加密

T - 暫存

O - 離線


/xj  

不複製 NTFS junction 檔案。


/unicode 

輸出內容使用 UTF-8 編碼。


/eta

顯示所複製檔案的預估抵達時間 (ETA)。


/r:<n> 

複製失敗,重新嘗試的次數,n 的預設值為 1,000,000 (一百萬次重試)。


/w:<n> 

複製失敗,重新嘗試的等候時間,以秒為單位,n 的預設值為 30 (等待時間為 30 秒)。


/tee 

將狀態輸出寫入主控台視窗及記錄檔。


/v 

產生詳細資訊輸出,並顯示所有略過的檔案。


1. 「鏡像同步」最終指令

Robocopy <來源資料夾(檔案)> <目的地資料夾(檔案)> /e /xo /mir /mt: /dcopy:dat /xa:sh /xj /unicode /eta /R:5 /W:30 /tee /unilog+:D:\mirrorDir.txt /v /xf *.tmp *.ds_store *.temp ~desktop.ini ~hiberfil.sys ~pagefile.sys ~thumbs.db ~swapfile.sys ~NTUSER.DAT ~ntuser.dat.LOG1 ~ntuser.dat.LOG2 $recycle.bin config.msi ntuser.dat ntuser.ini /xd "C:\Windows" "C:\ProgramData\Microsoft\Windows\Caches" "C:\Drivers" "C:\Temp" "C:\Documents and Settings" "*MSOCache*" "*RecycleBin*" "*recycler*" "*System Volume Information*"


「指令參數」說明


/xf <filename>[ ...]

符合指定名稱或路徑的檔案,支援使用萬用字元 (* 和 ?)。


*.tmp 

*.ds_store 

*.temp 

~desktop.ini 

~hiberfil.sys 

~pagefile.sys 

~thumbs.db 

~swapfile.sys 

~NTUSER.DAT 

~ntuser.dat.LOG1 

~ntuser.dat.LOG2 

$recycle.bin 

config.msi 

ntuser.dat 

ntuser.ini 


/xd <directory>[ ...] 

排除符合指定名稱和路徑的目錄。


"C:\Windows" 

"C:\ProgramData\Microsoft\Windows\Caches" 

"C:\Drivers" 

"C:\Temp" 

"C:\Documents and Settings" 

"*MSOCache*" 

"*RecycleBin*" 

"*recycler*" 

"*System Volume Information*"



2025年11月3日 星期一

SQL 取資料表所有欄位

 


SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, IS_NULLABLE

FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'table name'

2025年9月17日 星期三

VB.NET 檔案是否被鎖定

 參考引用:VB.NET 檔案是否被鎖定

--

Try                

    Dim fs AsFileStream = NewFileStream(excelFileName, FileMode.OpenOrCreate, FileAccess.Read)

              fs.Close()

Catch ex AsException

     MessageBox.Show(excelFileName & "文件当前已经打开,请先关闭")            

     Return   '  退出        

End  Try


----


Imports System.IO

Imports System.Runtime.InteropServices


Public Class Form1


    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click

        Dim str_thispath As String = String.Empty '完整檔案路徑

        str_thispath = TextBox1.Text

        TextBox2.Text = ""

        If File.Exists(str_thispath) Then

            IsFileOpen(str_thispath)

        Else

            TextBox2.Text = "檔案不存在:" & Date.Now.ToString("yyyy/MM/dd HH:mm:ss.fffffff") & " 結束執行。" & vbNewLine & TextBox2.Text

        End If

        TextBox2.Text = "系統於 " & Date.Now.ToString("yyyy/MM/dd HH:mm:ss.fffffff") & " 結束執行。" & vbNewLine & TextBox2.Text

    End Sub


    Function IsFileOpen(ByVal str_thispath As String) As Boolean

        Dim stream As FileStream = Nothing

        Try

            stream = File.Open(str_thispath, FileMode.Open, FileAccess.ReadWrite, FileShare.None)

            stream.Close()

            TextBox2.Text = "檔案可開啟:" & Date.Now.ToString("yyyy/MM/dd HH:mm:ss.fffffff") & " " & vbNewLine & TextBox2.Text

        Catch ex As Exception


            If TypeOf ex Is IOException AndAlso IsFileLocked(ex) Then

                TextBox2.Text = "發生例外錯誤:原因可能檔案正在使用中已上鎖..." & Date.Now.ToString("yyyy/MM/dd HH:mm:ss.fffffff") & " " & vbNewLine & TextBox2.Text

                Return True

            End If

        End Try

        Return False

    End Function


    Function IsFileLocked(exception As Exception) As Boolean

        Dim ERROR_SHARING_VIOLATION As Integer = 32, ERROR_LOCK_VIOLATION As Integer = 33

        Dim errorCode As Integer = Marshal.GetHRForException(exception) And ((1 << 16) - 1)

        Return errorCode = ERROR_SHARING_VIOLATION OrElse errorCode = ERROR_LOCK_VIOLATION

    End Function


End Class

2025年9月1日 星期一

vb ping get domain

 Imports System.Net.NetworkInformation


Public Class Form1


    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click

        Dim url As String = "https://xxx/xxx/xxxx"

        Dim utl_Donaim = GetDomainFromUrl(url)

        'If My.Computer.Network.Ping("198.01.01.01") Then

        'End If

        Using pinger As New Ping()

            Dim reply As PingReply = pinger.Send(utl_Donaim, 5000)

            If reply.Status = IPStatus.Success Then

                MessageBox.Show("Ping to {targetHost} successful! Roundtrip time: {reply.RoundtripTime}ms", "Ping Result")

            Else

                MessageBox.Show("Ping to {targetHost} failed. Status: {reply.Status}", "Ping Result")

            End If

        End Using



    End Sub


    Public Function GetDomainFromUrl(ByVal urlString As String) As String

        Try

            Dim uri As New Uri(urlString)

            Return uri.Host

        Catch ex As UriFormatException

            Return String.Empty

        End Try

    End Function


2025年8月29日 星期五

ASP.NET System.Threading.ThreadAbortException: 執行緒已經中止

 參考引用來源:ASP.NET System.Threading.ThreadAbortException: 執行緒已經中止
---

發生錯誤:執行緒已經中止。     

於 System.Threading.Thread.AbortInternal()

於 System.Threading.Thread.Abort(Object stateInfo)

於 System.Web.HttpResponse.AbortCurrentThread()

於 System.Web.HttpResponse.Redirect(String url, Boolean endResponse, Boolean permanent)

---


解決方案:https://support.microsoft.com/zh-tw/kb/918181

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


當 HttpResponse.Redirect 方法 endResponse 參數不設為 false 時,就會發生這個問題。 根據預設值,endResponse 參數設定為 true。



轉貼連結:http://www.dotblogs.com.tw/boei/archive/2010/07/11/16485.aspx

將網頁轉出成word的時候,最後會來個Response.End()來結束它的輸出,但都會發生<System.Threading.ThreadAbortException> 執行緒已經中止,雖然不會造成系統上的什麼問題。

解決方法:

1.    繼續用Response.End(),外面用try – catch包住,但try – catch會比較消耗資源,所以不考慮。

2.    改用HttpContext.Current.ApplicationInstance.CompleteRequest(),可以跳過Application_EndRequest 事件的執行。

 

如果使用Response.Redirect 或 Server.Transfer 方法也發生一樣狀況的話,就可以使用Response.Redirect(String url, bool endResponse),endResponse就設為False,因為Response.Redirect內部會用到Response.End(),設為False就是要停用Response.End()方法。



2025年8月26日 星期二

webclient 無法建立 SSL/TLS 的安全通道

 在 framework 4.0 無法建立 tls12

只能自己新增:

in .net Framework 4.0 add

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; //TLS 1.2