我有一个基于套接字通信的应用程序,服务器将请求发送到客户端以获取签名图像。签名在客户端获取,然后发送回服务器。
为此,我使用了一个图片框,将其数据转换为字节,然后转换为字符串,以通过套接字连接发送到服务器。一切正常。
我在保存数据库中接收到的数据时遇到问题,因为我需要将其保存为图像类型,但是此时数据仍然是字符串,因此出现错误:
“操作数类型冲突:nvarchar与图像不兼容”
我想这是因为我正在尝试将字符串发送到sql图像类型?
尝试调用该过程和错误的代码(服务器端接收到的数据作为字符串):
try
{
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["GetConnector"].ConnectionString))
{
SqlCommand sqlComm = new SqlCommand("PL_Device_ReadData", conn);
sqlComm.Parameters.AddWithValue("@DeviceTypeID", DeviceID);
sqlComm.Parameters.AddWithValue("@RequestID", RequestID);
if (DeviceID != "5")
{
sqlComm.Parameters.AddWithValue("@Reading", Reading);
}
else if (DeviceID == "5")
{
sqlComm.Parameters.AddWithValue("@ImageReading", Reading);
sqlComm.Parameters.Add("@ImageReading", SqlDbType.Image);
sqlComm.Parameters["@ImageReading"].Value = Reading;
}
sqlComm.CommandType = CommandType.StoredProcedure;
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = sqlComm;
da.Fill(ds);
}
}
catch (Exception e)
{
}
存储过程:
ALTER PROCEDURE [dbo].[PL_Device_ReadData]
@DeviceTypeID INT,
@RequestID INT,
@Reading NVARCHAR(100) = NULL,
@ImageReading IMAGE = NULL
AS
BEGIN
--Data
IF @DeviceTypeID = 5
BEGIN
UPDATE dbo.DeviceRequests
SET ImageData = @ImageReading
WHERE id = @RequestID
AND DeviceTypeID = @DeviceTypeID
END
ELSE
BEGIN
UPDATE dbo.DeviceRequests
SET Value = @Reading
WHERE id = @RequestID
AND DeviceTypeID = @DeviceTypeID
END
END
将图像转换为字节:
byte[] imgData = null;
// storage for the img bytes
imgData = ImgToByteArray(picSignature.InitialImage, ImageFormat.Jpeg);
public static byte[] ImgToByteArray(Image img, ImageFormat imgFormat)
{
byte[] tmpData = null;
using (MemoryStream ms = new MemoryStream())
{
img.Save(ms, imgFormat);
tmpData = ms.ToArray();
}
// dispose of memstream
return tmpData;
}
将字节转换为字符串(以通过套接字发送):
_Reading = System.Text.Encoding.UTF8.GetString(_imagevalues);
这:
_Reading = System.Text.Encoding.UTF8.GetString(_imagevalues);
是错的。是否_imagevalues
保存图像的二进制数据?比起这行代码,您试图将其解释为字符串,这是错误的。您只需要转换图像的每个字节即可说出其十六进制字符串表示形式。然后通过网络发送整个这样的字符串。例如,请参见此处如何将字节数组转换为十六进制字符串,反之亦然?(如答案之一所述,这种转换并不是真正必要的,您也可以发送纯字节)。
然后在服务器端,您必须解析此十六进制字符串并将其转换为字节数组,并可能保存在数据库中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句