仅将启用的文本框插入 MySQL in VB.Net

Insert only enabled textboxes into MySQL in VB.Net

我正在 VB.Net 中创建一个库存管理系统,其中的基本功能是处理收到的发票。我想将数据插入我的远程 MySQL 数据库,但前提是文本框被认为已启用。当我希望它插入所有字段时,将数据插入数据库没有问题。但我想让复选框启用某些产品并允许员工仅输入特定项目。复选框确实会根据需要启用和禁用文本字段,但是在将数据插入数据库时​​,它将为所有产品类型输入空值,我不希望它这样做,因为它会弄乱发票系统。目前我尝试了 if then 语句,但我 运行 遇到的问题是它想要定义未启用的文本框。 我尝试的代码是:

Public Sub btnEnter_Click(sender As Object, e As EventArgs) Handles btnEnter.Click

    Dim mysqlconn as new MySqlConnection ("ServerConnection")
    mysqlconn.Open()
    dim mysqlCmd as new MysqlCommand
    mysqlcmd.Connection = MysqlConn
    
    mysqlcmd.CommandText = "Insert into Table_Name (Column1,Column2,Column3) Values (@rec1,@Rec2,@Rec3)"
    
    If txtTextbox1.Enabled = True then
        mysqlcmd.Parameters.AddWithValue("@Rec1",Column1.text)
    End If
    
    If txtTextBox2.Enabled = True then
        mysqlcmd.Parameters.AddWithValue(@Rec2,Column2.text)
    End IF
    
    IF txtTextBox3.Enabled = True then
        mysqlcmd.Parameters.AddWithValue(@Rec3,Column3.text)
    End If

您不能只插入一列而不插入一行。因此,如果要插入一列,则必须插入所有列。如果您不想添加值,则该列可以为 NULL 或空字符串,具体取决于数据库中的列。还使用 Using 并使用 Async/Await

从 UI 中删除数据库工作
Public Async Sub btnEnter_Click(sender As Object, e As EventArgs) Handles btnEnter.Click
    ' if your columns take NULL to mean no value
    Await AddParams(
        If(txtTextbox1.Enabled, Column1.Text, Nothing),
        If(txtTextbox2.Enabled, Column2.Text, Nothing),
        If(txtTextbox3.Enabled, Column3.Text, Nothing))
    ' else, if an empty string means no value
    Await AddParams(
        If(txtTextbox1.Enabled, Column1.Text, ""),
        If(txtTextbox2.Enabled, Column2.Text, ""),
        If(txtTextbox3.Enabled, Column3.Text, ""))
End Sub

Private Function AddParams(param1 As String, param2 As String, param3 As String) As Task
    Return Task.Run(
    Sub()
        Using mysqlconn As New MySqlConnection("ServerConnection")
            mysqlconn.Open()
            Using mysqlCmd As New MySqlCommand("Insert into Table_Name (Column1,Column2,Column3) Values (@rec1,@Rec2,@Rec3)", mysqlconn)
                mysqlCmd.Parameters.AddWithValue("@Rec1", param1)
                mysqlCmd.Parameters.AddWithValue("@Rec2", param2)
                mysqlCmd.Parameters.AddWithValue("@Rec3", param3)
            End Using
        End Using
    End Sub)
End Function

如果我理解你目前的设计,

Table_Name

ID Column1 Column2 Column3
1 abc def ghi
2 jkl mno pqr

当未启用一列时,不完整的发票包含空字符串或 NULL

ID Column1 Column2 Column3
1 abc NULL ghi
2 NULL mno pqr

这就是这个答案的作用。

如果您的数据库设计灵活,也许更好的设计是

发票

ID Name
1 Invoice 1
2 Invoice 2

发票记录

ID Name
1 Column1
2 Column2
3 Column3

发票项目

ID InvoiceID InvoiceRecID Value
1 1 1 abc
2 1 3 ghi
3 2 2 mno
4 2 3 pqr

现在,当项目未启用时,您不会存储任何空值。 SQL 到 select 将是

SELECT 
    i.Name InvoiceName
    , ir.Name InvoiceRecName
    , ii.Value Value
FROM InvoiceItem ii
INNER JOIN Invoice i ON i.ID = ii.InvoiceID
INNER JOIN InvoiceRec ir ON i.ID = ir.InvoiceRecID
WHERE i.Name = 'Invoice 1'
InvoiceName InvoiceRecName Value
Invoice 1 Column1 abc
Invoice 1 Column3 ghi

这将使我编写的代码完全无效(除了保留 AsyncUsing)并且您需要在进行多次插入之前查询多个表,但设计将被规范化并且数据库存储大小将减少。

此外,您可以从元数据表 [Invoice] 和 [InvoiceRec] 构建您的 UI,因此如果想为您的业务添加另一个 InvoiceRec,您可以添加 SQL,并且UI不需要修改。