<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>ADO</title><link>http://blog.blueshop.com.tw/topcat/category/527.aspx</link><description>ADO物件使用技術交流 </description><managingEditor>topcat</managingEditor><dc:language>zh-TW</dc:language><generator>.Text Version 0.95.2004.101</generator><item><dc:creator>topcat</dc:creator><title>RecordSet轉DataSet</title><link>http://blog.blueshop.com.tw/topcat/archive/2007/08/24/52132.aspx</link><pubDate>Fri, 24 Aug 2007 09:55:00 GMT</pubDate><guid>http://blog.blueshop.com.tw/topcat/archive/2007/08/24/52132.aspx</guid><wfw:comment>http://blog.blueshop.com.tw/topcat/comments/52132.aspx</wfw:comment><comments>http://blog.blueshop.com.tw/topcat/archive/2007/08/24/52132.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.blueshop.com.tw/topcat/comments/commentRss/52132.aspx</wfw:commentRss><trackback:ping>http://blog.blueshop.com.tw/topcat/services/trackbacks/52132.aspx</trackback:ping><description>&lt;P&gt;上一篇&lt;A href="http://blog.blueshop.com.tw/topcat/archive/2007/08/24/52128.aspx" target=_blank&gt;從DataSet轉Recordset&lt;/A&gt;後，接著就是另一個方向，從RecordSet轉DataSet&lt;/P&gt;
&lt;P&gt;這個部份就沒有像上一篇那樣辛苦，可以直接透過DataAdapter的Fill來處理&lt;/P&gt;
&lt;P&gt;程式需要Imports三個NameSpace&lt;BR&gt;Imports ADODB&lt;BR&gt;Imports System.Data&lt;BR&gt;Imports System.Data.OleDb&lt;/P&gt;
&lt;P&gt;相關的程式如下&lt;/P&gt;
&lt;P&gt;&lt;TEXTAREA class=vb style="WIDTH: 664px; HEIGHT: 100px" name=code rows=6 cols=78&gt;    Private Function Rs2Ds(ByVal Rs As Recordset) As DataSet
        Dim Da As New OleDbDataAdapter
        Da.Fill(Ds, Rs, "Table1")
        Return Ds
    End Function
&lt;/TEXTAREA&gt;&lt;/P&gt;&lt;img src ="http://blog.blueshop.com.tw/topcat/aggbug/52132.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>topcat</dc:creator><title>DataSet轉RecordSet的Function</title><link>http://blog.blueshop.com.tw/topcat/archive/2007/08/24/52128.aspx</link><pubDate>Fri, 24 Aug 2007 08:41:00 GMT</pubDate><guid>http://blog.blueshop.com.tw/topcat/archive/2007/08/24/52128.aspx</guid><wfw:comment>http://blog.blueshop.com.tw/topcat/comments/52128.aspx</wfw:comment><comments>http://blog.blueshop.com.tw/topcat/archive/2007/08/24/52128.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blog.blueshop.com.tw/topcat/comments/commentRss/52128.aspx</wfw:commentRss><trackback:ping>http://blog.blueshop.com.tw/topcat/services/trackbacks/52128.aspx</trackback:ping><description>&lt;P&gt;小喵目前正值.NET與ASP的混用期&lt;/P&gt;
&lt;P&gt;因此目前撰寫的元件，可能會被以前的ASP程式呼叫到，於是這衍生了一個問題&lt;BR&gt;以前的ASP看不懂DataSet，以前的VB6元件也看不懂DataSet&lt;/P&gt;
&lt;P&gt;因此小喵寫了個小小的Function來轉換，相關程式碼如下&lt;/P&gt;
&lt;P&gt;&lt;TEXTAREA class=vb style="WIDTH: 698px; HEIGHT: 100px" name=code rows=6 cols=82&gt;    Public Function ChgDs2Rs(ByVal Ds As DataSet) As Object
        '*************************************************************************
        '**     撰寫者：                撰寫日期：2007/6/4
        '**     用途：  1.DataSet 轉 RecordSet
        '**     做法：
        '**             1.
        '**     注意事項：
        '**             1.
        '**             2.
        '**     維護記錄：
        '**         維護者：姓名(員工代號)     維護日期：日期
        '**         維護項目：
        '**                 1.
        '**                 2.
        '**         做法：  1.
        '**                 2.
        '**         注意事項：
        '**                 1.
        '*************************************************************************
        Try
            Dim rs As Object = CreateObject("ADODB.Recordset")

            If Ds.Tables(0).Rows.Count &amp;gt; 0 Then
                Dim x, y As Integer
                Dim ColName As String = ""

                For x = 0 To Ds.Tables(0).Columns.Count - 1
                    ColName = Ds.Tables(0).Columns(x).ColumnName
                    rs.Fields.Append(ColName, 200, 255)
                Next
                rs.Open()

                For y = 0 To Ds.Tables(0).Rows.Count - 1
                    rs.AddNew()
                    For x = 0 To Ds.Tables(0).Columns.Count - 1
                        If IsDBNull(Ds.Tables(0).Rows(y).Item(x)) Then
                            rs.Fields(x).Value = ""
                        Else
                            rs.Fields(x).Value = Ds.Tables(0).Rows(y).Item(x)
                        End If
                    Next
                Next
            End If

            Return rs

        Catch ex As Exception
            Throw New Exception(ex.Message.ToString)

        Finally
            'Ds.Dispose()

        End Try
    End Function
