我目前正在通过按钮点击功能为表中的记录生成QR码图像,然后生成的图像需要保存到表中。
但是我只能生成QR码图像,我似乎无法将图像存储到数据库中。给我的错误是:
不允许从数据类型nvarchar隐式转换为varbinary(max)。使用CONVERT函数运行此查询。
我在网上搜索了各种方法,但我似乎无法理解CONVERT函数实际上是如何工作的。下面是我的代码:
string toinsertcode = "Consignment Number: " + txtConsignmentNum.Text +
"n" + "Student ID: " + txtStudentID.Text;
QRCodeGenerator qrGenerator = new QRCodeGenerator();
QRCodeGenerator.QRCode qrCode = qrGenerator.CreateQrCode(toinsertcode, QRCodeGenerator.ECCLevel.Q);
System.Web.UI.WebControls.Image imgQRCode = new System.Web.UI.WebControls.Image();
imgQRCode.Height = 150;
imgQRCode.Width = 150;
using (Bitmap bitmap = qrCode.GetGraphic(80))
{
using (MemoryStream ms = new MemoryStream())
{
bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
byte[] byteImage = ms.ToArray();
imgQRCode.ImageUrl = "data:image/png;base64, " + Convert.ToBase64String(byteImage);
}
placeholderQR.Controls.Add(imgQRCode);
}
conn.Open();
string insertqrcode = "INSERT INTO Parcel(QRCode) values(@qr)";
SqlCommand cmdupload = new SqlCommand(insertqrcode, conn);
cmdupload.Parameters.AddWithValue("@qr", imgQRCode);
cmdupload.ExecuteNonQuery();
conn.Close();
您需要实际发送字节,而不是将对象作为某种字符串发送到数据库。
另外,用显式数据类型定义参数也是一个好主意,以避免c#猜测(不正确)您所需的数据类型,就像它在这里对您所做的那样。
替换:
cmdupload.Parameters.AddWithValue("@qr", imgQRCode);
:
cmdupload.Parameters.Add("@qr", SqlDbType.VarBinary, -1 ).Value = byteImage;
显然,您还需要将数据库插入语句移动到定义了byteImage
的作用域中才能正常工作。