ASP.NET,VB.NET和数据库问题

时间:2011-08-12 16:42:10

标签: asp.net sql database vb.net

我正在努力学习如何为我的工作做这个.NET框架而不是.....我无法理解为什么它不起作用。

此处出现错误:

myCommand.Connection.Open()

我假设这是因为我正在做的事情......

Dim idbox As TextBox = E.Item.Cells(numCols - 1).Controls(0) myCommand.Parameters("@Id").Value = Integer.Parse(idbox.Text)

来源:

<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<%@ Import Namespace="System.Data.OleDb" %>
<html>
<script language="VB" runat="server">
   Dim myConnection As SqlConnection
   '  Create a connection to the "pubs" SQL database located on the 
   ' local computer. 
    Sub Page_Load(Src As Object, E As EventArgs)
        If Session("Admin") <> True Then
            Response.Redirect("login.aspx")
        Else

            Dim myConnection As SqlConnection = New SqlConnection("CONNECTION INFO")
            ' Determine whether this page is a postback. If it is not a
            ' postback, call BindGrid.
            If Not IsPostBack Then
                Dim dbconn As OleDbConnection
                Dim sql As String
                Dim dbcomm As OleDbCommand
                Dim dbread As OleDbDataReader
                dbconn = New OleDbConnection("CONNECTION INFO")
                dbconn.Open()
                sql = "SELECT Name FROM TestData"
                dbcomm = New OleDbCommand(sql, dbconn)
                dbread = dbcomm.ExecuteReader()
                DropDownList1.Items.Clear()
                While dbread.Read
                    DropDownList1.Items.Add(dbread(0))
                End While
                dbread.Close()
                dbconn.Close()
                BindGrid()
            End If
        End If
    End Sub

   ' Create an index to the DataGrid row that is clicked and 
   ' call BindGrid.
   Sub MyDataGrid_Edit(sender As Object, E As DataGridCommandEventArgs)
      MyDataGrid.EditItemIndex = CInt(E.Item.ItemIndex)
      BindGrid()
   End Sub

   ' Cancel resets the index to the row's previous settings.
   Sub MyDataGrid_Cancel(sender As Object, E As DataGridCommandEventArgs)
      MyDataGrid.EditItemIndex = -1
      BindGrid()
   End Sub

   ' When the  Update link is clicked, build a SQL UPDATE command,    
   ' connect to the database, update the row's information in the 
   ' database, and rebind the DataGrid to show the updated information.
   Public Sub MyDataGrid_Update(sender As Object, _
      E As DataGridCommandEventArgs)
        Dim updateCmd As String = "UPDATE TestData SET AdoptedNum = @AdoptedNum, PrecinctNum = @PrecinctNum WHERE Id = @Id"
        Dim myCommand As SqlCommand = New SqlCommand(updateCmd, myConnection)
        myCommand.Parameters.Add(New SqlParameter("@Name", SqlDbType.VarChar))
        myCommand.Parameters.Add(New SqlParameter("@PrecinctNum", SqlDbType.Int))
        myCommand.Parameters.Add(New SqlParameter("@AdoptedNum", SqlDbType.Int))
        myCommand.Parameters.Add(New SqlParameter("@Id", SqlDbType.Int))

      ' Initialize the SqlCommand "@ID" parameter to the ID of the row 
        ' that must be clicked.
        Dim numCols As Integer = E.Item.Cells.Count
        Dim i As Integer
        Dim colvalue As String
        Dim txtBox As TextBox
        Dim idbox As TextBox = E.Item.Cells(numCols - 1).Controls(0)
        myCommand.Parameters("@Id").Value = Integer.Parse(idbox.Text)
      ' Create an array of column names.
        Dim cols() As String = {"@Name", "@PrecinctNum", "@AdoptedNum", "@Id"}
      ' Skipping the first, second, and last columns, iterate through the 
      ' columns, checking for empty values. If an empty value is found, 
      '  display a message box. Also initialize the SqlCommand 
      ' parameter values.
        For i = 2 To numCols - 1
            txtBox = E.Item.Cells(i).Controls(0)
            colvalue = txtBox.Text
            If (i < numCols And colvalue = "") Then
                Message.InnerHtml = "ERROR: Null values not allowed for " _
                   & "Author ID, Name or Phone"
                Message.Style("color") = "red"
                Exit Sub
            End If
            myCommand.Parameters(cols(i - 1)).Value = colvalue
        Next i

        ' Connect to the database and update the information.
        myCommand.Connection.Open()
        ' Test  whether the data was updated, and display the 
        ' appropriate message to the user.
        Try
            myCommand.ExecuteNonQuery()
            Message.InnerHtml = "<b>Record Updated.</b><br>"
            MyDataGrid.EditItemIndex = -1
        Catch ex As SqlException
            If ex.Number = 2627 Then
                Message.InnerHtml = "ERROR: A record already exists" _
                   & " with the same primary key"
            Else
                Message.InnerHtml = "ERROR: Could not update record," _
                   & " please ensure the fields are correctly filled out."
                Message.Style("color") = "red"
            End If
        End Try

        ' Close the connection.
        myCommand.Connection.Close()
        ' Rebind the DataGrid to show the updated information.
        BindGrid()
   End Sub

   ' The BindGrid procedure connects to the database and implements
    ' a SQL SELECT query to get all the data in the "Authors" tablea.
   Public Sub BindGrid() 
        Dim myConnection As SqlConnection = _
           New SqlConnection("CONNECTION INFO")
        Dim myCommand As SqlDataAdapter = New SqlDataAdapter("SELECT *" _
           & " FROM TestData WHERE Name='" & DropDownList1.SelectedValue & "'", myConnection)
      Dim ds As DataSet= New DataSet()
      myCommand.Fill(ds)
      MyDataGrid.DataSource = ds
        MyDataGrid.DataBind()
   End Sub

    Protected Sub MyDataGrid_SelectedIndexChanged(sender As Object, e As System.EventArgs)

    End Sub

    Sub DropDownList1_SelectedIndexChanged(sender As Object, e As EventArgs)
        BindGrid()
    End Sub
