假定该SQL查询是从产品表中获取产品ID的,并且通过for循环,我试图将值存储在库存表的产品ID列中。
这是代码:
Dim con As New SqlConnection("Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\MAYUR\Desktop\TechUp\Srinath\SrinathDB.mdf;Integrated Security=True;Connect Timeout=30")
con.Open()
Dim dsInventory As New DataSet()
Dim adpInventory = New SqlDataAdapter("Select I.Inventory_Date, P.Product_ID, P.Product_Name, P.Product_Unit,I.Available_Stock From Products P, Inventory I where P.Product_ID = I.Product_ID", con)
adpInventory.Fill(dsInventory)
dgInventory.DataSource = dsInventory.Tables(0)
Dim dsProducts As New DataSet()
Dim adpProducts As New SqlDataAdapter("Select * from Products", con)
adpProducts.Fill(dsProducts)
For Each ProductRow As DataRow In dsProducts.Tables(0).Rows
Dim idval As Integer = Integer.Parse(ProductRow("Product_ID").ToString())
Dim sqlcomm As New SqlCommand("insert into Inventory(Product_ID) Values(@id)", con)
sqlcomm.Parameters.Add("@id", SqlDbType.Int).Value = idval
sqlcomm.ExecuteNonQuery()
Next
dgInventory.Refresh()
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
这段代码是用VB.NET编写的,它首先从一个数据库中获取产品和库存信息,然后通过循环将所有产品的ID插入到库存表中。这里有几个点需要注意和优化:
连接管理:确保每次执行SQL命令后关闭连接或者使用Using
语句来自动管理连接的生命周期,避免资源泄露。
重复插入问题:你的代码逻辑可能会导致库存表中的Product_ID
列出现大量重复记录,特别是如果每次运行都会插入所有产品ID的话。如果你的目的是更新库存或仅在产品首次添加时插入ID,请考虑调整逻辑或检查是否已存在记录。
参数化查询:你已经在插入语句中正确使用了参数化查询,这是防止SQL注入的好习惯。
事务处理:如果你的操作需要保证原子性(即全部成功或全部失败),可以考虑使用事务来包裹插入操作。
数据适配器与数据集的使用:你已经正确地使用了SqlDataAdapter
和DataSet
来填充数据网格(DataGridView
假设为dgInventory),但请确保在完成数据操作后适当地清理这些资源。
下面是基于上述建议的一个修改后的示例代码:
Using con As New SqlConnection("Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\MAYUR\Desktop\TechUp\Srinath\SrinathDB.mdf;Integrated Security=True;Connect Timeout=30")
Try
con.Open()
' Fetch and display inventory data
Dim dsInventory As New DataSet()
Using adpInventory = New SqlDataAdapter("Select I.Inventory_Date, P.Product_ID, P.Product_Name, P.Product_Unit,I.Available_Stock From Products P, Inventory I where P.Product_ID = I.Product_ID", con)
adpInventory.Fill(dsInventory)
dgInventory.DataSource = dsInventory.Tables(0)
End Using
' Insert product IDs into Inventory if not already present
Dim sqlcomm As New SqlCommand("IF NOT EXISTS (SELECT 1 FROM Inventory WHERE Product_ID = @id) INSERT INTO Inventory(Product_ID) VALUES(@id)", con)
For Each ProductRow As DataRow In dsProducts.Tables(0).Rows
Dim idval As Integer = Integer.Parse(ProductRow("Product_ID").ToString())
sqlcomm.Parameters.Clear() ' Clear previous parameters to avoid conflicts
sqlcomm.Parameters.Add("@id", SqlDbType.Int).Value = idval
sqlcomm.ExecuteNonQuery()
Next
' Optionally, you can wrap the insert operation in a transaction for better integrity
' Transaction handling code would go here
dgInventory.Refresh()
Catch ex As Exception
' Handle exceptions appropriately
MessageBox.Show("An error occurred: " & ex.Message)
Finally
' Connection is automatically closed by the Using statement
End Try
End Using
这个版本的代码通过Using
语句确保了数据库连接会被正确关闭,同时对插入逻辑进行了微调以避免重复插入,并且优化了参数的使用。