C# 从MySQL检索中blob只返回13字节
我找了很多,尝试了各种方法,但都没能解决这个问题。 我需要将图像保存到mysql文件中 我使用下面的代码将图像保存到数据库中C# 从MySQL检索中blob只返回13字节,c#,mysql,c#-4.0,C#,Mysql,C# 4.0,我找了很多,尝试了各种方法,但都没能解决这个问题。 我需要将图像保存到mysql文件中 我使用下面的代码将图像保存到数据库中 try { string location = @"C:\Users\test\Downloads\Photos\batman-greenscreen.jpg"; FileStream fs = new FileStream(location, FileMode.Open, FileAccess.Read); UInt32 fileLength
try
{
string location = @"C:\Users\test\Downloads\Photos\batman-greenscreen.jpg";
FileStream fs = new FileStream(location, FileMode.Open, FileAccess.Read);
UInt32 fileLength = (UInt32)fs.Length;
byte[] buffer = new byte[fileLength];
fs.Read(buffer, 0, (int)fileLength);
string sqlPhotoQuery = "INSERT INTO tab_photo VALUES('" + photo.PhotoId + "','" + photo.ProjectID + "','" + photo.Day + "','" + photo.Barcode + "','" + photo.Photoname + "','" + photo.PhotoXml + "','" + buffer + "','" + fileLength + "')";
int result = MySqlHelper.ExecuteNonQuery(connectionString, sqlPhotoQuery);
if (result > 0)
return true;
else
return false;
}
catch (Exception e)
{
return false;
}
在此文件中,图像长度为12428,
我尝试从数据库检索数据的内容:
Photo photo = new Photo();
try
{
string sqlQuery = "SELECT * FROM tab_photo where PhotoId='"+photoId+"'";
MySqlDataReader rdr = MySqlHelper.ExecuteReader(connectionString, sqlQuery);
while (rdr.Read())
{
photo.PhotoId = rdr.GetString("PhotoId");
photo.ProjectID = rdr.GetString("ProjectID");
photo.Day = rdr.GetInt32("Day");
photo.Barcode = rdr.GetString("Barcode");
photo.Photoname = rdr.GetString("Photoname");
photo.PhotoXml = rdr.GetString("PhotoXml");
MemoryStream ms;
UInt32 FileSize;
Bitmap outImage;
int fileSize = rdr.GetInt32(rdr.GetOrdinal("PhotoSize"));
byte[] rawData = new byte[fileSize];
rdr.GetBytes(rdr.GetOrdinal("Photo"), 0, rawData, 0, (Int32)fileSize);
photo.imageByte = rawData;
}
}
catch (Exception e)
{}
但当我检索文件时,它只检索前13个字节。在这之后,它的值是零,并且在检索值方面存在差异
我已按照第3.1节中提到的说明进行操作
根据这一点,我已将设置更改如下:
这就是数据保存在数据库中的方式
我无法获得正确值的原因是什么?数据保存、数据检索或数据库配置是否有问题?数据库中不能有正确的数据。通过将缓冲区连接到查询字符串中,“System.Byte[]”将被插入到数据库中,因为insert语句基本上如下所示
INSERT INTO tab_photo VALUES(...,'System.Byte[]', ...)";
像示例中那样使用参数化查询,您应该会做得很好
不要只是将字符串从某个地方连接到SQL查询中。(并且不要在这样的方法中捕获并吞咽所有异常。这使得在出现故障时很难进行调试。)您将二进制数据放入字符串中,以将其写入数据库,这将不起作用。尝试按照您发布的示例URL中的方法,使用@参数传递数据blob。您没有正确插入数据。您的
INSERT
语句如下:
string sqlPhotoInsert = "INSERT INTO tab_photo VALUES('" + ...
换句话说,您没有使用参数化查询来插入BLOB数据-这可能无法正常工作
必须使用参数化查询。您可以在中找到工作示例(滚动到
C
example)。数据库端的数据是什么样子的?Insert
语句是否将完整的byte[]buffer
加载到数据库中?@jordanhill123我已经添加了db sample,这也很好地解释了这一点。您可以使用,@buffer,
,而不是,“+buffer+”,
,并像调用MySqlHelper.ExecuteNonQuery(connectionString,sqlPhotoQuery,newmysqlparameter(“@buffer”,buffer))代码>。(重复上述步骤,以使所有值更安全地抵御SQL注入攻击。)