This is something I've seen questions about in the Usenet forums more than once.  Either it's "How do I get data to show in a data grid" or "Why didn't my new entry show up in the database?"  The following code is adapted from an application I wrote in VB for a non-profit group that wanted to keep a mailing address database.

(Note:  I will be leaving out auto-generated code for Windows Controls, because who needs to read that?  Also, since this is adapted from working code, I make no guarantee it will work if you cut-and-paste.  Your mileage may vary.  Don't play in traffic.)

You will need: A SQL database that you have administrator access to, connection to said database, and VB

This example assumes a database with the name "NonProfit", a table in it called "Addresses", with columns "Key","Name", "street1", "street2", "city", "state", and "zip".  It also assumes you have a form with textboxes that can display and/or set the values in the columns, a datagrid, and buttons to call functions like Add, Delete, Clear, and so on.

Here beginneth code:

Imports System.Data.SqlClient

Public Class NonProfitDB1
    Inherits System.Windows.Forms.Form

****Code snipped here, just boring WinForms stuff****

'First we need to set up a LOT of SQL stuff.  We have a dataset that will get all the data, and a SQLDataAdapter to go get it for us

Dim dsAddress As DataSet = New DataSet()
    Public currRow As Integer
    Dim adap1 As SqlDataAdapter = New SqlDataAdapter()

    Sub Populate()
        'connect to database and get info from table
        currRow = 0
        Dim con1 As SqlConnection = New SqlConnection("Data Source=(local); Integrated Security=SSPI; Initial Catalog=NonProfit; Connect Timeout=5")
'database is on same machine as app
        Dim cmd1 As SqlCommand = New SqlCommand("SELECT Distinct *" & "FROM Addresses ORDER BY Name", con1)'this is the command that queries the database to get the info for the datagrid
        
'set update command for data adapter. This is all SQL stuff, so watch out.  You have to tell the data adapter what your update command parameters are (the UpdateCommand.Parameters code) and then you can call adap1.Update, just like that.
        
        adap1.UpdateCommand = New SqlCommand("UPDATE Addresses SET
Name=@Name, Street1=@Street1, Street2=@Street2 City=@City, State=@State, Zip=@Zip WHERE Key=@Key", con1)

        'set parameters for variables
        adap1.UpdateCommand.Parameters.Add("@Name", SqlDbType.NVarChar, 255, "Name")
        adap1.UpdateCommand.Parameters.Add("@street1", SqlDbType.NVarChar, 255, "Street1")
        adap1.UpdateCommand.Parameters.Add("@street2", SqlDbType.NVarChar, 50, "Street2")
        adap1.UpdateCommand.Parameters.Add("@city", SqlDbType.NVarChar, 255, "City")
        adap1.UpdateCommand.Parameters.Add("@state", SqlDbType.NVarChar, 255, "State")
        adap1.UpdateCommand.Parameters.Add("@zip", SqlDbType.NVarChar, 50, "Zip")

'set parameter for index
        Dim param1 As SqlParameter = adap1.UpdateCommand.Parameters.Add("@Key", SqlDbType.Int)
        param1.SourceColumn = "Key"
        param1.SourceVersion = DataRowVersion.Original
        '******************************************************************************
        'delete command
        adap1.DeleteCommand = New SqlCommand("DELETE From Addresses WHERE
Key=@Key", con1)
        Dim param3 As SqlParameter = adap1.DeleteCommand.Parameters.Add("@Key", SqlDbType.Int)
        param3.SourceColumn = "Key"
        param3.SourceVersion = DataRowVersion.Original

        '***********************************************************************************
        'new entry insert NOTE: I will be explaining this in a later entry.  Lots of SQL here!
        adap1.InsertCommand = New SqlCommand("udpInsertAddress", con1)
        adap1.InsertCommand.CommandType = CommandType.StoredProcedure
        'set parameters for variables
        adap1.InsertCommand.Parameters.Add("@Name", SqlDbType.NVarChar, 255, "Name")
        adap1.InsertCommand.Parameters.Add("@street1", SqlDbType.NVarChar, 255, "Street1")
        adap1.InsertCommand.Parameters.Add("@street2", SqlDbType.NVarChar, 50, "Street2")
        adap1.InsertCommand.Parameters.Add("@city", SqlDbType.NVarChar, 255, "City")
        adap1.InsertCommand.Parameters.Add("@state", SqlDbType.NVarChar, 255, "State")
        adap1.InsertCommand.Parameters.Add("@zip", SqlDbType.NVarChar, 50, "Zip")
        'set parameter for index
        Dim param2 As SqlParameter = adap1.InsertCommand.Parameters.Add("@Identity", SqlDbType.Int, 0, "Key")'notice this has a slightly different name after @? It's OK -- @ just means a SQL variable
        param2.Direction = ParameterDirection.Output 'this tells it we are putting stuff in the DB
        '*******************************************************************************************

        adap1.SelectCommand = cmd1

        con1.Open()'open the SQL connection at last!
        adap1.Fill(dsAddress, "Addresses")'get the info
        con1.Close()

        'set connections for textboxes and data
        TextBox1.DataBindings.Add((New Binding("Text", dsBook, "Addresses.Records")))
        TextBox2.DataBindings.Add((New Binding("Text", dsBook, "Addresses.Owner")))
        TextBox3.DataBindings.Add((New Binding("Text", dsBook, "Addresses.street1")))
        TextBox4.DataBindings.Add((New Binding("Text", dsBook, "Addresses.street2")))
        TextBox7.DataBindings.Add((New Binding("Text", dsBook, "Addresses.City")))
        TextBox8.DataBindings.Add((New Binding("Text", dsBook, "Addresses.State")))
        TextBox9.DataBindings.Add((New Binding("Text", dsBook, "Addresses.Zip")))

    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Populate()
        DataGrid1.DataSource = dsAddress.Tables("Addresses")'whee! datagrid now has data!
      End Sub

    Private Sub NewEntry_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NewEntry.Click
        'a completely new entry is inserted into the database
        Dim newRow As DataRow = dsAddress.Tables("Addresses").NewRow()
        newRow("Name") = TextBox2.Text
        newRow("Street1") = TextBox3.Text
        newRow("Street2") = TextBox4.Text
        newRow("City") = TextBox7.Text
        newRow("State") = TextBox8.Text
        newRow("Zip") = TextBox9.Text
        
        dsAddress.Tables("Address").Rows.Add(newRow)
        adap1.Update(dsAddress, "Addresses")'and now you know why we have that Update code above ...

        'rebind textboxes
        TextBox1.DataBindings.Add((New Binding("Text", dsBook, "Addresses.Key")))
        TextBox2.DataBindings.Add((New Binding("Text", dsBook, "Addresses.Name")))
        TextBox3.DataBindings.Add((New Binding("Text", dsBook, "Addresses.street1")))
        TextBox4.DataBindings.Add((New Binding("Text", dsBook, "Addresses.street2")))
        TextBox7.DataBindings.Add((New Binding("Text", dsBook, "Addresses.City")))
        TextBox8.DataBindings.Add((New Binding("Text", dsBook, "Addresses.State")))
        TextBox9.DataBindings.Add((New Binding("Text", dsBook, "Addresses.Zip")))
    End Sub

    Private Sub DataGrid1_CurrentCellChanged(ByVal sender As System.Object, ByVal ne As System.EventArgs) Handles DataGrid1.CurrentCellChanged
        'clicking on row of datagrid should display all the info in your form
        'populate textbox values
        If currRow = 0 Then 'no row has been selected yet, so start at the top
            Me.BindingContext(dsAddress, "Addresses").Position += 1
        Else
            Me.BindingContext(dsAddress, "Addresses").Position -= 1
            Me.BindingContext(dsAddress, "Addresses").Position += 1
        End If
        Me.BindingContext(dsAddress, "Addresses").Position = DataGrid1.CurrentRowIndex
        currRow = DataGrid1.CurrentRowIndex
    End Sub

    Private Sub Update_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Update.Click
        'send dataset back to database
        'includes updates, deletions, and insertions
        If currRow = 0 Then
            Me.BindingContext(dsAddress, "Addresses").Position += 1
        Else
            Me.BindingContext(dsAddress, "Addresses").Position -= 1
            Me.BindingContext(dsAddress, "Addresses").Position += 1
        End If
        Me.BindingContext(dsAddress, "Addresses").Position = DataGrid1.CurrentRowIndex
        currRow = DataGrid1.CurrentRowIndex

        adap1.Update(dsAddress, "Addresses")
    End Sub

    Private Sub Exit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Exit.Click
        'exit program
        End
    End Sub

    Private Sub Clear_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Clear.Click
        'clear values in textboxes
        Me.BindingContext(dsAddress, "Addresses").Position = Me.BindingContext(dsAddress, "Addresses").Position.MinValue
        TextBox1.DataBindings.Clear()
        TextBox2.DataBindings.Clear()
        TextBox3.DataBindings.Clear()
        TextBox4.DataBindings.Clear()
        TextBox7.DataBindings.Clear()
        TextBox8.DataBindings.Clear()
        TextBox9.DataBindings.Clear()
       TextBox1.Text = ""
        TextBox2.Text = ""
        TextBox3.Text = ""
        TextBox4.Text = ""
        TextBox7.Text = ""
        TextBox8.Text = ""
        TextBox9.Text = ""
    End Sub

    Private Sub Delete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Delete.Click
        'delete row and update to database
        dsBook.Tables("Addresses").Rows(currRow).Delete()
        adap1.Update(dsAddress, "Addresses")

    End Sub
End Class