&lt;/TEXTAREA&gt;&lt;/P&gt;&lt;img src ="http://blog.blueshop.com.tw/topcat/aggbug/52128.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>topcat</dc:creator><title>取出RecordSet資料時，使用For...Next迴圈取代While,Do...Loop迴圈</title><link>http://blog.blueshop.com.tw/topcat/archive/2006/10/25/43334.aspx</link><pubDate>Wed, 25 Oct 2006 08:31:00 GMT</pubDate><guid>http://blog.blueshop.com.tw/topcat/archive/2006/10/25/43334.aspx</guid><wfw:comment>http://blog.blueshop.com.tw/topcat/comments/43334.aspx</wfw:comment><comments>http://blog.blueshop.com.tw/topcat/archive/2006/10/25/43334.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blog.blueshop.com.tw/topcat/comments/commentRss/43334.aspx</wfw:commentRss><trackback:ping>http://blog.blueshop.com.tw/topcat/services/trackbacks/43334.aspx</trackback:ping><description>&lt;P&gt;小喵檢視一下，發現觀念小喵竟然沒有寫上，趕緊補上提供大家參考&lt;/P&gt;
&lt;P&gt;在ASP中經常回將資料庫取得的資料放在RecordSet中&lt;BR&gt;然後再透過迴圈將資料展現於畫面上&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;小喵大部分看到的都是以While或者Do..Loop迴圈撰寫&lt;BR&gt;例如以下這樣&lt;/P&gt;
&lt;P&gt;&lt;TEXTAREA class=vb name=code rows=6 cols=50&gt;If Not (rs.BOF And rs.EOF) Then
    rs.MoveFirst
    Do
        '在此取出資料
        rs.MoveNext    '這一行千萬不能忘了
    Loop Until rs.EOF
End If
&lt;/TEXTAREA&gt;&lt;BR&gt;這樣的寫法有個重大的危機，那就是當&lt;BR&gt;rs.MoveNext忘了寫的話，會造成【無窮迴圈】&lt;BR&gt;而這樣的事情，就連小喵也經常發生&lt;/P&gt;
&lt;P&gt;為了改善這樣的缺點，於是小喵改變寫法，使用For...Next迴圈來展現資料&lt;BR&gt;&lt;TEXTAREA class=vb name=code rows=6 cols=50&gt;If Not(rs.BOF And rs.EOF) Then
    rs.MoveFirst
    For y = 1 to rs.RecordCount   '從第1筆到最後1筆(RecordCount)
        '在此取出資料
        rs.MoveNext
    Next
