仅将启用的文本框插入 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
这将使我编写的代码完全无效(除了保留 Async
和 Using
)并且您需要在进行多次插入之前查询多个表,但设计将被规范化并且数据库存储大小将减少。
此外,您可以从元数据表 [Invoice] 和 [InvoiceRec] 构建您的 UI,因此如果想为您的业务添加另一个 InvoiceRec,您可以添加 SQL,并且UI不需要修改。
我正在 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
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 |
这将使我编写的代码完全无效(除了保留 Async
和 Using
)并且您需要在进行多次插入之前查询多个表,但设计将被规范化并且数据库存储大小将减少。
此外,您可以从元数据表 [Invoice] 和 [InvoiceRec] 构建您的 UI,因此如果想为您的业务添加另一个 InvoiceRec,您可以添加 SQL,并且UI不需要修改。