开发者社区 问答 正文

将值存储在数据库中的表中,并将结果显示在datagrid中

假定该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()

展开
收起
心有灵_夕 2019-12-07 21:39:39 566 分享 版权
阿里云 AI 助理回答

这段代码是用VB.NET编写的,它首先从一个数据库中获取产品和库存信息,然后通过循环将所有产品的ID插入到库存表中。这里有几个点需要注意和优化:

  1. 连接管理:确保每次执行SQL命令后关闭连接或者使用Using语句来自动管理连接的生命周期,避免资源泄露。

  2. 重复插入问题:你的代码逻辑可能会导致库存表中的Product_ID列出现大量重复记录,特别是如果每次运行都会插入所有产品ID的话。如果你的目的是更新库存或仅在产品首次添加时插入ID,请考虑调整逻辑或检查是否已存在记录。

  3. 参数化查询:你已经在插入语句中正确使用了参数化查询,这是防止SQL注入的好习惯。

  4. 事务处理:如果你的操作需要保证原子性(即全部成功或全部失败),可以考虑使用事务来包裹插入操作。

  5. 数据适配器与数据集的使用:你已经正确地使用了SqlDataAdapterDataSet来填充数据网格(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语句确保了数据库连接会被正确关闭,同时对插入逻辑进行了微调以避免重复插入,并且优化了参数的使用。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: