2009-11-08 4 views
0

Почему мой набор кодов не обновился в DataSet? Затем он переходит к ошибке. Пожалуйста, кто-нибудь проверит этот код и укажет мне, где я отсутствую. Заранее спасибо!Обновление VB.NET DataSet

Private Sub btnUpdate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUpdate.Click 

    Dim conxMain As New SqlConnection("Data Source=SERVER;Initial Catalog=DBTest;Persist Security Info=True;User ID=username;Password=pwds") 

    Dim dadPurchaseInfo As New SqlDataAdapter 
    Dim dsPurchaseInfo As New DataSet1 
    Try 
     Dim dRow As DataRow 

     conxMain.Open() 

     Dim cmdSelectCommand As SqlCommand = New SqlCommand("SELECT * FROM Stock", conxMain) 
     cmdSelectCommand.CommandTimeout = 30 

     dadPurchaseInfo.SelectCommand = cmdSelectCommand 
     Dim builder As SqlCommandBuilder = New SqlCommandBuilder(dadPurchaseInfo) 

     dadPurchaseInfo.Fill(dsPurchaseInfo, "Stock") 


     For Each dRow In dsPurchaseInfo.Tables("Stock").Rows 
      If CInt(dRow.Item("StockID").ToString()) = 2 Then 
       dRow.Item("StockCode") = "Re-Fashion[G]" 
      End If 

     Next 
     dadPurchaseInfo.Update(dsPurchaseInfo, "Stock") 

    Catch ex As Exception 
     MsgBox("Error : ") 
    Finally 
     If dadPurchaseInfo IsNot Nothing Then 
      dadPurchaseInfo.Dispose() 
     End If 

     If dsPurchaseInfo IsNot Nothing Then 
      dsPurchaseInfo.Dispose() 
     End If 

     If conxMain IsNot Nothing Then 
      conxMain.Close() 
      conxMain.Dispose() 
     End If 
    End Try 
End Sub 
+0

Можете ли вы опубликовать сообщение об исключении? И какую строку кода он выбрал? –

+0

Привет. о. к. ж, Вот сообщение об исключении меня -------------------- InvalidOpeartionException поймали поколение Dynamic SQL для UpdateCommand не поддерживается против SelectCommand который не возвращает никакой информации о столбце. ------------ – RedsDevils

+0

@RedsDevils: У вашей таблицы «запас» есть столбец первичного ключа? –

ответ

1

ли ваше состояние в цикле получить казнены (! установить точку останова) Где ошибка бросили? Что ошибка?

Кроме того, почему он использует ToString? Это кажется излишним.

If CInt(dRow.Item("StockID")) = 2 Then 

Должно быть достаточно.

Наконец, вы выполняете избыточную очистки:

If conxMain IsNot Nothing Then 
    conxMain.Close() 
    conxMain.Dispose() 
End If 

Dispose подразумевает Close - нет необходимости выполнять обе операции:

Close и Dispose функционально эквивалентны.

[Source: MSDN]

+0

Спасибо Konard Rudolph! Я получил его на основе исправления ошибок в моей программе! :) Большое спасибо. Мне нужен целый день, чтобы решить! Большое вам спасибо! – RedsDevils

1

Имеет ли ваш адаптер данных команду обновления?

(похоже, что он не делает - так что он не знает, что делать, чтобы с обновлением ....)

