2016年9月9日 星期五

[Oracle][PL/SQL]動態執行Cursor-Dynamic Cursor

說明:在寫PL/SQL時,遇到需要在Function或Stored Procedure中,動態宣告Cursor以及取得Cursor欄位及值。
文中我們使用Function來做範例:
image
1.定義一個Function,F_Dynamic_Cursor_Demo
CREATE OR REPLACE PROCEDURE F_DYNAMIC_CURSOR_DEMO AS 

    --宣告Type

    TYPE TYPE_CUR IS RECORD ( 

      V_SQL VARCHAR(1000),

      V_CUR NUMBER,

      V_DTBL DBMS_SQL.DESC_TAB,

      V_CNT NUMBER,

      V_STATUS NUMBER,

      V_VAL VARCHAR2(200)); 

    

    REC_CUR TYPE_CUR;

BEGIN

    --查詢SQL語法

    REC_CUR.V_SQL:='SELECT ''GOOGLE'' AS NAME,18 AS AGE FROM DUAL';

    --動態設定CURSOR';

    REC_CUR.V_CUR:= DBMS_SQL.OPEN_CURSOR;

    DBMS_SQL.PARSE(REC_CUR.V_CUR,REC_CUR.V_SQL,DBMS_SQL.NATIVE);

    DBMS_SQL.DESCRIBE_COLUMNS(REC_CUR.V_CUR,REC_CUR.V_CNT,REC_CUR.V_DTBL);

    --動態定義CURSOR欄位;

    FOR I IN 1..REC_CUR.V_CNT LOOP

      --定義欄位及值還有Size

      DBMS_SQL.DEFINE_COLUMN(REC_CUR.V_CUR,I,REC_CUR.V_VAL,200);

    END LOOP;

    --動態執行CURSOR;

    REC_CUR.V_STATUS := DBMS_SQL.EXECUTE(REC_CUR.V_CUR);

    --動態取得CURSOR資料,巡覽每一筆資料

    WHILE ( DBMS_SQL.FETCH_ROWS(REC_CUR.V_CUR) > 0 ) LOOP

        --動態取得CURSOR欄位名稱及值

        FOR I IN 1..REC_CUR.V_CNT LOOP             

                  DBMS_SQL.COLUMN_VALUE(REC_CUR.V_CUR,I,REC_CUR.V_VAL);

                  DBMS_OUTPUT.PUT_LINE(REC_CUR.V_DTBL(I).COL_NAME||' --> '||REC_CUR.V_VAL);

        END LOOP;    

     END LOOP;

     DBMS_SQL.CLOSE_CURSOR(REC_CUR.V_CUR);       

END F_DYNAMIC_CURSOR_DEMO;

2.執行F_Dynamic_Cursor_Demo
begin

  F_DYNAMIC_CURSOR_DEMO;

end;

3.結果
NAME --> GOOGLE
AGE –> 18


2014年4月30日 星期三

[VB.NET][XML]使用XPATH查詢含有前置詞的XML

使用.NET的XmlDocument類別要處理XML檔非常方便,但是遇到有XmlNamespace的XML要怎麼處理?
一般會有常見的像是Soap描述檔,節點前面都有前置詞,例如:xsd:節點名稱
Test.xml
 
 

  
    
      
        A
        
          
            A1
            A2
          
        
      
      
        B
        
          B1
          B2
          B3
        
      
    
  

VB.NET
    Sub Main()
        Dim oXml As New XmlDocument
        Dim nsmgr As XmlNamespaceManager = New XmlNamespaceManager(oXml.NameTable)
        oXml.Load("Test.xml")
        '這裡要對應XML內容的真正使用的Namespace如:xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        nsmgr.AddNamespace("xsd", "http://www.w3.org/2001/XMLSchema")
        '回傳單一節點
        Console.WriteLine(oXml.SelectSingleNode("//xsd:anyType[1]", nsmgr).InnerText)
        '回傳多個節點
        For Each Note As XmlNode In oXml.SelectNodes("//xsd:anyType", nsmgr)
            Console.WriteLine(Note.InnerText)
        Next
        Console.ReadKey()
    End Sub

2014年1月25日 星期六

[VB.NET]Console程式,接收外部傳入的參數雙引號消失問題