End If&lt;/TEXTAREA&gt;&lt;BR&gt;用For...Next迴圈會有什麼樣的好處呢&lt;BR&gt;想想如果忘記寫rs.MoveNext的話...會怎樣&lt;BR&gt;他會是重複顯示第一筆資料&lt;BR&gt;但絕不會造成無窮迴圈的發生(有多少筆資料，迴圈多少次，所以不會無窮)&lt;BR&gt;這樣就可以避開因為撰寫的不小心造成無窮迴圈了&lt;/P&gt;
&lt;P&gt;^_^&lt;/P&gt;&lt;img src ="http://blog.blueshop.com.tw/topcat/aggbug/43334.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>topcat</dc:creator><title>ADO如何取得Connection新增修改刪除影響的筆數</title><link>http://blog.blueshop.com.tw/topcat/archive/2006/09/20/39686.aspx</link><pubDate>Wed, 20 Sep 2006 14:57:00 GMT</pubDate><guid>http://blog.blueshop.com.tw/topcat/archive/2006/09/20/39686.aspx</guid><wfw:comment>http://blog.blueshop.com.tw/topcat/comments/39686.aspx</wfw:comment><comments>http://blog.blueshop.com.tw/topcat/archive/2006/09/20/39686.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blog.blueshop.com.tw/topcat/comments/commentRss/39686.aspx</wfw:commentRss><trackback:ping>http://blog.blueshop.com.tw/topcat/services/trackbacks/39686.aspx</trackback:ping><description>&lt;P&gt;&lt;TEXTAREA class=vb style="WIDTH: 422px; HEIGHT: 33px" name=code rows=1 cols=50&gt;conn.Execute SQLTXT,num&lt;/TEXTAREA&gt;&lt;/P&gt;
&lt;P&gt;Connection.Execute的第二個參數就是SQL執行後影響的筆數&lt;/P&gt;
&lt;P&gt;^_^&lt;/P&gt;&lt;img src ="http://blog.blueshop.com.tw/topcat/aggbug/39686.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>topcat</dc:creator><title>rs("ABC")與rs.Fields("ABC").value的差別</title><link>http://blog.blueshop.com.tw/topcat/archive/2005/10/19/12603.aspx</link><pubDate>Wed, 19 Oct 2005 10:41:00 GMT</pubDate><guid>http://blog.blueshop.com.tw/topcat/archive/2005/10/19/12603.aspx</guid><wfw:comment>http://blog.blueshop.com.tw/topcat/comments/12603.aspx</wfw:comment><comments>http://blog.blueshop.com.tw/topcat/archive/2005/10/19/12603.aspx#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://blog.blueshop.com.tw/topcat/comments/commentRss/12603.aspx</wfw:commentRss><trackback:ping>http://blog.blueshop.com.tw/topcat/services/trackbacks/12603.aspx</trackback:ping><description>&lt;P&gt;當我們透過RecordSet取得資料的時候&lt;BR&gt;我們要將資料顯示出來時，假設欄位名稱是ABC，內容是PQRS的字串&lt;BR&gt;寫成&lt;BR&gt;&amp;lt;%=rs("ABC")%&amp;gt;&lt;BR&gt;&amp;lt;%=rs.Fields("ABC").value%&amp;gt;&lt;BR&gt;所得到的結果都是&lt;FONT color=#0000ff&gt;PQRS&lt;/FONT&gt;的字串&lt;BR&gt;那麼這兩種寫法有什麼不同呢&lt;/P&gt;
&lt;P&gt;--------------------------------------------------&lt;BR&gt;ABCX = rs("ABC")&lt;BR&gt;對於RecordSet來說....&lt;BR&gt;是把ABC這個【&lt;STRONG&gt;&lt;FONT color=#0000ff&gt;Fileds物件&lt;/FONT&gt;&lt;/STRONG&gt;】指定給ABCX&lt;BR&gt;rs("ABC")是省略了rs.Fields("ABC")&lt;BR&gt;&lt;STRONG&gt;&lt;FONT color=#0000ff&gt;顯示的時候，預設會用Fields中的Value屬性顯示資料&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;由於是指定了【物件】給變數&lt;BR&gt;所以如果rs.close的時候&lt;BR&gt;也就斷了聯繫了&lt;/P&gt;
&lt;P&gt;如果改成&lt;BR&gt;ABCX = rs.Fields("ABC").Value&lt;BR&gt;那麼就是把【&lt;FONT color=#0000ff&gt;&lt;STRONG&gt;屬性Value的內容&lt;/STRONG&gt;&lt;/FONT&gt;】指定給ABCX&lt;BR&gt;此時的ABCX是【值】&lt;/P&gt;
&lt;P&gt;因此當rs.close的時候&lt;BR&gt;就不會因此斷了聯繫&lt;/P&gt;
&lt;P&gt;--------------------------------------------------------------&lt;BR&gt;因此小喵的建議&lt;BR&gt;在撰寫程式的時候，其實我們大部分要用的是&lt;BR&gt;RecordSet的某個Field的Value&lt;BR&gt;建議大家&lt;BR&gt;儘量寫成&lt;STRONG&gt;&lt;FONT color=#0000ff&gt;rs.Fields("ABC").value&lt;/FONT&gt;&lt;/STRONG&gt;的方式比較不會有意外的狀況發生&lt;/P&gt;
&lt;P&gt;^_^&lt;/P&gt;&lt;img src ="http://blog.blueshop.com.tw/topcat/aggbug/12603.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>topcat</dc:creator><title>SQL隱碼攻擊的相關文章</title><link>http://blog.blueshop.com.tw/topcat/archive/2005/10/18/12594.aspx</link><pubDate>Tue, 18 Oct 2005 18:26:00 GMT</pubDate><guid>http://blog.blueshop.com.tw/topcat/archive/2005/10/18/12594.aspx</guid><wfw:comment>http://blog.blueshop.com.tw/topcat/comments/12594.aspx</wfw:comment><comments>http://blog.blueshop.com.tw/topcat/archive/2005/10/18/12594.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blog.blueshop.com.tw/topcat/comments/commentRss/12594.aspx</wfw:commentRss><trackback:ping>http://blog.blueshop.com.tw/topcat/services/trackbacks/12594.aspx</trackback:ping><description>在撰寫程式的時候&lt;BR&gt;如果讀取資料庫是透過組合sql語法來處理&lt;BR&gt;粉容易就會陷入SQL隱碼攻擊的陷阱中&lt;BR&gt;&lt;BR&gt;以下兩篇有精采的說明&lt;BR&gt;&lt;A href="http://www.microsoft.com/taiwan/sql/SQL_Injection_G1.htm"&gt;http://www.microsoft.com/taiwan/sql/SQL_Injection_G1.htm&lt;/A&gt;&lt;BR&gt;&lt;A href="http://www.microsoft.com/taiwan/sql/SQL_Injection_G2.htm"&gt;http://www.microsoft.com/taiwan/sql/SQL_Injection_G2.htm&lt;/A&gt;&lt;BR&gt;&lt;img src ="http://blog.blueshop.com.tw/topcat/aggbug/12594.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>topcat</dc:creator><title>訂單編號方式探討</title><link>http://blog.blueshop.com.tw/topcat/archive/2005/09/13/11728.aspx</link><pubDate>Tue, 13 Sep 2005 10:08:00 GMT</pubDate><guid>http://blog.blueshop.com.tw/topcat/archive/2005/09/13/11728.aspx</guid><wfw:comment>http://blog.blueshop.com.tw/topcat/comments/11728.aspx</wfw:comment><comments>http://blog.blueshop.com.tw/topcat/archive/2005/09/13/11728.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blog.blueshop.com.tw/topcat/comments/commentRss/11728.aspx</wfw:commentRss><trackback:ping>http://blog.blueshop.com.tw/topcat/services/trackbacks/11728.aspx</trackback:ping><description>&lt;P&gt;最近有幾個網友問到關於訂單編號產生的問題&lt;BR&gt;小喵針對小喵的經驗做以下的整理，提供大家參考&lt;/P&gt;
&lt;P dir=ltr style="MARGIN-RIGHT: 0px"&gt;&lt;STRONG&gt;&lt;EM&gt;一、編號方式(年月編定法)：&lt;/EM&gt;&lt;/STRONG&gt;&lt;BR&gt;訂單編號的方式，沒有特定的哪一種是比較好的，其實依照不同的需求會有不同的方式&lt;BR&gt;小喵介紹的是依照訂單產生的年月來做編號的方式&lt;/P&gt;
&lt;P&gt;首先，要先確認您的編號位數有幾位&lt;BR&gt;如果以民國年來編排，那麼例如今天是94年9月13日&lt;BR&gt;那麼依照【民國年月】9409&lt;BR&gt;但是為了顧及超過民國100年以後會多一碼的問題...&lt;BR&gt;所以建議使用09409的方式.....&lt;/P&gt;
&lt;P&gt;接著要來預想一下....單月的最大訂單數可能為多少&lt;BR&gt;必須想出一個不會太多(太多了浪費位數)...也不會太少(太少了到時候編碼放不下)&lt;/P&gt;
&lt;P&gt;假設單月的最高定單位數為99999筆(5位數字)&lt;BR&gt;(將近10萬筆...如果超過的話...大賺錢的情況下...再改程式也是一邊笑一邊改)&lt;BR&gt;那麼本月的第一筆訂單的方式就會是0940900001&lt;/P&gt;
&lt;P&gt;如果是西元年&lt;BR&gt;把094改為2005即可&lt;BR&gt;那麼本月的第一筆訂單的方式就會是20050900001&lt;BR&gt;這樣的編碼方式應該還可以用7千多年(千年老店^_^)&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;EM&gt;二、編號產生時機：&lt;BR&gt;&lt;/EM&gt;&lt;/STRONG&gt;接著要來討論一下...編號要何時來產生呢&lt;BR&gt;小喵要介紹的是兩種方式.....&lt;BR&gt;1.資料維護時產生訂單編號：&lt;BR&gt;2.預先產生訂單編號：&lt;/P&gt;
&lt;P&gt;這兩種方式各有各的需求&lt;BR&gt;維護時產生：&lt;BR&gt;&amp;nbsp; 不需要使用金流，因此不必預先產生訂單編號，在維護資料庫的時候，在即時產生訂單編號即可&lt;BR&gt;&amp;nbsp; 過程如下：&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 使用者按下新增→訂單內容輸入表單→使用者按下【維護新增】→產生訂單編號→INSERT到訂單相關資料&lt;/P&gt;
&lt;P&gt;預先產生訂單編號：&lt;BR&gt;&amp;nbsp; 由於線上刷卡的金流機制是記錄著訂單編號、訂單總額&lt;BR&gt;&amp;nbsp; 如果使用1.的方式，那麼假設消費者完成了完整的訂購流程、也完成了刷卡流程...那樣沒有問題&lt;BR&gt;&amp;nbsp; 問題是如果訂單內容產生了、消費者到了刷卡的畫面時，就直接把網頁關閉(消費者只是測試、並沒有真正購買)&lt;BR&gt;&amp;nbsp; 此時訂單內容已經維護到訂單的相關資料了...卻因為沒有刷卡的紀錄...造成了無效的訂單資料&lt;BR&gt;&amp;nbsp; 通常這樣的消費者測試行為無法避免，而且因測試產生的訂單也是沒有用的資料居多&lt;BR&gt;&amp;nbsp; (測試嘛...姓名大多是小明小華之類的假名)&lt;BR&gt;&amp;nbsp; 這些無效資料還得另外一個機制來剔除&lt;BR&gt;&amp;nbsp; 因此，如果能夠預先產生訂單編號→直到刷卡成功→再將訂單內容維護到訂單檔案&lt;BR&gt;&amp;nbsp; 這樣就能夠杜絕無效訂單內容的產生&lt;BR&gt;&amp;nbsp; 他的過程大約如下&lt;BR&gt;&amp;nbsp; 使用者按下新增→訂單內容輸入表單(購物車)→使用者按下【結帳】→預先產生訂單編號→進入刷卡流程→刷卡成功維護訂單檔&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;STRONG&gt;&lt;EM&gt;三、訂單碰撞：&lt;/EM&gt;&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp; 網路系統為多人同時使用系統。而訂單編號是訂單資料的主索引，必須不能夠重複，因此如何避免訂單編號發生碰撞&lt;BR&gt;&amp;nbsp; 是我們程式設計者要注意到的問題&lt;BR&gt;&amp;nbsp; 因此，在產生訂單編號的過程中，如何讓產生訂單編號的過程儘量縮短、並且適度的Lock資料是必須的&lt;/P&gt;
&lt;P&gt;接著就來說明一下如何產生訂單編號的方式&lt;BR&gt;&lt;STRONG&gt;&lt;EM&gt;四、維護時產生編號方法：&lt;/EM&gt;&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp; 過程&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 使用者按下新增→訂單內容輸入表單→使用者按下【維護新增】→產生訂單編號→INSERT到訂單相關資料&lt;BR&gt;&amp;nbsp; &lt;BR&gt;&amp;nbsp; 在這樣的模型中，【產生訂單編號】可以拆解為以下的細部動作&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 【取得當月訂單最大值】&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; →【無資料==&amp;gt;新增當月第1筆訂單編號】&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; →【有資料==&amp;gt;最大值後5碼轉數字+1】&lt;BR&gt;&amp;nbsp; 假設訂單資料表名稱為OrderHead&lt;BR&gt;&amp;nbsp; 訂單編號欄位名稱為OrderNo(文字,11位)&lt;BR&gt;&amp;nbsp; 那麼方式是&lt;/P&gt;
&lt;P&gt;&lt;TEXTAREA rows=27 cols=80&gt;SqlTxt="SELECT Max(OrderNo) as MOdrNo FROM OrderHead WHERE (Left([OrderNo],6)='200509') "
rs.Open SqlTxt
'Max一定會有一筆資料，但是如果沒有最大值，會是Null
NewOrderNo=Year(Now) &amp;amp; Right(CStr(Month(Now)+100),2)
tmpOdrNo=0
If IsNull(rs.Fields("MOdrNo").value) Then
    '當月沒有訂單編號
    NewOrderNo = NewOrderNo &amp;amp; "00001"
