SQL更新所有行,没有WHERE语句VB.net

时间:2019-06-24 18:04:52

标签: sql-server vb.net rows

我需要同时更新多列中的所有行。基本上是完整的数据表。数据表格式是预先构建的。我是ADO的新手,只用了几个星期。 这是一个问题,我可以单独更新每一行,但不能全部更新。从MS到论坛,我到处都在提到“ WHERE”。作为参考其他主要内容的一栏。这不是我所需要的。我只需要在APP关闭或崩溃时在数据库中更新表,并在APP打开时进行加载。

到目前为止,我已经尝试了几乎所有从实际SQL到SQL命令的所有操作。但是列会一直更新为单个值,因为我没有引用WHERE,并且在保存时我正在引用行上的索引...如果我尝试在加载时使用for语句,则显然会引发错误,因为使用“ ExecuteNonQuery”转储完整数据。我想我需要先用数据加载适配器,然后再用数据库加载它,但是我也遇到了错误。...

VB.net Load From Database

    Dim connectionString As String = "Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Database1.mdf;Integrated Security=True"
    Dim sql As String = "Select * FROM Table1"
    Dim connection As New SqlConnection(connectionString)
    Dim dataadapter As New SqlDataAdapter(sql, connection)
    Dim ds As New DataSet()
    connection.Open()
    dataadapter.Fill(ds, "Data") ' Data tags data

    'Count Rows In data Table
    Dim commandRowCount As New SqlCommand("Select COUNT(*) FROM " + "dbo.Table1", connection)
    Dim countStart As Long = System.Convert.ToInt32(commandRowCount.ExecuteScalar())
    TextBox1.Text = countStart


    For x = 0 To countStart - 1
        If x = 0 Then
            DataG.Rows.Add(1)
        ElseIf x < countStart - 1 Then
            DataG.Rows.Add(x)
        End If
        DataG.Rows(x).Cells("Column1").Value = ds.Tables("Data").Rows(x).Item("Column1")
        DataG.Rows(x).Cells("Column2").Value = ds.Tables("Data").Rows(x).Item("Column2")
        DataG.Rows(x).Cells("Column3").Value = ds.Tables("Data").Rows(x).Item("Column3")
    Next

    connection.Close()
End Sub

保存数据-问题:

Dim connetionString As String = "Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Database1.mdf;Integrated Security=True"
    Dim con As New SqlClient.SqlConnection(connetionString)
    con.Open()
    Dim cmd As New SqlClient.SqlCommand("Update Table1 SET Column1 = @Column1", con)
    Dim adapter As SqlDataAdapter = New SqlDataAdapter()


    cmd.Parameters.Add(New SqlClient.SqlParameter("@Column1", DataG.Item("Column1", rowIndex:=0).Value))


    cmd.ExecuteNonQuery()
    con.Close()'''

我认为这个MS示例应该可以满足我的需要,但是无论出于何种原因,它都会不断抛出错误Column1未提供。但是,单元格中存在一个值,并且没有空行。因此,我非常困惑为什么它认为价值不存在。但是,如果我将第一列称为“ DataG.Rows(1).Cells(“ Column1”)。Value”,则可以使用...。这意味着我需要在某个地方定义Table,但是我不知道在哪里

 Dim connectionString As String = "Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Database1.mdf;Integrated Security=True"
    Dim connection As New SqlConnection(connectionString)
    Dim adapter As SqlDataAdapter = New SqlDataAdapter()
    connection.Open()
    Dim command As SqlCommand = New SqlCommand("Select * FROM Table1 ", connection)
    command.Parameters.Add("@Column1", SqlDbType.NVarChar, 50, "Column1")
    adapter.SelectCommand = command
    command.ExecuteNonQuery()
    command = New SqlCommand("INSERT INTO Table1 (Column1) " & "VALUES (@Column1)", connection)
    command.Parameters.Add("@Column1", SqlDbType.NChar, 50, "Column1")
    command.ExecuteNonQuery()
    adapter.InsertCommand = command
    command = New SqlCommand("UPDATE Table1 Set Column1 = @Column1", connection)
    command.Parameters.Add("@Column1", SqlDbType.NChar, 50, "Column1")
    command.ExecuteNonQuery()
    Dim parameter As SqlParameter = command.Parameters.Add("@Column1", SqlDbType.NChar, 50, "Column1")
    parameter.SourceVersion = DataRowVersion.Original
    adapter.UpdateCommand = command
    command.ExecuteNonQuery()
    command = New SqlCommand("DELETE FROM Table1 WHERE Column1 = @Column1", connection)
    parameter = command.Parameters.Add("@Column1", SqlDbType.NChar, 50, "Column1")
    parameter.SourceVersion = DataRowVersion.Original
    adapter.DeleteCommand = command
    command.ExecuteNonQuery()

我认为我要么需要在表中加载数据适配器,要么应用FOR语句。 或者可能都是用所有行填充数据适配器,然后将其发送到数据库以进行更新。

1 个答案:

答案 0 :(得分:0)

Using...End Using块可确保即使发生错误也可以关闭和处置数据库对象。

ADO具有3个我正在使用的类。

  • DataTable-Select结果的内存表示形式 声明。在这里,我使用了“加载方法”来填充数据。

  • SQLConnection-将连接字符串传递给构造函数。

  • SQLCommand-Sql语句和连接传递给
    构造函数。使用以下命令对Parameters集合进行添加 .Add(parameterName,datatype,size)后跟.Value来设置
    参数的值。

在可能的最后时刻打开连接。它将通过End Using

尽快关闭

我不确定代码的最后一段应该做什么。

Private Sub OPCode1()
    Dim dt As New DataTable
    Using connection As New SqlConnection("Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Database1.mdf;Integrated Security=True")
        Using cmd As New SqlCommand("Select * FROM Table1", connection)
            connection.Open()
            dt.Load(cmd.ExecuteReader)
        End Using 'Close and dispose command
    End Using 'Close and dispose connection
    'I am assuming that DataG is the name of a DataGridView on you form
    DataG.DataSource = dt
End Sub

Private Sub OPCode2()
    Using con As New SqlConnection("Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Database1.mdf;Integrated Security=True")
        Using cmd As New SqlCommand("Update Table1 SET Column1 = @Column1", con)
            'The item property references a cell in the grid Item(columnIndex As Integer, rowIndex As Integer)
            'So this sets the value to the first column (index 0) of the first row (index 0)
            'Since the size of the field is 50, it wouldn't make any sense for it to be NChar.
            cmd.Parameters.Add("@Column1", SqlDbType.NVarChar, 50).Value = DataG.Item(0, 0).Value
            con.Open()
            cmd.ExecuteNonQuery()
        End Using
    End Using
End Sub

编辑 您要对DataGridView进行更改,并对数据库进行这些更改。是?只要表存在于数据库中,就无需预先构建任何内容。

DataGridView由DataTable填充,而.DataSource是从数据库中加载的。将网格DataTable属性设置为DataTable后,就将其绑定。对UI中的数据所做的更改将反映在DataTable中。只要在Select语句中包含了主键,就可以添加更新或删除。

准备好更新数据库时,请单击“更新”按钮。 SqlCommandBuilder跟踪网格的任何更改。 DataAdapter将使用Update方法将这些更改发送到数据库。我们必须重新创建Select命令,以便适配器可以构建与Select关联的Insert,Update和Delete语句。 (请参见Open)。 Update()连接,调用.AcceptChanges(),最后在DataTable上调用Private dt As New DataTable Private Sub UpdateDataAdapter_Load(sender As Object, e As EventArgs) Handles MyBase.Load Using cn As New SqlConnection(My.Settings.BuildersConnectio) Using cmd As New SqlCommand("Select * From Products", cn) cn.Open() dt.Load(cmd.ExecuteReader) End Using End Using DataGridView1.DataSource = dt End Sub Private Sub BtnUpdate_Click(sender As Object, e As EventArgs) Handles btnUpdate.Click Using cn As New SqlConnection(My.Settings.BuildersConnectio) Dim adapter As New SqlDataAdapter() adapter.SelectCommand = New SqlCommand("Select * From Products", cn) Dim builder As SqlCommandBuilder = New SqlCommandBuilder(adapter) cn.Open() adapter.Update(dt) dt.AcceptChanges() End Using End Sub 。最后一步使您可以进行更多更改并再次更新,而无需重复第一次更新。

注意:DataTable现在是一个类级别的变量,两个过程都可以使用。

{{1}}