1.狀況:A程式呼叫外部Console程式,並傳入JOSN格式給Console程式,如果此時JSON格式中有雙引號("),

Console程式接受後雙引號會消失,因此造成JOSN無法反序列化。

解決方式:再傳入參數時,先將雙引號前加入反斜線\,用來脫逸雙引號。

例如:"你好嗎?" –>\"你好嗎?\"

[VB.NET][JSON]將物件序列化成Json格式

1.在專案中加入參考System.Runtime.Serialization命名空間

2.在類別中加入Imports System.Runtime.Serialization.Json

 
'''
''' 物件序列化成Json格式
'''

''' 物件型別
''' 物件
''' Json格式
Public Shared Function JsonSerialize(Of T)(ByVal o As T) As String
Return JsonSerialize(Of T)(o, Encoding.Default)
End Function
'''
''' 物件序列化成Json格式
'''

''' 物件型別
''' 物件
''' 編碼
''' Json格式
Public Shared Function JsonSerialize(Of T)(ByVal o As T, ByVal encoding As Encoding) As String
Using ms As New MemoryStream
Dim json As New DataContractJsonSerializer(GetType(T))
json.WriteObject(ms, o)
Using sr As New StreamReader(ms, encoding)
ms.Position = 0
Return sr.ReadToEnd()
End Using
End Using
End Function
'''
''' Json格式反序列化成物件
'''

''' 物件型別
''' Json格式
''' 物件
Public Shared Function JsonDeserialize(Of T)(ByVal s As String) As T
Return JsonDeserialize(Of T)(s, Encoding.Default)
End Function
'''
''' Json格式反序列化成物件
'''

''' 物件型別
''' Json格式
''' 編碼
''' 物件
Public Shared Function JsonDeserialize(Of T)(ByVal s As String, ByVal encoding As Encoding) As T
Using ms As New MemoryStream(encoding.GetBytes(s))
Dim json As New DataContractJsonSerializer(GetType(T))
ms.Position = 0
Return json.ReadObject(ms)
End Using
End Function

2014年1月23日 星期四

[VB.NET][MVC]DataTable物件顯示於View

Controller
 
         Function Index() As ActionResult
            Dim dt As New DataTable
            dt.Columns.Add("Name")
            dt.Columns.Add("Age")
            Dim dr As DataRow
            dr = dt.NewRow()
            dr("Name") = "Aaron"
            dr("Age") = 19
            dt.Rows.Add(dr)
            dr = dt.NewRow()
            dr("Name") = "Justin"
            dr("Age") = 19
            dt.Rows.Add(dr)
            Return View(dt)
        End Function
View
 

@Code
    ViewData("Title") = "MyTest"
    Layout = "~/Views/Shared/_Layout.vbhtml"
    Dim dt As Data.DataTable = Model
End Code
<table>
    <tr>
        @For Each row As System.Data.DataRow In dt.Rows
            @<td>
                <th>@row(0)</th>
            </td>
        Next
    </tr>
</table>

2013年11月27日 星期三

[VB.NET]Get IP Address取得本機IP

一,使用電腦名稱取得本機IP
 
    ''' 
    ''' 取得本機IPAddress
    ''' 
    ''' IPAddress
    Public Shared Function GetIPaddress() As String
        Dim myHost As String = System.Net.Dns.GetHostName
        Dim myIPs As System.Net.IPHostEntry = System.Net.Dns.GetHostEntry(myHost)
        For Each ipAddress As System.Net.IPAddress In myIPs.AddressList
            Return ipAddress.ToString()
        Next
        Return String.Empty
    End Function 

二,取得本機所有網卡IPAddress
 
    Private Function GetIPaddress() As List(Of String)
        Dim IpAddressList As New List(Of String)
        Try
            '取得本機上ipv4及非Loopback的IP Address
            For Each nic As System.Net.NetworkInformation.NetworkInterface In System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()
                For Each ipInfo As System.Net.NetworkInformation.IPAddressInformation
                     In nic.GetIPProperties().UnicastAddresses
                    If System.Net.IPAddress.IsLoopback(ipInfo.Address) = False _
                        AndAlso ipInfo.Address.AddressFamily <> Net.Sockets.AddressFamily.InterNetworkV6 Then
                        '取得IP Address
                        IpAddressList.Add(ipInfo.Address.ToString())
                    End If
                Next
            Next
            Return IpAddressList 
        Finally
            IpAddressList = Nothing
        End Try
    End Function

2013年9月13日 星期五

[VB.NET]Oracle Client連線發生錯誤,當與具有 32 位元的 Oracle 用戶端元件執行 64 位元模式安裝時,會出現此問題。

開發工具:VS2010

DB Driver:Oracle Client 11gR2 64bit

OS:Win7 64bit .NET Framework 4.0 

使用Oracle Provider發生:System.InvalidOperationException 嘗試載入 Oracle 用戶端程式庫時傳出 BadImageFormatException。當與具有 32 位元的 Oracle 用戶端元件執行 64 位元模式安裝時,會出現此問題。 

在網路上許多文章是說只要將VS的組態設定成X86即可。但是此方法對我的狀況沒有改善 

解決方法:
 1.將Oracle Client移除
 2.OS重新開機
 3.重裝Oracle Client 64bit(依OS的版本)
 4.解決