Else
    '當月有訂單編號
    tmpOdrNo=CLng(rs.Fields("MOdrNo").value)+1
    NewOrderNo=NewOorderNo &amp;amp; Right(CStr(tmpOdrNo+10*5),5)
End If
rs.close
'維護OrderHead
sqlInsert="Insert Into OrderHead ......"
Conn.Execute sqlInsert
'維護OrderDetail(迴圈多筆)
For y = 1 to Request.Form("Model").Count
    sqlInsert="Insert Into OrderDetail ......"
    Conn.Execute sqlInsert
Next

&lt;/TEXTAREA&gt;&lt;BR&gt;&lt;BR&gt;這樣就能夠新增料前產生訂單編號&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;STRONG&gt;&lt;EM&gt;五、預先產生編號方法：&lt;/EM&gt;&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp; 預先產生訂單編號，會比上一個方式更複雜一些&lt;BR&gt;&amp;nbsp; 因為產生的訂單編號並不是即時維護入OrderHead中&lt;BR&gt;&amp;nbsp; 所以必須有另外一個資料表用來管理目前的訂單編號&lt;BR&gt;&amp;nbsp; 資料表：&lt;BR&gt;&amp;nbsp;CurrOrderNo:訂單編號管理檔&lt;BR&gt;&amp;nbsp;&amp;nbsp;欄位：OrderNo(文字,11)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;OrderHead:訂單檔&lt;BR&gt;&amp;nbsp;&amp;nbsp;欄位：OrderNo(文字,11)&lt;/P&gt;
&lt;P&gt;流程如下：&lt;BR&gt;1.取得訂單編號管理檔目前年月的訂單編號&lt;BR&gt;2a.無資料→新編編號→維護回CurrOrderNo&lt;BR&gt;2b.有資料→編號尾數+1→編出新編號→維護回CurrOrderNo&lt;/P&gt;&lt;TEXTAREA rows=31 cols=80&gt;'1.取得訂單編號管理檔(CurrOrderNo)目前年月的訂單編號
SqlTxt="SELECT Max(OrderNo) as MOdrNo FROM CurrOrderNo WHERE (Left([OrderNo],6)='200509') "
rs.Open SqlTxt
'Max一定會有一筆資料，但是如果沒有最大值，會是Null
NewOrderNo=Year(Now) &amp;amp; Right(CStr(Month(Now)+100),2)
tmpOdrNo=0
If IsNull(rs.Fields("MOdrNo").value) Then
    '2a.無資料→新編編號→維護回CurrOrderNo
    NewOrderNo = NewOrderNo &amp;amp; "00001"
    sqlUpdate="Update CurrOrderNo Set OrderNo = '" &amp;amp; NewOrderNo &amp;amp; "' "
    Conn.Execute sqlUpdate
