提问人:Vector 提问时间:11/12/2023 最后编辑:Vector 更新时间:11/14/2023 访问量:69
将数据从数据库表移动到另一个表
move data from database table to another table
问:
我使用SQLite DB创建了一个 VB.Net 应用程序,并添加了一些数据 我可以执行所有 CRUD 功能 现在我回到应用程序并添加了一个带有此代码的新表 TxArchiveData 注意我在新表中省略了这部分代码
NOT NULL PRIMARY KEY AUTOINCREMENT
在下面创建 TxArchiveData TABLE 的代码
Private Sub btnNewTable_Click(sender As Object, e As EventArgs) Handles btnNewTable.Click
'create table TxArchiveDataTable String for cmd
Dim create_table As String = String.Empty
create_table = "CREATE TABLE IF NOT EXISTS TxArchiveData(
TID INTEGER,
txSortDate TEXT,
txAmount TEXT,
txYear INTEGER,
txSearchMonth INTEGER)"
Dim dbTable As String = "TxArchiveData"
If Not My.Computer.FileSystem.FileExists(dbTable) Then
Try
Using conn As New SQLiteConnection(connStr)
conn.Open()
Using cmd As New SQLiteCommand(create_table, conn)
cmd.ExecuteNonQuery()
End Using
End Using
tbMessage.Text = "TABLE Created Select BACK"
Catch ex As Exception
tbMessage.Text = "TxArchiveData Table FAILED"
End Try
End If
下面是创建 TxData TABLE NOTE 共享命名的代码
Public Sub makeTxData()
'create table TxDataTable String for cmd
Dim create_table As String = String.Empty
create_table = "CREATE TABLE IF NOT EXISTS TxData(
TID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
txSortDate TEXT,
txAmount TEXT,
txYear INTEGER,
txSearchMonth INTEGER)"
Dim dbTable As String = "TxDataTable"
If Not My.Computer.FileSystem.FileExists(dbTable) Then
Try
Using conn As New SQLiteConnection(connStr)
conn.Open()
Using cmd As New SQLiteCommand(create_table, conn)
cmd.ExecuteNonQuery()
End Using
End Using
tbMessage.Text = "DB Created Select BACK"
Catch ex As Exception
tbMessage.Text = "TxData Table FAILED"
End Try
End If
End Sub
在另一个我没有打开SQLite DB的窗体上,我放置了这段代码
Private Sub btnMoveData_Click(sender As Object, e As EventArgs) Handles btnMoveData.Click
Dim TxData As DataTable = New DataTable()
Dim TxArchiveData As DataTable = New DataTable()
For Each row As DataRow In TxData.Rows
TxArchiveData.ImportRow(row)
Next
End Sub
问题是我是否需要连接到数据库才能使 IMPORT ROW 工作,如果是这样,如何工作?
我也在尝试只移动与 txYear 列匹配的数据,将此功能添加到答案中将非常有帮助**
我走到这一步仍然迷失了代码
Private Sub btnDelete_Click(sender As Object, e As EventArgs) Handles btnDelete.Click
Dim TxData As New DataTable
Dim TxArchiveData As New DataTable
Using conn As New SQLiteConnection($"Data Source = '{gv_dbName}';Version=3;")
conn.Open()
Using cmd As New SQLiteCommand("", conn)
cmd.CommandText = "SELECT * FROM TxData"
For Each dr As DataRow In TxData.Rows
TxArchiveData.ImportRow(dr)
Next
End Using
End Using
End Sub
答:
这里有许多问题需要解决。
首先:
我是否需要连接到数据库才能使 IMPORT ROW 工作,如果需要,如何工作?
不,你当然没有。 将 A 从一个复制到另一个。就是这样,仅此而已。和数据库之间没有直接连接。如何填充源以及如何处理目标的内容与 的使用 无关。如果源数据来自数据库,那么显然您需要连接到该数据库才能检索该数据,但这无关紧要。ImportRow
DataRow
DataTable
DataTables
DataTable
DataTable
ImportRow
其次,没有必要或没有必要使用 .你只需要一个.您还需要一个数据适配器。的数据适配器在调用时执行,调用时可以执行。没有什么可说的,他们需要引用同一个数据库表,甚至同一个数据库。您可以从一个表中获取数据,也可以在另一个表中获取数据,例如ImportRow
DataTable
SelectCommand
Fill
InsertCommand
Update
SELECT
INSERT
Using connection As New SqlConnection("connection string here"),
insertCommand As New SqlCommand("INSERT INTO Table2 (Col1, Col2) VALUES (@Col1, @Col2)", connection),
adapter As New SqlDataAdapter("SELECT * FROM Table1", connection) With {.AcceptChangesDuringFill = False,
.InsertCommand = insertCommand}
With insertCommand.Parameters
.Add("@Col1", SqlDbType.NVarChar, 50, "Col1")
.Add("@Col1", SqlDbType.Int, 0, "Col2")
End With
connection.Open()
Dim table As New DataTable
adapter.Fill(table)
adapter.Update(table)
End Using
需要注意的重要一点是属性的设置。当您将 a 添加到 时,默认情况下是 。调用 时,它会将检索到的行相加,然后调用 ,以便将所有 都设置为 。通过设置为 ,可以确保所有行都保持 ,随时可以插入。AcceptChangesDuringFill
DataRow
DataTable
RowState
Added
Fill
AcceptChanges
RowStates
Unchanged
AcceptChangesDuringFill
False
Added
话虽如此,您甚至不需要在应用中检索任何数据来填充新的数据库表。您可以使用 SELECT INTO
创建新表,从现有表中选择记录并将其插入到新表中。如果目标表已经存在,则可以插入其中并使用查询作为源而不是子句,例如VALUES
INSERT INTO Table2 (Col1, Col2)
SELECT Col1, Col2 FROM Table1
您可以调用命令对象来执行这些选项中的任何一个,ExecuteNonQuery
评论
尝试使用 ImportRow 是错误的工具。
也就是说,我正在尝试将数据存档在另一个表中,因此我的 DataGridView
仅显示 2 年的数据。一些性能增强。
下面是移动数据的代码和防止
用户两次移动相同数据的小例程。
Private Sub DataPull()
' Represents a utility function for writing data from one table to another in the same database.
'
' PARAMETERS:
I()
If count > 0 Then
MessageBox.Show("That Year " + tbYear.Text + " Has Been Archived", "Warning", MessageBoxButtons.OK)
End If
Dim sourceTable As String = "TxData"
Dim destinationTable As String = "TxArchiveData"
' EXCEPTION:
' Throws SqlException if there is an error executing the SQL query.
Using conn As New SQLiteConnection($"Data Source = '{gv_dbName}';Version=3;")
conn.Open()
' Create a SQL command to select all data from the source table.
Using cmd As New SQLiteCommand("", conn)
cmd.CommandText = $"SELECT * FROM {sourceTable} WHERE txYear =" & tbYear.Text
' Execute the select command and retrieve the data.
Using rdr As SQLite.SQLiteDataReader = cmd.ExecuteReader
' Create a SQL command to insert the data into the destination table.
Using cmd2 As New SQLiteCommand("", conn)
cmd2.CommandText = $"INSERT INTO {destinationTable} VALUES (@Column1, @Column2, @Column3,@Column4,@Column5)"
' Prepare the insert command parameters.
cmd2.Parameters.Add("@Column1", DbType.Int64)
cmd2.Parameters.Add("@Column2", DbType.String)
cmd2.Parameters.Add("@Column3", DbType.String)
cmd2.Parameters.Add("@Column4", DbType.Int64)
cmd2.Parameters.Add("@Column5", DbType.Int64)
' Loop through the data and insert it into the destination table.
While rdr.Read()
' Set the parameter values.
cmd2.Parameters("@Column1").Value = rdr.GetInt64(0)
cmd2.Parameters("@Column2").Value = rdr.GetString(1)
cmd2.Parameters("@Column3").Value = rdr.GetString(2)
cmd2.Parameters("@Column4").Value = rdr.GetInt64(3)
cmd2.Parameters("@Column5").Value = rdr.GetInt64(4)
' Execute the insert command.
cmd2.ExecuteNonQuery()
count = count + 1
tbInfo.Text = count.ToString
End While
End Using
End Using
End Using
End Using
End Sub
Private Sub I()
Using conn As New SQLiteConnection($"Data Source = '{gv_dbName}';Version=3;")
conn.Open()
Using cmd As New SQLiteCommand("", conn)
cmd.CommandText = "SELECT COUNT(*) FROM TxArchiveData WHERE txYear = " & tbYear.Text
'Dim count As Integer Needs to be declard as toplevel variable
'OR in a DataModule as gv_count it is used in DataPull() Sub
cmd.Parameters.AddWithValue("@value", tbYear)
count = CInt(cmd.ExecuteScalar())
End Using
End Using
End Sub
上一个:查找并替换为差异 [已关闭]
评论