</script>

<body style="font: 10pt verdana">
   <form id="Form1" runat="server"><center>
      <h3><font face="Verdana">Updating a Row of Data.</font></h3>
      <span id="Message" EnableViewState="false" 
         style="font:arial 11pt;" runat="server"/><p>
             <asp:DropDownList ID="DropDownList1"  runat="server" AutoPostBack="True" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged">
             </asp:DropDownList>
      <ASP:DataGrid id="MyDataGrid" runat="server"
         Width="800"
         BackColor="#ccccff" 
         BorderColor="black"
         ShowFooter="false" 
         CellPadding=3 
         CellSpacing="0"
         Font-Name="Verdana"
         Font-Size="8pt"
         HeaderStyle-BackColor="#aaaadd"
         OnEditCommand="MyDataGrid_Edit"
         OnCancelCommand="MyDataGrid_Cancel"
         OnUpdateCommand="MyDataGrid_Update"
      >
      <Columns>
         <ASP:EditCommandColumn EditText="Edit" CancelText="Cancel" 
            UpdateText="Update"/>
      </Columns>
   </ASP:DataGrid>
   </center>
</form>
</body>
</html>

2 个答案:

答案 0 :(得分:3)

我怀疑问题是你定义但从不初始化实例变量myConnection。您可以在Page_Load函数中定义和实例化同名的本地变量,但这是与实例变量不同的对象。

在你的Page_Load中,如果你改变了这个:

Dim myConnection As SqlConnection = New SqlConnection("CONNECTION INFO")

到此:

myConnection As SqlConnection = New SqlConnection("CONNECTION INFO")

然后应该初始化您的实例变量并准备好在MyDataGrid_Update事件处理程序中使用。

答案 1 :(得分:0)

这甚至编译了吗?这不会起作用,因为你的代码有错误。

SqlCommand不支持myCommand.Connection.Open()