2012-11-03 124 views
4

我用下面的代码插入到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(); 

插入正常,但没有得到显示的图像在查看器“值:

enter image description here

回答

12

二进制数据没有被正确地传递给你的插入物你会得到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 directive

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

最后,我参数化了您的查询。参数很有用,原因很多;它们有助于防范SQL Injection,在这种情况下,它们还应确保您的数据类型得到正确处理。你可以阅读更多关于SqlParameter(其中,像MySqlParameter是一个数据库特定的实现,但使用相同的原则)。

进行试验与MySQL 5.5.15工作,MySQL连接5.2.7 .NET 4中

+0

谢谢! 我试过但得到这个异常: {“你的SQL语法有错误;在第1行检查与你的MySQL服务器版本对应的正确语法对应的手册 - '_fileSize,_rawData') “} 我正在使用MySQL版本5 – Jobi

+1

请尝试使用下面的sql代替:请将command.CommandText =”INSERT INTO file(file_name,file_size,file)VALUES(?,?,?)“;我将有机会在稍后进行测试。 – dash

+0

现在得到另一个异常: {“Parameter'?'必须定义。“} – Jobi

-2

这个怎么样下运行:

它工作正常的我。
Exepte我发现它对我来说是错误的。

<?php 
// csv invoeren naar pos. 

$CSV = "uitvoer.csv"; 
// The CSV file has only 2 colums; The "Reference" and the image name (in my case the barcode with "thumb_" in front of it. 

$username = "Username"; 
$password = "Passwwoorrdd"; 
$database = "POS"; 
$counter = 0; 

// Create connection 
$conn = new mysqli("localhost", $username, $password, $database); 

// Check connection 
if ($conn->connect_error) { 
    die("Connection failed: " . $conn->connect_error); 
} 
echo "Connected successfully <br>"; 

//$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."----<br>"; 
    // 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"; 

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

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

这是在PHP中...虽然是一种创新的方法,但OP的代码是用C#编写的。他们需要安装PHP解释器才能使用此代码。 – vapcguy