データベースに関係する 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 アプリで動作させようとしていますが、正しい結果が得られません。まず、いくつかの変更を行う必要があります。
- コード 2 では、間にあるコード
#Region
は機能させるためのInitializeComponent()
ものです。 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