none
MCITP系列之Lewis’s gift time – 20070201- SQL Server 2005 CLR物件開發 RRS feed

  • 問題

  • [活動方式]

    老師於課程結束當天在論壇上po出當天課程內容相關問題,在「2天內」大家皆可踴躍回答,老師會選取出最快且最完整的回答,將之標示為「正確答案」,得獎者老師會於下次課堂上公佈(當然你也可以在2天後上論壇查看自己是否有被特別標註為解答),認真的幸運兒可能就是你喔 : P

    [注意事項]

    得獎者我們會查看你登入論壇的mail並寄信與您連絡,如果您等不到聯繫也可直接上論壇告知我們。

    [Question]

     2.請問寫出CLR的組件,並實作出T-SQL的預存程序,進行讀取作業系統的檔案,將該檔案的內容儲存到資料庫,檔案內容是分別記錄產品代號與銷售量,並使用『,』隔開?假設該檔案為c:\1.txt,內容如下

    1,100

    2,100

    3,100

    預設的資料表 CREATE TABLE T1 (C1 INT  , C2 INT)

    2007年2月4日 上午 02:58

解答

  • Imports System
    Imports System.Data
    Imports System.Data.SqlClient
    Imports System.Data.SqlTypes
    Imports Microsoft.SqlServer.Server
    Imports System.IO

    Partial Public Class StoredProcedures
        <Microsoft.SqlServer.Server.SqlProcedure()> _
        Public Shared Sub csp1(ByVal filepath As String)
            '宣告SqlDataRecord資料行與資料類型與長度
            Dim dtrow As New SqlDataRecord( _
            New SqlMetaData("c1", SqlDbType.Int), _
            New SqlMetaData("c2", SqlDbType.Int))

            Try
                SqlContext.Pipe.SendResultsStart(dtrow)
                Dim sr As StreamReader = New StreamReader(filepath)
                Dim Line As String
                Dim Arr() As String

                While Not sr.EndOfStream
                    Line = sr.ReadLine()
                    Arr = Split(Line, ",")

                    dtrow.SetInt32(0, CInt(Arr(0)))
                    dtrow.SetInt32(1, CInt(Arr(1)))

                    SqlContext.Pipe.SendResultsRow(dtrow)
                End While

                sr.Close()

               SqlContext.Pipe.SendResultsEnd()
            Catch EX As Exception
                Dim sp As SqlPipe = SqlContext.Pipe()
                sp.Send("Excption " + EX.Message)
            End Try

        End Sub
    End Class

    --使用方式,現在tempdb中建立t1的資料表

    create table tempdb.dbo.t1(c1 int,c2 int)
    go

    --執行預存程序並將結果新增到該資料表中

    INSERT INTO tempdb.dbo.t1 exec csp1 N'C:\1.txt'

    --查詢tempdb.dbo.t1的結果

    select * from tempdb.dbo.t1

    c1          c2
    ----------- -----------
    1           100
    2           100
    3           100

    (3 個資料列受到影響)

    2007年2月8日 上午 02:41