如何在c#中将位图插入MySQL?
我正在尝试将位图图像插入MySQL,但问题是不支持位图。我的错误:“System.NotSupportedException:'不支持参数类型位图;请参阅.Value:System.Drawing.Bitmap'”。MySQL中我的图片数据类型是一个blob。我想知道是否应该更改数据类型 我的按钮寄存器如何在c#中将位图插入MySQL?,c#,mysql,visual-studio,bitmap,converters,C#,Mysql,Visual Studio,Bitmap,Converters,我正在尝试将位图图像插入MySQL,但问题是不支持位图。我的错误:“System.NotSupportedException:'不支持参数类型位图;请参阅.Value:System.Drawing.Bitmap'”。MySQL中我的图片数据类型是一个blob。我想知道是否应该更改数据类型 我的按钮寄存器 private void buttonRegister_Click(object sender, EventArgs e) { String email = textBoxEmail.T
private void buttonRegister_Click(object sender, EventArgs e)
{
String email = textBoxEmail.Text;
String username = textBoxUsername.Text;
String password = textBoxPassword.Text;
String reTypepassword = textBoxReTypePassword.Text;
UsersClass user = new UsersClass();
System.Security.Cryptography.AesCryptoServiceProvider keyMaker = new System.Security.Cryptography.AesCryptoServiceProvider();
keyMaker.KeySize = 128;
keyMaker.BlockSize = 128;
keyMaker.GenerateKey();
byte[] build = keyMaker.Key;
String Key = Convert.ToBase64String(build);
//MessageBox.Show(Key);
string encryptPassword = user.EncryptString(Key, textBoxPassword.Text);
char[] v = encryptPassword.ToCharArray();
int c = 0;
Bitmap bm = new Bitmap(Image);
for (int w = 0; w < bm.Width; w++)
{
for (int h = 0; h < bm.Height; h++)
{
if (v.Length > c)
{
Color pixel = bm.GetPixel(w, h);
bm.SetPixel(w, h, Color.FromArgb(pixel.R, pixel.G, Convert.ToInt32(v[c])));
c++;
}
}
}
Color p = bm.GetPixel(Image.Width - 1, Image.Height - 1);
bm.SetPixel(Image.Width - 1, Image.Height - 1, Color.FromArgb(p.R, p.G, Convert.ToInt32(c)));
Image = (Image)bm;
imageBox.Image = Image;
myconn.openConnection();
if (password == reTypepassword)
{
MySqlCommand cmd = new MySqlCommand("insert into customer values(@id, @username, @email, @password, @Customer_Request,@location,@address,@key, @picture)", myconn.getConnection());
cmd.Parameters.Add(new MySqlParameter("@id", 0));
cmd.Parameters.Add(new MySqlParameter("@username", textBoxUsername.Text));
cmd.Parameters.Add(new MySqlParameter("@email", textBoxEmail.Text));
cmd.Parameters.Add(new MySqlParameter("@password", encryptPassword));
cmd.Parameters.Add(new MySqlParameter("@Customer_Request", ""));
cmd.Parameters.Add(new MySqlParameter("@location", ""));
cmd.Parameters.Add(new MySqlParameter("@address", textBoxAddress.Text));
cmd.Parameters.Add(new MySqlParameter("@key", Key));
cmd.Parameters.Add(new MySqlParameter("@picture", Image));
cmd.ExecuteNonQuery();
MessageBox.Show("Success to insert");
}
else
{
MessageBox.Show("Please enter the correct password");
}
}
private void按钮注册\单击(对象发送者,事件参数e)
{
字符串email=textBoxEmail.Text;
字符串username=textBoxUsername.Text;
字符串密码=textBoxPassword.Text;
字符串reTypepassword=textBoxReTypePassword.Text;
UsersClass user=新的UsersClass();
System.Security.Cryptography.AesCryptoServiceProvider keyMaker=新系统.Security.Cryptography.AesCryptoServiceProvider();
keyMaker.KeySize=128;
keyMaker.BlockSize=128;
keyMaker.GenerateKey();
字节[]build=keyMaker.Key;
字符串键=Convert.ToBase64String(build);
//MessageBox.Show(键);
string encryptPassword=user.EncryptString(Key,textBoxPassword.Text);
char[]v=encryptPassword.ToCharArray();
int c=0;
位图bm=新位图(图像);
对于(int w=0;wc)
{
彩色像素=bm.GetPixel(w,h);
bm.SetPixel(w,h,Color.FromArgb(pixel.R,pixel.G,Convert.ToInt32(v[c]));
C++;
}
}
}
颜色p=bm.GetPixel(Image.Width-1,Image.Height-1);
bm.SetPixel(Image.Width-1,Image.Height-1,Color.FromArgb(p.R,p.G,Convert.ToInt32(c));
图像=(图像)bm;
Image=Image;
myconn.openConnection();
如果(密码==重新键入密码)
{
MySqlCommand cmd=new MySqlCommand(“插入客户值(@id、@username、@email、@password、@customer\u Request、@location、@address、@key、@picture)”,myconn.getConnection());
cmd.Parameters.Add(新的MySqlParameter(“@id”,0));
cmd.Parameters.Add(新的MySqlParameter(“@username”,textBoxUsername.Text));
cmd.Parameters.Add(新的MySqlParameter(“@email”,textBoxEmail.Text));
cmd.Parameters.Add(新的MySqlParameter(“@password”,encryptPassword));
cmd.Parameters.Add(新的MySqlParameter(“@Customer_Request”,”);
cmd.Parameters.Add(新的MySqlParameter(“@location”,”);
cmd.Parameters.Add(新的MySqlParameter(“@address”,textBoxAddress.Text));
cmd.Parameters.Add(新的MySqlParameter(“@key”,key));
cmd.Parameters.Add(新的MySqlParameter(“@picture”,Image));
cmd.ExecuteNonQuery();
MessageBox.Show(“插入成功”);
}
其他的
{
MessageBox.Show(“请输入正确的密码”);
}
}
此代码将一个PNG文件(但也可能是另一种类型)写入数据库,检索它,并将其存储到“test.PNG”
using System.IO;
using MySql.Data.MySqlClient;
class Program
{
static void Main(string[] args)
{
string filename = @"D:/MySQL Server 8.0/Uploads/d95251abfa0f532b0b332906de4d3181b033b35e76319b807c4948df4fa5aa95.png";
string Server = "localhost";
string DatabaseName = "test";
string UserName = "test";
string Password = "test";
string connstring = string.Format("Server={0}; database={1}; UID={2}; password={3}", Server, DatabaseName, UserName, Password);
MySqlConnection conn = new MySqlConnection(connstring);
conn.Open();
string sql = "INSERT INTO pic VALUES(@idpic,@caption,@image)";
var cmd = new MySqlCommand(sql, conn);
cmd.Parameters.AddWithValue("@idpic",null);
cmd.Parameters.AddWithValue("@caption","test");
cmd.Parameters.AddWithValue("@image", File.ReadAllBytes(filename));
var result = cmd.ExecuteNonQuery();
var lastId = cmd.LastInsertedId;
Console.WriteLine($"Executing insert resulted in {result}, with idpic={lastId}");
sql = "SELECT img FROM pic WHERE idpic=@id";
cmd = new MySqlCommand(sql, conn);
cmd.Parameters.AddWithValue("@id", lastId);
MySqlDataReader reader = cmd.ExecuteReader();
reader.Read();
byte[] picture = (byte[])reader["img"];
File.WriteAllBytes(@"d:\temp\test.png", picture);
conn.Close();
}
}
MySQL表的创建如下所示:
CREATE TABLE `pic` (
`idpic` int unsigned NOT NULL AUTO_INCREMENT,
`caption` varchar(45) NOT NULL,
`img` longblob NOT NULL,
PRIMARY KEY(`idpic`)
) ENGINE=InnoDB AUTO_INCREMENT = 2 DEFAULT CHARSET = utf8mb4 COLLATE=utf8mb4_0900_ai_ci
至少有两个设置需要检查
您应该首先将图像转换为字节[]。(如)以下内容是为SQLServer编写的,但可以很容易地与MySQL配合使用(它展示了如何将图像保存到数据库以及如何读取图像):