Else
    '2b.有資料→編號尾數+1→編出新編號→維護回CurrOrderNo
    tmpOdrNo=CLng(rs.Fields("MOdrNo").value)+1
    NewOrderNo=NewOorderNo &amp;amp; Right(CStr(tmpOdrNo+10*5),5)
    sqlUpdate="Update CurrOrderNo Set OrderNo = '" &amp;amp; NewOrderNo &amp;amp; "' "
    Conn.Execute sqlUpdate
End If
rs.close
'維護OrderHead
sqlInsert="Insert Into OrderHead ......"
Conn.Execute sqlInsert
'維護OrderDetail(迴圈多筆)
For y = 1 to Request.Form("Model").Count
    sqlInsert="Insert Into OrderDetail ......"
    Conn.Execute sqlInsert
Next

&lt;/TEXTAREA&gt;&lt;img src ="http://blog.blueshop.com.tw/topcat/aggbug/11728.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>topcat</dc:creator><title>rs.open的參數整理</title><link>http://blog.blueshop.com.tw/topcat/archive/2005/09/02/11655.aspx</link><pubDate>Fri, 02 Sep 2005 17:31:00 GMT</pubDate><guid>http://blog.blueshop.com.tw/topcat/archive/2005/09/02/11655.aspx</guid><wfw:comment>http://blog.blueshop.com.tw/topcat/comments/11655.aspx</wfw:comment><comments>http://blog.blueshop.com.tw/topcat/archive/2005/09/02/11655.aspx#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://blog.blueshop.com.tw/topcat/comments/commentRss/11655.aspx</wfw:commentRss><trackback:ping>http://blog.blueshop.com.tw/topcat/services/trackbacks/11655.aspx</trackback:ping><description>&lt;P&gt;當我們在撰寫asp的時候，結合資料庫難免會用的ADO的RecordSet物件&lt;/P&gt;
&lt;P&gt;常常寫著rs.open&amp;nbsp; sql,conn,3,3&lt;/P&gt;
&lt;P&gt;但是那些數字代表什麼意義呢....整理如下&lt;/P&gt;
&lt;P&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#ff0000&gt;語法&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000000&gt;Set Rs = Server.CreateObject("ADODB.Recordset")&lt;BR&gt;Rs.Open &lt;FONT color=#ff0000&gt;Source&lt;/FONT&gt;, &lt;FONT color=#ff0000&gt;ActiveConnection&lt;/FONT&gt;, &lt;FONT color=#ff0000&gt;CursorType&lt;FONT color=#000000&gt;,&lt;/FONT&gt; LockType&lt;/FONT&gt;, &lt;FONT color=#ff0000&gt;Options&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#ff0000&gt;參數&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#a52a2a&gt;Source 選擇性參數：&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#000000&gt;　　此 Variant 是為一個有效的 Command 物件變數名稱、SQL 陳述式、資料表名稱、已存的程序呼叫，或是一個保存的 Recordset 的檔名。&lt;BR&gt;&lt;/P&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT color=#000000&gt;&lt;FONT color=#a52a2a&gt;ActiveConnection 選擇性參數：&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#000000&gt;　　不是 Variant 得到一個有效的 Connection 物件變數名稱，就是 String 包含 ConnectionString 參數。&lt;BR&gt;&lt;/P&gt;&lt;/FONT&gt;
&lt;P dir=ltr&gt;&lt;FONT color=#000000&gt;&lt;FONT color=#a52a2a&gt;CursorType 選擇性參數：&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#000000&gt;　　此 CursorTypeEnum 值決定提供者在開啟 Recordset 時應使用的指標類型。其可以是下列其中一種常數。&lt;BR&gt;&lt;BR&gt;&lt;FONT color=#000000&gt;&lt;U&gt;常數說明&lt;/U&gt;&lt;/FONT&gt;&lt;BR&gt;adOpenForwardOnly(0)：開啟一個只支援向下捲動的RecordSet。(預設)&lt;BR&gt;AdOpenKeyset(1)：支援向上與向下捲動；可看到其他使用者對資料進行變動。&lt;BR&gt;AdOpenDynamic(2)：開啟一個動態資料指標，支援向上與向下捲動；可看見其他使用者修改、刪除、新增的資料。&lt;BR&gt;AdOpenStatic(3)：開啟一個靜態資料指標，支援向上與向下捲動；看不見其他使用者對資料進行變動(較適合asp使用)。&lt;/FONT&gt;&lt;/P&gt;&lt;FONT color=#000000&gt;
&lt;P dir=ltr&gt;&lt;FONT color=#a52a2a&gt;LockType 選擇性參數：&lt;/FONT&gt;&lt;BR&gt;　　&lt;/FONT&gt;&lt;FONT color=#000000&gt;此 LockTypeEnum 值決定提供者在開啟 Recordset 時應使用何種鎖定 (同時性)。其可以是下列其中一種常數。&lt;BR&gt;&lt;BR&gt;&lt;U&gt;&lt;FONT color=#000000&gt;常數說明&lt;BR&gt;&lt;/FONT&gt;&lt;/U&gt;adLockReadOnly(1)：唯讀，資料無法變更。(預設)&lt;BR&gt;AdLockPessimistic(2)：悲觀鎖定，提供者會進行必要的動作以確保能順利編輯資料錄，其方法通常是在編輯時立即在資料源處鎖定資料錄。&lt;BR&gt;AdLockOptimistic(3)：樂觀鎖定，提供者使用樂觀性鎖定，當您呼叫 Update 方法時，僅鎖定資料錄。&lt;BR&gt;AdLockBatchOptimistic(4)：樂觀批次更新，此為批次更新模式所需，與即時更新模式相反。&lt;BR&gt;&lt;BR&gt;&lt;FONT color=#a52a2a&gt;Options 選擇性參數：&lt;BR&gt;&lt;/FONT&gt;　　&lt;/FONT&gt;&lt;FONT color=#000000&gt;一個 Long 值，表示提供者在 Source 引數代表 Command 物件以外的東西時應如何評估它，否則 Recordset 應從前次儲存的檔案還原。它可以是下列其中一種常數。&lt;/FONT&gt;&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P dir=ltr&gt;&lt;FONT color=#000000&gt;adCmdText：提供者會將 Source 評估為指令的文字定義。&lt;BR&gt;AdCmdTable：ADO 會產生一個 SQL 查詢，從 Source 中指定的資料表傳回所有資料列。&lt;BR&gt;AdCmdTableDirect：提供者會從 Source 中指定的資料表傳回所有資料列。&lt;BR&gt;AdCmdStoredProc：提供者會將 Source 評估為一個預存程序。&lt;BR&gt;AdCmdUnknown：Source 引數中未知的指令類型。&lt;BR&gt;AdCommandFile：保留的 (已儲存的) Recordset 會從 Source 中指定的檔案還原。&lt;BR&gt;AdExecuteAsync：Source 作非同步執行。&lt;BR&gt;AdFetchAsync：表示在 CacheSize 屬性中指定的初始數量被抓取後，剩下的資料列就會被非同步地抓取。&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P dir=ltr&gt;&amp;nbsp;&lt;/P&gt;&lt;img src ="http://blog.blueshop.com.tw/topcat/aggbug/11655.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>topcat</dc:creator><title>RecordSet判斷是否有資料的觀念</title><link>http://blog.blueshop.com.tw/topcat/archive/2005/08/26/11582.aspx</link><pubDate>Fri, 26 Aug 2005 08:32:00 GMT</pubDate><guid>http://blog.blueshop.com.tw/topcat/archive/2005/08/26/11582.aspx</guid><wfw:comment>http://blog.blueshop.com.tw/topcat/comments/11582.aspx</wfw:comment><comments>http://blog.blueshop.com.tw/topcat/archive/2005/08/26/11582.aspx#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://blog.blueshop.com.tw/topcat/comments/commentRss/11582.aspx</wfw:commentRss><trackback:ping>http://blog.blueshop.com.tw/topcat/services/trackbacks/11582.aspx</trackback:ping><description>&lt;P&gt;常看到許多網友，在使用Recordset的時候，會出現這樣的錯誤&lt;BR&gt;&lt;FONT color=#0000ff&gt;ADODB.Recordset (0x800A0BCD)&lt;BR&gt;可能是 BOF 或 EOF 的值為 True，或目前的資料錄已被刪除。所要求的操作需要目前的資料錄。&lt;BR&gt;&lt;/FONT&gt;&lt;BR&gt;或者有加了判斷是否有值，可是卻只是下了以下的判斷式&lt;BR&gt;&lt;FONT color=#000000&gt;If &lt;FONT color=#0000ff&gt;Not rs.EOF&lt;/FONT&gt; Then&lt;/FONT&gt;&lt;BR&gt;.....&lt;BR&gt;&lt;BR&gt;其實RecordSet撈取資料後，狀態類似一個陣列&lt;BR&gt;並且在陣列的最上方有個BOF以及最下方有個EOF&lt;BR&gt;&lt;BR&gt;當rs有值的時候&lt;BR&gt;rs是這樣的&lt;BR&gt;==============================&lt;BR&gt;rs.BOF&lt;BR&gt;-----------------------------&lt;BR&gt;第1筆&lt;BR&gt;第2筆&lt;BR&gt;第3筆&lt;BR&gt;第4筆&lt;BR&gt;第5筆&lt;BR&gt;....&lt;BR&gt;最後一筆&lt;BR&gt;-------------------------------&lt;BR&gt;rs.EOF&lt;BR&gt;===============================&lt;BR&gt;所以當rs.MoveLast之後&lt;BR&gt;如果再執行rs.MoveNext&lt;BR&gt;就會focus在rs.EOF&lt;BR&gt;同理..rs.BOF也是在第1筆之前&lt;BR&gt;&lt;BR&gt;所以當rs沒有資料的時候&lt;BR&gt;會是以下這樣&lt;BR&gt;===========================================================&lt;BR&gt;rs.BOF rs.EOF&lt;BR&gt;===========================================================&lt;BR&gt;也就是focus會在&lt;STRONG&gt;&lt;FONT color=#ff0000&gt;rs.BOF 與rs.EOF同時成立&lt;/FONT&gt;&lt;/STRONG&gt;的地方&lt;BR&gt;因此&lt;BR&gt;如果要判斷rs沒有資料&lt;BR&gt;應該下以下的語法&lt;BR&gt;&lt;BR&gt;&lt;SPAN class=cpp-keyword&gt;If&lt;/SPAN&gt; &lt;FONT color=#ff0000&gt;&lt;STRONG&gt;rs.BOF And rs.EOF&lt;/STRONG&gt;&lt;/FONT&gt; &lt;SPAN class=cpp-keyword&gt;Then&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cpp-comment&gt;'rs沒有資料處理&lt;BR&gt;&lt;/SPAN&gt;Else&lt;BR&gt;&amp;nbsp;&amp;nbsp; 'rs有值的處理&lt;BR&gt;End &lt;SPAN class=cpp-keyword&gt;If&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class=cpp-keyword&gt;相關的寫法小喵整理如下：&lt;BR&gt;&lt;TEXTAREA class=vb style="WIDTH: 678px; HEIGHT: 102px" name=code rows=6 cols=79&gt;&amp;lt;%
 Set Conn=Server.CreateObject("Adodb.Connection")
 ConnStr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" &amp;amp; Server.MapPath("db/abc.mdb") &amp;amp; ";Persist Security Info=False"

 Set rs=Server.CreateObject("Adodb.RecordSet")
 With rs
        .CursorLocation = 2
        .CursorType = 3
        .LockType = 3
        .ActiveConnection = Conn
 End With
 
 sql="SELECT * FROM TBL1"
 rs.Open sql
 If Not(rs.BOF And rs.EOF) Then
  rs.MoveFirst
  For y = 1 to rs.RecordCount
   '有資料的相關處理
   rs.MoveNext
  Next
 Else
  Response.Write("無資料!!")
  
 End If