Вот пример команды Update: (для таблицы сотрудников с 3-мя колоннами - в перечисленных ниже:.?

UPDATE [Employee] 
SET [name] = @name 
    , [manager] = @manager 
WHERE (([id] = @Original_id) AND 
     ((@IsNull_name = 1 AND [name] IS NULL) OR 
          ([name] = @Original_name)) AND 
     ((@IsNull_manager = 1 AND [manager] IS NULL) OR 
           ([manager] = @Original_manager))); 


SELECT id 
    , name 
    , manager 
FROM Employee 
WHERE (id = @id) 

Вы можете видеть, что общее обновление, которое может обрабатывать изменения в любой области

+0

Как насчет этой части? Для каждого dRow В dsPurchaseInfo.Tables («Stock»). Строки Если CInt (dRow.Item («StockID»). ToString()) = 2 Затем dRow.Item («StockCode») = «Re-Fashion [G] " End If Next В нем говорится обновить dataAdapter, не так ли? – RedsDevils

+0

Вы передали адаптеру команду выбора (проверьте свой код), чтобы дать ей команду обновления. ваш код изменяет данные - но адаптер должен знать, какую команду запускать для его обновления. вы можете использовать мастер визуальной студии для генерации команды обновления или написать ее yoursefl. – Dani

+0

dadPurchaseInfo.UpdateCommand = ..... – Dani

0

Я получил его от исправления ошибок моей программы по Konard Rudolph!

Private Sub btnUpdate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUpdate.Click 

    Dim conxMain As New SqlConnection("Data Source=SERVER;Initial Catalog=DBTest;Persist Security Info=True;User ID=username;Password=pwds") 

    Dim dadPurchaseInfo As New SqlDataAdapter 
    Dim dsPurchaseInfo As New DataSet1 
     Try 
      Dim dRow As DataRow 

      conxMain.Open() 

      dadPurchaseInfo.SelectCommand = New SqlCommand("SELECT * FROM Stock", conxMain) 
      Dim builder As SqlCommandBuilder = New SqlCommandBuilder(dadPurchaseInfo) 


      dadPurchaseInfo.Fill(dsPurchaseInfo, "Stock") 

      For Each dRow In dsPurchaseInfo.Tables("Stock").Rows 
       If CInt(dRow.Item("StockID")) = 2 Then 
        dRow.Item("StockCode") = "Re-Fashion(H)" 
       End If 

      Next 
      dadPurchaseInfo.Update(dsPurchaseInfo, "Stock") 
     Catch ex As Exception 
      MsgBox("Error : " & vbCrLf & ex.Message) 
     Finally 
      If dadPurchaseInfo IsNot Nothing Then 
       dadPurchaseInfo.Dispose() 
      End If 

      If dsPurchaseInfo IsNot Nothing Then 
       dsPurchaseInfo.Dispose() 
      End If 

      If conxMain IsNot Nothing Then 
       conxMain.Dispose() 
      End If 
     End Try 
    End Sub 

Вышеупомянутый набор кодов работает для обновления с помощью DataSet! Благодаря сообществу stackoverflow и кто ответил на мой вопрос.

Вот ссылка:

p.s: Как o.k.w сказал: Таблица должна иметь первичный ключ. Спасибо o.k.w!

-1
--MENU-- 
Dim login As New LoginClass 
login.ShowDialog() 

--CONEXION-- 
Private conec As SqlConnection 
Dim stringCon As String = "Data Source= ;Initial Catalog=;Persist Security Info=True;User ID=;Password=" 
Public ReadOnly Property prConec() As Object 
    Get 
     Return conec 
    End Get 
End Property 
Public Sub Conectar() 
    Try 
     conec = New SqlConnection(stringCon) 
     If conec.State <> ConnectionState.Open Then 
      conec.Open() 
     End If 
    Catch ex As Exception 
     MessageBox.Show(ex.Message) 
    End Try 
End Sub 

--BUSCAR-- 
funciones.Conectar() 
Dim coman As New SqlCommand("sp_cliente", funciones.prConec) 
Dim dt As New DataTable 
coman.CommandType = CommandType.StoredProcedure 
coman.Parameters.Add("@i_operacion", SqlDbType.Char, 1, ParameterDirection.Input).Value = "B" 
dt.Load(coman.ExecuteReader()) 
grdClientes.DataSource = dt 

--INSERTAR-- 
funciones.Conectar() 
Dim coman As New SqlCommand("sp_articulo", funciones.prConec) 
coman.CommandType = CommandType.StoredProcedure 
coman.Parameters.Add("@i_operacion", SqlDbType.Char, 1, ParameterDirection.Input).Value = "I" 
coman.ExecuteNonQuery() 
Buscar() 
Limpiar() 

--COMBO-- 
Dim dt As New DataTable 
dt.Columns.Add("Codigo") 
dt.Columns.Add("Descripcion") 
Dim dr1 As DataRow = dt.NewRow 
dr1.Item("Codigo") = "A" 
dr1.Item("Descripcion") = "Activo" 
dt.Rows.Add(dr1) 
Dim dr2 As DataRow = dt.NewRow 
dr2.Item("Codigo") = "I" 
dr2.Item("Descripcion") = "Inactivo" 
dt.Rows.Add(dr2) 
cmbEstado.DataSource = dt 
cmbEstado.ValueMember = "Codigo" 
cmbEstado.DisplayMember = "Descripcion" 

--GRIDVIEW-- 
--1-- 
Dim grdFila As DataGridViewRow = grdClientes.CurrentRow 
txtCedula.Text = grdFila.Cells(0).Value 
--2-- 
If DataGridProductos.CurrentCell.ColumnIndex = 0 Then 
    Dim FLstArticulos As New FLstArticulos 
    FLstArticulos.ShowDialog() 
    DataGridProductos.CurrentRow.Cells(0).Value = FLstArticulos.PrIdArticulo 
End If 

--GRIDVIEW.CELLENDEDIT-- 
If DataGridProductos.CurrentCell.ColumnIndex = 3 Then 
    Dim precio As New Double 
    Dim cantidad As New Double 
    precio = CDbl(grdRow.Cells(2).Value) 
    cantidad = CDbl(grdRow.Cells(3).Value) 
    DataGridProductos.CurrentRow.Cells(4).Value = PLTotalFilaItem(cantidad, precio) 
    PLCargaTotales() 
End If 

Sub PLCargaTotales() 
    Dim subTotal As Double 
    Dim iva As Double 
    For Each grd As DataGridViewRow In DataGridProductos.Rows 
     If Not String.IsNullOrEmpty(grd.Cells(4).Value) Then 
      subTotal = subTotal + CDbl(grd.Cells(4).Value) 
     End If 
    Next grd 
    txtSubtotal.Text = subTotal.ToString 
    iva = Decimal.Round(subTotal`enter code here` * 0.12) 
    txtIva.Text = iva.ToString 
    txtTotalPagar.Text = (subTotal + iva).ToString 
End Sub 
+0

Я не уверен, что эти заголовки '--XYZ -' должны быть комментариями, '# region' или просто регулярными текстовыми сообщениями, но поскольку они не будут компилироваться, и вы должны это исправить. –

+0

Добро пожаловать в StackOverflow. Хотя этот код может ответить на вопрос, предоставляя дополнительный контекст относительно того, почему и/или как этот код отвечает на вопрос, улучшает его долгосрочную ценность. –

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