C#:使用存储过程从数据库中读取图像

Posted

技术标签:

【中文标题】C#:使用存储过程从数据库中读取图像【英文标题】:C#: Read an image from the database using a stored procedure 【发布时间】:2012-10-08 10:34:21 【问题描述】:

我一直在尝试使用存储过程读取图像文件。下面给出的是获取图像文件的存储过程。

CREATE PROCEDURE readImage 
    @sID int,
    @img image output
AS
BEGIN
    SET NOCOUNT ON;
    SET @img=(SELECT s_Image FROM Student WHERE s_ID=@sID);
END
GO

下面给出的是获取存储过程返回值的代码。

   SqlConnection con = new SqlConnection();
    Connect conn = new Connect();
    con = conn.getConnected();
    con.Open();
    SqlCommand cmd = new SqlCommand("readImage", con);
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.Add("@sID", SqlDbType.Int).Value = 17;
    SqlParameter retValue = cmd.Parameters.Add("@img", SqlDbType.Image);
    retValue.Direction = ParameterDirection.ReturnValue;
    try
    
        cmd.ExecuteNonQuery();
        MemoryStream ms = new MemoryStream((byte[])retValue.Value);
        pictureBox1.Image = Image.FromStream(ms);
        pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
        pictureBox1.Refresh();
    
    catch (InvalidOperationException ex)
    
        MessageBox.Show(ex.Message);
    

    finally
    
        if (con.State == ConnectionState.Open)
            con.Close();
    

但是,当我尝试运行代码时,我得到一个 SqlException:

过程或函数“readImage”需要参数“@img”,但未提供。

即使我已经传递了@img 变量。请帮我!谢谢!

【问题讨论】:

【参考方案1】:

retValue.Direction = ParameterDirection.ReturnValue; 更改为 retValue.Direction = ParameterDirection.Output;

【讨论】:

更改上述语句后,我收到错误消息“Byte[][1]: Size property has an invalid size of 0” @user1122359:VarChar 和 NVarChar 是可变宽度字符字段(因此是 var+char)。您必须设置长度,否则默认为零。 @user1122359:检查你忘记设置varchar或nvarchar的大小 @user1122359:如果你已经设置了所有然后尝试它 retValue.DbType = DbType.image; 没有 DbType.Image 但有所有其他类型。应该是 SByte 吗?

以上是关于C#:使用存储过程从数据库中读取图像的主要内容,如果未能解决你的问题,请参考以下文章

如何从存储过程中读取 c# oracle XmlType

使用 C# 和存储过程从 SQL Server 检索 VarChar(MAX)

从存储过程中读取时间戳值

从后面的 C# 代码调用存储过程时插入语句不起作用

从 C# 调用 Oracle 存储过程?

如何使用 c# datareader 和存储过程从 spl server 2012 数据表更新单个记录?