2014-01-07 3 views
0

Insert new row inside DataGridViewБаза данных не обновляется новой строки

Этот ответ создает впечатление, что база данных должна обновить с rows.add

Некоторые другие сайты имеют инструкции, но формируют перспективу создания базы данных с нуля. У меня уже есть база данных и просто хочу, чтобы глупая вещь принимала новые данные.

Вот что я сделал:

Private Sub InitializeDataGridView() 
    Try 
     ' Set up the DataGridView. 
     With Me.DataGridView1 
      ' Automatically generate the DataGridView columns. 
      .AutoGenerateColumns = True 

      ' Set up the data source. 
      'bindingSource1.DataSource = GetData("SELECT * FROM Places and Stuff") 
      MyTable = GetData("SELECT * FROM Places and Stuff") 
      'MyDataSet = bindingSource1.DataSource 
      'MyTable = MyDataSet.Tables(0) 
      .DataSource = MyTable 

      ' Automatically resize the visible rows. 
      .AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders 

      ' Set the DataGridView control's border. 
      .BorderStyle = BorderStyle.Fixed3D 

      ' Put the cells in edit mode when user enters them. 
      .EditMode = DataGridViewEditMode.EditOnEnter 

      ' Disables Add New Row 
      .AllowUserToAddRows = False 

     End With 
    Catch ex As SqlException 
     MessageBox.Show(ex.ToString, _ 
      "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Exclamation) 
     System.Threading.Thread.CurrentThread.Abort() 
    End Try 
End Sub 

Я связывание DGV к столу. Кажется, мне может понадобиться набор данных для обновления, но я не могу понять, как заполнить набор данных таблицей, которая также является базой данных sql. Вы также можете увидеть, где я играл с другими наборами данных/DataTables и т.д.

Я также получил мой DataGridView добавить строку, но база данных лениться:

Private Sub btnAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAdd.Click 

    'Determine Last Row Index 
    Dim dgvrowCnt As Integer = DataGridView1.Rows.Count - 1 
    If DataGridView1.Rows.Count > 0 Then 
     Dim myRow As DataRow = MyTable.NewRow 
     myRow(0) = DataGridView1.Rows(dgvrowCnt).Cells(0).Value + 1 
     MyTable.Rows.Add(myRow) 
    Else 
     Dim myRow As DataRow = MyTable.NewRow 
     myRow(0) = 230 
     MyTable.Rows.Add(myRow) 
    End If 

End Sub 

Я немного огорчен не будучи в состоянии использовать myRow("<column name here>") = 230, но мне придется преодолеть это, я думаю.

Я пробовал обновлять и проверять таблицу, чтобы увидеть, нужно ли обновлять мою форму, но это, похоже, не так.

Эта страница http://support.microsoft.com/kb/301248 имеет 2 строки и утверждает, что она делает то, что я надеюсь на: Dim objCommandBuilder As New SwlCammandBuilder(daAuthors) daAuthors.Update(dsPubs, "Authors")

Я не могу получить таблицу в наборе данных, как показано на связывающими линии моего примера.

ответ

2

Кажется, что вы не поняли фундаментальную концепцию ADO.NET. DataTable и другие объекты, такие как DataSet, являются «отключенными» объектами, что означает, что добавление/обновление и удаление строк не обновляет/вставляет/не удаляет таблицу базы данных.

Вам нужно создать SqlCommand, подготовить его текст команды, а затем выполнить запрос, чтобы обновить БД (другие методы включают в себя с помощью SqlDataAdapter и его метод Update)

Например, чтобы вставить одну строку в DataTable ваш код должен быть что-то вроде этого

Using con = New SqlConnection(.....constringhere...) 
Using cmd = new SqlCommand("INSERT INTO table1 (field1) values (@valueForField)", con) 
    con.Open() 
    cmd.Parameters.AddWithValue("@valueForField", newValue) 
    cmd.ExecuteNonQuery() 
End Using 
End Using 

A more complete tutorial could be found here

Вместо этого может быть псевдокод использовать SqlDataAdapter и SqlCommandBuilder автоматизировать кон струкция команд, необходимых для сохранения изменений в базу данных

' Keep the dataset and the adapter at the global class level' 
Dim da As SqlDataAdapter = Nothing 
Dim ds As DataSet 

Private Function GetData(ByVal sqlCommand As String) As DataSet 

    ds As New DataSet() 

    Dim connectionString As String = "Data Source=...." 
    Using con = New SqlConnection(connectionString) 
     conn.Open() 
     Using command = New SqlCommand(sqlCommand, con) 
      Using da = New SqlDataAdapter(command) 
       da.Fill(ds) 
      End Using 
     End Using 
    End Using 
    Return ds 
End Function 

Используйте первую таблицу внутри DataSet, возвращаемый GetData, как Datasource сетки (или просто использовать весь набор данных)

.DataSource = GetData(.......).Tables(0) 


' Add a new button to submit changes back to the database' 
Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAdd.Click 
    Dim builder = New SqlCommandBuilder(da) 
    da.UpdateCommand = builder.GetUpdateCommand() 
    da.InsertCommand = builder.GetInsertCommand() 
    da.DeleteCommand = builder.GetDeleteCommand() 
    da.Update(ds) 
End Sub 

Пожалуйста, обратите внимание, что я не могу проверить этот код, и предлагаю его как псевдокод без проверки ошибок, требуемого более надежным приложением.

+0

Насколько я понимаю, это было связано с datagridview, а VS и SQL знают, как общаться. Это кажется простым в принципе. Зачем проходить через все проблемы с привязкой? – ZL1Corvette

+0

Bound означает, что сетка привязана к DataTable (или другой коллекции данных), а не к таблице базы данных. Вам нужна привязка для передачи данных из/в DataTable и Grid (посмотрите на свой метод добавления, добавьте в DataTable, но вы увидите новую строку в Grid благодаря привязке) – Steve

+0

Однако использование DataSet и SqlDataAdapter - это путь, если вы хотите автоматизировать процесс записи изменений в базу данных, но вам нужно изменить этот GetData, чтобы сохранить исходный SqlDataAdpter и повторно использовать его, когда вам нужно – Steve

Смежные вопросы