%&amp;gt;&lt;/TEXTAREA&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class=cpp-keyword&gt;希望對大家有幫助&lt;BR&gt;^_^&lt;/SPAN&gt;&lt;/P&gt;&lt;img src ="http://blog.blueshop.com.tw/topcat/aggbug/11582.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>topcat</dc:creator><title>當ASP使用Access資料庫只能讀取無法維護的問題</title><link>http://blog.blueshop.com.tw/topcat/archive/2005/08/24/11562.aspx</link><pubDate>Wed, 24 Aug 2005 17:14:00 GMT</pubDate><guid>http://blog.blueshop.com.tw/topcat/archive/2005/08/24/11562.aspx</guid><wfw:comment>http://blog.blueshop.com.tw/topcat/comments/11562.aspx</wfw:comment><comments>http://blog.blueshop.com.tw/topcat/archive/2005/08/24/11562.aspx#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://blog.blueshop.com.tw/topcat/comments/commentRss/11562.aspx</wfw:commentRss><trackback:ping>http://blog.blueshop.com.tw/topcat/services/trackbacks/11562.aspx</trackback:ping><description>&lt;P&gt;經常有網友問到....&lt;BR&gt;使用ASP在維護資料庫的時候，會發生&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;資料庫是唯讀的 
&lt;LI&gt;運作必須使用更新查詢&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;當遇到這樣的狀況時，可能有兩個原因&lt;BR&gt;一是權限問題，另一則是Connection String中的Jet 版本設定不正確&lt;/P&gt;
&lt;P&gt;權限問題：&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P&gt;ASP上的使用者在透過ADO存取資料庫的時候，是透過IUSER這個使用者來存取主機上的資源的，但是因為安全性的關係，所以IUSER通常權限都粉低，此時如果您的mdb存放的位置沒有開放給IUSER作資料庫的存取的話，那麼就可能造成這個問題&lt;/P&gt;
&lt;P&gt;要解決這個問題的方式，就是1.檢查mdb的唯讀是否有取消2.將mdb資料夾分享給IUSER作存取&lt;/P&gt;
&lt;P&gt;相關的動作操作可以參考以下這兩篇文章&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.blueshop.com.tw/article/show.asp?cde=ATL20050824185315P09" target=_blank&gt;http://www.blueshop.com.tw/article/show.asp?cde=ATL20050824185315P09&lt;/A&gt;&lt;BR&gt;&lt;A href="http://www.blueshop.com.tw/article/show.asp?cde=ATL20050824190443EUL" target=_blank&gt;http://www.blueshop.com.tw/article/show.asp?cde=ATL20050824190443EUL&lt;/A&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Connection String中的Jet 版本設定不正確：&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P&gt;如果確定了【權限問題】處理了，卻還是無法維護，那麼就要檢查一下您的Connection String是否有做正確的設定。如果您的主機上對於Jet的存取版本有兩個以上(Jet3.5→Access97,Jet4.0→Access2000)&lt;BR&gt;那麼如果您沒有正確的指定用哪個版本來存取，就有可能會造成無法維護的狀況&lt;/P&gt;
&lt;P&gt;要解決這個問題，首先要知道您的mdb是屬於哪一個版本，接著就是設定正確的Connection String了&lt;/P&gt;
&lt;P&gt;
&lt;TABLE style="WIDTH: 475pt; BORDER-COLLAPSE: collapse" cellSpacing=0 cellPadding=0 width=633 border=0 x:str&gt;
&lt;COLGROUP&gt;
&lt;COL style="WIDTH: 93pt; mso-width-source: userset; mso-width-alt: 3968" width=124&gt;
&lt;COL style="WIDTH: 382pt; mso-width-source: userset; mso-width-alt: 16288" width=509&gt;
&lt;TBODY&gt;
&lt;TR style="HEIGHT: 49.5pt" height=66&gt;
&lt;TD class=xl22 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext 0.5pt solid; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 93pt; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 49.5pt; BACKGROUND-COLOR: transparent" width=124 height=66&gt;&lt;FONT face=新細明體&gt;Access97&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class=xl23 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext 0.5pt solid; BORDER-LEFT: windowtext; WIDTH: 382pt; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" width=509&gt;&lt;FONT face=新細明體&gt;ConStr97="Provider=Microsoft.Jet.OLEDB.3.51;Persist Security Info=False;Data Source=" &amp;amp; Server.MapPath("db/abc.mdb")&lt;BR&gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR style="HEIGHT: 49.5pt" height=66&gt;
&lt;TD class=xl22 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext 0.5pt solid; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 49.5pt; BACKGROUND-COLOR: transparent" height=66&gt;&lt;FONT face=新細明體&gt;Access2000以後&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class=xl23 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; WIDTH: 382pt; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" width=509&gt;&lt;FONT face=新細明體&gt;ConStr2K="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" &amp;amp; Server.MapPath("db/abc.mdb") &amp;amp; ";Persist Security Info=False"&lt;/FONT&gt;&lt;BR&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;img src ="http://blog.blueshop.com.tw/topcat/aggbug/11562.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>