0

データベースに関係する VB.NET Web アプリケーションのヘルプが必要です。このアプリは、データベース内のテーブル カラムの行を表示するものです。コード 1 は、Windows アプリ用に書かれた Brian Siler の本 (2000 年) からのもので、正常に動作します。ユーザーはいくつかのボタンをクリックして、テーブル内のデータの行を取得できます。

-----------コード 1---------

Public Class Form1
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) 
                Handles MyBase.Load
    End Sub
    Private rs As ADODB.Recordset
    Public Sub New()
        'MyBase.New()
        'This call is required by the windows Form Designer
        InitializeComponent()
        'Add any initialization after the InitializeComponent() call
        rs = New ADODB.Recordset()
        rs.CursorType = ADODB.CursorTypeEnum.adOpenStatic
        rs.Open("SELECT TOP 100 * FROM [Person].[Person]", _
        "UID=xxx; PWD=xxx123; DATABASE=AdventureWorks2012; 
             SERVER=xxx-HP\SQLEXPRESS; Provider=SQLOLEDB")
        DisplayCurrentRecord()
    End Sub
    Private Sub DisplayCurrentRecord()
        Dim i As Integer
        Dim s As String
        If rs.BOF Then rs.MoveFirst()
        If rs.EOF Then rs.MoveLast()
        lstData.Items.Clear()
        For i = 0 To rs.Fields.Count - 1
            s = rs.Fields(i).Name & ": " & rs.Fields(i).Value.ToString
            lstData.Items.Add(s)
        Next i
        'Me.Text = "Current Position:" & rs.AbsolutePosition
    End Sub
    Private Sub cmdNext_Click(ByVal sender As System.Object, _
            ByVal e As System.EventArgs) Handles cmdNext.Click
        rs.MoveNext()
        DisplayCurrentRecord()
    End Sub
    Private Sub cmdPrevious_Click(ByVal sender As System.Object, _
            ByVal e As System.EventArgs) Handles cmdPrevious.Click
        rs.MovePrevious()
        DisplayCurrentRecord()
    End Sub
    Private Sub cmdJump_Click(ByVal sender As System.Object, _
            ByVal e As System.EventArgs) Handles cmdJump.Click

        rs.MoveFirst()
        rs.Move(Convert.ToInt32(txtJump().Text) - 1)
        DisplayCurrentRecord()
    End Sub
End Class

このコードを Web アプリで動作させようとしていますが、正しい結果が得られません。まず、いくつかの変更を行う必要があります。

  1. コード 2 では、間にあるコード#Regionは機能させるためのInitializeComponent()ものです。
  2. MyBase.New()Me.Text = "Current Position:" & rs.AbsolutePositionコードを機能させるためにコメントする必要があります。

VB のバージョンは 2012 Express for Web、Visual Studio は 2012 Express です。Microsoft ADO 2.7 が参照用に追加されました。コード 2 は実行できますが、Jump をクリックするだけで正しい結果が得られます。Prev と Next は、常にそれぞれ 1 行目と 2 行目を表示します。sub Newこの問題は、前または次をクリックするたびに Web アプリに対して常に呼び出されることに関連しているように思われるため、カーソル位置は常に 1 を指しますsub New。明らかに、コードはそれを明示的に呼び出していません。

助けてくれてありがとう。

------ コード 2 ------

Public Class WebDatabase3
    Inherits System.Web.UI.Page
#Region " Web Form Designer Generated Code "
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
    End Sub
    Private designerPlaceholderDeclaration As System.Object
    Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) 
            Handles MyBase.Init
        InitializeComponent()
        NewSub()
    End Sub
