【发布时间】:2020-03-07 17:38:00
【问题描述】:
我正在玩 RFID 并学习我购买了 RC522 的技术。将其连接到树莓派并开始构建应用程序。
尝试将标签注册到 mariadb 数据库时失败。我无法弄清楚出了什么问题。
表:
CREATE TABLE RFID.Users (
ID INT(10) NOT NULL AUTO_INCREMENT,
Fname VARCHAR(100) NOT NULL,
Lname VARCHAR(100) NOT NULL,
TAG VARCHAR(100) NOT NULL,
Image LONGBLOB NOT NULL,
PRIMARY KEY (ID)
)
ENGINE = INNODB,
AUTO_INCREMENT = 4,
AVG_ROW_LENGTH = 16384,
CHARACTER SET latin1,
COLLATE latin1_swedish_ci;
存储过程:
CREATE DEFINER = 'root'@'%'
PROCEDURE RFID.Write_Tag(IN `@Fname` VARCHAR(100), IN `@Lname` VARCHAR(100), IN `@Tag` VARCHAR(100), IN `@Image` LONGBLOB)
BEGIN
INSERT INTO
Users
(Fname, Lname, TAG, Image)
VALUES
(@Fname, @Lname, @Tag, @Image);
END
vb.net代码插入标签:
Private Sub BtnWriteTag_Click(sender As Object, e As EventArgs) Handles btnWriteTag.Click
Try
If IsNothing(PictureBox1.Image) Then
MsgBox("Please load image first")
Else
lblinfo.Text = "Please place your tag near the reader"
sshcmd = sshClient.RunCommand("python /home/pi/fabio/workingwriter.py " & "'" & txtFname.Text & "'")
txtTag.Text = sshcmd.Result.Replace(vbCr, "").Replace(vbLf, "")
Dim filesize As UInt32
Dim mstream As New System.IO.MemoryStream()
PictureBox1.Image.Save(mstream, Imaging.ImageFormat.Jpeg)
Dim arrImage() As Byte = mstream.GetBuffer()
filesize = mstream.Length
mstream.Close()
MessageBox.Show(filesize)
MessageBox.Show(txtFname.Text)
con = GetConnect()
con.Open()
cmd = New MySqlCommand("Write_Tag", con) With {
.CommandType = CommandType.StoredProcedure
}
cmd.Parameters.AddWithValue("@Fname", txtFname.Text)
cmd.Parameters.AddWithValue("@Lname", txtLname.Text)
cmd.Parameters.AddWithValue("@TAG", txtTag.Text)
cmd.Parameters.AddWithValue("@image", arrImage)
Dim x As Integer = cmd.ExecuteNonQuery()
If x = 1 Then
MessageBox.Show(" User saved.")
End If
End If
Catch ex As Exception
MsgBox("Error found: " & vbCrLf & ex.Message, MsgBoxStyle.Critical, "RFID Tag Reader")
Finally
If cmd IsNot Nothing Then cmd.Dispose()
If con IsNot Nothing AndAlso con.State <> ConnectionState.Closed Then con.Close()
End Try
End Sub
我从 try catch 返回的错误是:“列 'Fname' 不能为空”
感谢您的帮助,
法比奥
【问题讨论】:
-
您可以在表中允许
null值,也可以使用默认值。你想做什么? -
它们不能为空,因为我正在解析它们。但是有一个 ID 自动增量,我相信这是导致错误的原因。我为所有列发送值,因此结果不应该是空值。
-
用类似MySql workbench/heidisqlmor调用sproc来证明是vb还是sproc
-
通过添加
ex.ToString()来增强您的异常处理,也许您会得到有关错误的更多详细信息。 -
在 MySql.Data.MySqlClient.MySqlStream.ReadPacket() 在 MySql.Data.MySqlClient.NativeDriver.GetResult(Int32& affectedRow, Int64& insertedId) 在 MySql.Data.MySqlClient.Driver.GetResult(Int32 statementId , Int32& affectedRows, Int64& insertedId) 在 MySql.Data.MySqlClient.Driver.NextResult(Int32 statementId, Boolean force) 在 MySql.Data.MySqlClient.MySqlDataReader.NextResult() 在 MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior 行为)在 MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery()
标签: vb.net stored-procedures mariadb sql-insert