如何插入BLOB数据类型

我正在使用以下代码插入blob字段:


MySql.Data.MySqlClient.MySqlConnection conn; MySql.Data.MySqlClient.MySqlCommand cmd; conn = new MySql.Data.MySqlClient.MySqlConnection(); cmd = new MySql.Data.MySqlClient.MySqlCommand(); string SQL; int FileSize; byte[] rawData; FileStream fs; conn.ConnectionString = "server=192.168.1.104;uid=root;" + "pwd=root;database=cady234;"; fs = new FileStream(@"d:\Untitled.gif", FileMode.Open, FileAccess.Read); FileSize = (int)fs.Length; rawData = new byte[FileSize]; fs.Read(rawData, 0, FileSize); fs.Close(); conn.Open(); string strFileName = "test name"; SQL = "INSERT INTO file (file_name, file_size, file) VALUES ('" + strFileName + "', "+FileSize+", '"+rawData+"')"; cmd.Connection = conn; cmd.CommandText = SQL; cmd.ExecuteNonQuery(); conn.Close(); 

插入正常但使用“在查看器中打开值”时图像未显示:

在此处输入图像描述

当您使用字符串连接时,二进制数据未正确传递给您的插入 – 您将获得rawData.ToString() ,它可能只打印出TypeName(因此您的二进制数据长度为13个字节,与文件大小相比) > 3000字节); 试试这个:

 byte[] rawData = File.ReadAllBytes(@"d:\Untitled.gif"); FileInfo info = new FileInfo(@"d:\Untitled.gif"); int fileSize = Convert.ToInt32(info.Length); using(MySqlConnection connection = new MySqlConnection("server=192.168.1.104;uid=root;pwd=root;database=cady234;")) { using(MySqlCommand command = new MySqlCommand()) { command.Connection = connection; command.CommandText = "INSERT INTO file (file_name, file_size, file) VALUES (?fileName, ?fileSize, ?rawData);"; MySqlParameter fileNameParameter = new MySqlParameter("?fileName", MySqlDbType.VarChar, 256); MySqlParameter fileSizeParameter = new MySqlParameter("?fileSize", MySqlDbType.Int32, 11); MySqlParameter fileContentParameter = new MySqlParameter("?rawData", MySqlDbType.Blob, rawData.Length); fileNameParameter.Value = "test name"; fileSizeParameter.Value = fileSize; fileContentParameter.Value = rawData; command.Parameters.Add(fileNameParameter); command.Parameters.Add(fileSizeParameter); command.Parameters.Add(fileContentParameter); connection.Open(); command.ExecuteNonQuery(); } } 

我在这里为你介绍了几个概念; 首先,如果要一次加载所有二进制数据,只需使用静态方法File.ReadAllBytes – 它的代码要少得多。

其次,每次都不需要使用完全限定的命名空间 – 使用using指令

第三,(稍微容易混淆)在C#中还有一个using语句 。 这可确保实现IDisposable的任何对象在其自身之后得到正确清理。 在连接的情况下,如果命令成功或失败,它将显式调用Close和Dispose。

最后,我已经参数化了你的查询。 参数有很多原因; 它们有助于防止SQL注入 ,在这种情况下,它们还应确保正确处理您的数据类型。 您可以阅读有关SqlParameter的更多信息(例如,MySqlParameter是一个特定于数据库的实现,但使用相同的原理)。

测试使用MySQL 5.5.15,在.Net 4下运行的MySQL Connector 5.2.7

这个怎么样:

这对我来说可以。
Exepte我发现这对我来说是错误的。

 connect_error) { die("Connection failed: " . $conn->connect_error); } echo "Connected successfully 
"; //$mysqli->select_db(); ini_set('max_execution_time', 1000); //300 seconds = 5 minutes if (($handle = fopen($CSV, "r")) !== FALSE) { while (($data = fgetcsv($handle, 1050, ",")) !== FALSE) { // this loops through each line of your csv, putting the values into array elements $counter++; $IDEE = $data[0]; // It seems that after opening the image the $data is mixed up. $imag = "photos/".$data[1]; // where "photos/' the folder is where this php file gets executed (mostly in /var/www/ of /var/www/html/) $fh = fopen($imag, "r"); $data = addslashes(fread($fh, filesize($imag))); fclose($fh); echo " Ref: ".$IDEE." ----".$counter."----
"; // If there will be a time-out. You could erase the part what is already done minus 1. $sql = "UPDATE PRODUCTS SET IMAGE='".$data."' WHERE CODE=$IDEE";

//表格带有图片的产品。 该表中有更多数据。 但我只需要更新IMAGE。 其余的已插入。

 if ($conn->query($sql) === TRUE) { echo "Tabel products updated successfully
"; } else { echo "
Error updating tabel Products: " . $conn->error; Exit(); } } fclose($handle); } ?>