#End Region
    Private Sub Page_Load(sender As System.Object, e As System.EventArgs) 
       Handles MyBase.Load
    End Sub
    Private rs As ADODB.Recordset
    Public Sub NewSub()
        'MyBase.New()
        'This call is required by the windows Form Designer
        InitializeComponent()
        'Add any initialization after the InitializeComponent() call
        rs = New ADODB.Recordset()
        rs.CursorType = ADODB.CursorTypeEnum.adOpenStatic
        rs.Open("SELECT TOP 100 * FROM [Person].[Person]", _
                "UID=xxx; PWD=xxx123; DATABASE=AdventureWorks2012; 
        SERVER=xxx-HP\SQLEXPRESS; Provider=SQLOLEDB")
        DisplayCurrentRecord()
    End Sub
    Private Sub DisplayCurrentRecord()
        Dim i As Integer
        Dim s As String
        If rs.BOF Then rs.MoveFirst()
        If rs.EOF Then rs.MoveLast()

        lstData.Items.Clear()

        For i = 0 To rs.Fields.Count - 1
            s = rs.Fields(i).Name & ": " & rs.Fields(i).Value.ToString
            lstData.Items.Add(s)
        Next i
        'Me.Text = "Current Position:" & rs.AbsolutePosition
    End Sub
    Private Sub cmdNext_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles cmdNext.Click       
        rs.MoveNext()
        DisplayCurrentRecord()
    End Sub
    Private Sub cmdPrevious_Click(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles cmdPrevious.Click
        rs.MovePrevious()
        DisplayCurrentRecord()
    End Sub
    Private Sub cmdJump_Click(ByVal sender As System.Object, _
            ByVal e As System.EventArgs) Handles cmdJump.Click
        rs.MoveFirst()
        rs.Move(Convert.ToInt32(txtJump().Text) - 1)
        DisplayCurrentRecord()
    End Sub
End Class
4

1 に答える 1

0

Web アプリケーションにカーソル位置トラッカー「intAbsolutePosition」を追加することで、この問題を解決しました。stackoverflow コード ウィンドウに、修正したコードがはっきりと表示されません。申し訳ありません。

ありがとう!


Public Class WebDatabase3 Inherit System.Web.UI.Page

領域「 Web フォーム デザイナで生成されたコード」

<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
End Sub
Private designerPlaceholderDeclaration As System.Object
Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
    InitializeComponent()
    Newsub()
End Sub

エンドリージョン

Private Sub Page_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
End Sub
Private rs As ADODB.Recordset
Public Shared intAbsolutePosition As Integer = 0
Public Sub Newsub()
    'MyBase.New()
    'This call is required by the windows Form Designer
    InitializeComponent()
    'Add any initialization after the InitializeComponent() call
    rs = New ADODB.Recordset()
    rs.CursorType = ADODB.CursorTypeEnum.adOpenStatic
    rs.CursorLocation = ADODB.CursorLocationEnum.adUseClient
    rs.Open("SELECT TOP 100 * FROM [Person].[Person]", _

"UID=xxx; PWD=xxx123; DATABASE=AdventureWorks2012; SERVER=XXXXX-HP\SQLEXPRESS; Provider=SQLOLEDB") rs.BOF の場合 rs.MoveFirst() rs.EOF の場合 rs.MoveLast() DisplayCurrentRecord() End Sub Private Sub DisplayCurrentRecord() Dim i As Integer Dim s As String If rs.BOF then rs.MoveFirst() If rs.EOF then rs.MoveLast() lstData.Items.Clear() For i = 0 rs.Fields. Count - 1 s = rs.Fields(i).Name & ": " & rs.Fields(i).Value.ToString lstData.Items.Add(s) Next i 'Me.Text = "Current Position:" & rs .AbsolutePosition 'rs.Bookmark = ADODB.BookmarkEnum.adBookmarkCurrent End Sub Private Sub cmdNext_Click(ByVal 送信者 As System.Object, _ ByVal e As System.EventArgs) cmdNext.Click を処理します rs.Move(Convert.ToInt32(intAbsolutePosition) + 1) intAbsolutePosition += 1 DisplayCurrentRecord() End Sub Private Sub cmdPrevious_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) cmdPrevious を処理します。クリック If intAbsolutePosition < 1 Then rs.MoveFirst() Elsers.Move(Convert.ToInt32(intAbsolutePosition) - 1) End If intAbsolutePosition -= 1 If intAbsolutePosition < 0 Then intAbsolutePosition = 0 DisplayCurrentRecord() End Sub Private Sub cmdJump_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) ハンドル cmdJump.Click rs.MoveFirst() rs.Move(Convert.ToInt32(txtJump().Text) - 1) intAbsolutePosition = Convert.ToInt32(txtJump().Text) - 1 DisplayCurrentRecord() End Sub End クラス


于 2013-06-11T09:46:23.870 に答える