Oracle 數據庫使用 sql語句 : select lengthb('輸入字符串') from dual , 來計算 字符串 所占的字節長度(比如,一個漢字3個字節),但是用這個lengthb函數時,輸入字符串的長度不能超過4000,這樣遇到一些超長字符串就不行了,因此,需要用下面的三個vb.net函數來配合獲取:
Private Function getStrLength_long(strInput As String) As Integer
'Try
Dim list_strs As List(Of String) = getList_shortStrs(strInput)
Dim totalLength As Int16 = 0
For Each _str In list_strs
totalLength += getStrLength_short(_str)
Next
Return totalLength
'Catch ex As Exception
' MessageBox.Show("當前輸入的有特殊字符,不容許 " & ex.ToString)
' Return 0
'End Try
End Function
''' <summary>
''' 這個函數的功能,是將輸入的一個長字符串轉化為 由若干條較短的字符串組成的列表
''' 本函數是為了測算字符串的長度而做配套的,
''' oracle在測算字符串長度時,字符串長度不能超過4000個字節,否則會出錯
''' 所以,將一條長字符串轉化為若干條短字符串,對每條短字符串分別測算長度,再累加起來,即長字符串的長度
''' </summary>
''' <param name="strInput">輸入的一個長字符串</param>
''' <returns></returns>
Private Function getList_shortStrs(strInput As String) As List(OfString)
Dim lengthValue As Int16 = 1000 ' 閾值, 短字符串的長度
' 之所以定為 1000 ,是因為即使這1000個字符全是漢字,1000 *3 = 3000,仍然小於 4000
Dim list_strs As List(Of String) = New List(Of String)
Dim totalLength As Int16 = strInput.Length ' 名義上的總長度
If totalLength < lengthValue Then ' 如果名義長度 小於 閾值
list_strs.Add(strInput)
Return list_strs ' 返回
End If
' 現在知道該字符串 的長度 超過閾值了,需要處理
Dim ii = 0
While (ii + 1) * lengthValue <= totalLength ' 對長字符串進行 分段
list_strs.Add(strInput.Substring(ii * lengthValue, lengthValue))
ii += 1
End While
' 最后一小段字符串
list_strs.Add(strInput.Substring(ii * lengthValue, strInput.Length - ii * lengthValue))
Return list_strs ' 返回
End Function
' 下面這個函數只能對較短的字符串(長度不超過4000)判斷長度
Private Function getStrLength_short(strInput As String) As String
If strInput.Length = 0 Then
Return 0
End If
' 下面,直接根據Oracle數據庫的判讀字符串長度的方法來判斷
' lengthb(string)計算string所占的字節長度: select lengthb('¥') from dual
Dim strSql As String = "select lengthb('" & strInput & "') from dual"
Dim rs AsNew ADODB.Recordset
Dim da As New Data.OleDb.OleDbDataAdapter()
Dim cmd AsNew ADODB.Command
cmd.CommandText = strSql
cmd.ActiveConnection = conn
cmd.CommandType = CommandType.Text
'Try
rs = cmd.Execute() ' 執行
'Catch ex As Exception
' 'MessageBox.Show("當前輸入的字符串有特殊字符,無法判斷長度")
' Return "過長或特殊字符,無法判斷長度"
'End Try
If Not rs.EOF Then
Return rs.Fields(0).Value.ToString
End If
Return ""
End Function
