C#将大字节数组(image)作为参数添加到dbcommand中

C#将大字节数组(image)作为参数添加到dbcommand中,c#,database,C#,Database,我目前正在为一个项目创建一个手动数据库层。当我试图存储大于8k的字节数组(图像)时,遇到了一个问题 通常,我使用以下方法创建命令并填充参数: DbCommand cmd = new SqlCommand("INSERT INTO test1 VALUES (@mail, @picture)"); i=cmd.DeclareParameter(cmd, "mail", DbType.String, "mail"); if (i>0) { cmd.Parameters[i].Value

我目前正在为一个项目创建一个手动数据库层。当我试图存储大于8k的字节数组(图像)时,遇到了一个问题

通常,我使用以下方法创建命令并填充参数:

DbCommand cmd = new SqlCommand("INSERT INTO test1 VALUES (@mail, @picture)");
i=cmd.DeclareParameter(cmd, "mail", DbType.String, "mail");
if (i>0)
{
    cmd.Parameters[i].Value = mailData;
}
(以上是我使用的多种方法的组合)。 现在,当我尝试添加图片(即
byte[]
)时,我遇到了一个问题,我需要在那里使用
SqlDbType.VarBinary

我见过一些使用
.Parameters.Add
的解决方案,但是我的Add只需要1个参数(而不是我看到的示例中的2个参数)。然后,当我尝试使用
cmd.CreateParameter
创建自己的参数时,
DbType
只接受
DbType
,而不需要
SqlDbType

要将
byte[]
添加为参数(对于大于8k的字节数组),我必须在这里做些什么


tnxSqlDbType.Image是否更合适

如果不考虑,考虑

您告诉它使用DbCommand而不是SqlDbCommand

试试这个:

using(var command = new SqlCommand(@"INSERT INTO test1 VALUES (@mail, @picture)"))
        {
            command.Parameters.Add(@"mail", SqlDbType.Image);
            if (i > 0)
            {
                command.Parameters[i].Value = mailData;
            }
        }
(我想加上这句话作为评论,但我不能这样做,所以我谢绝了。)

当我尝试使用cmd.CreateParameter创建自己的参数时,DbType只接受DbType,不需要SqlDbType

这是因为您将命令声明为
DbCommand
,而不是
SqlCommand
。如果将其声明为
SqlCommand
,则它应该可以工作:

|------
V
SqlCommand cmd = new SqlCommand("INSERT INTO test1 VALUES (@mail, @picture)");
cmd.Parameters.AddWithValue("@mail", mailData);

SqlParameter p = cmd.Parameters.Add("@picture", SqlDbType.VarBinary);
p.Value = {picture data};

<>如果你的文件很大,你可以考虑流到BLUB(图像)列中。请参见。

您需要为参数指定长度-1。否则它将是
VARBINARY(8000)
。显式长度为-1时,它将是
VARBINARY(MAX)
,这正是您所需要的。

您尝试过吗?这将使您能够添加一个参数及其关联的值。考虑到这一点,但根据C#我使用的DbCommand的参数没有任何addWithValues。我的问题之一是,我无法以某种方式使用SqlDbType作为参数(未找到任何方法允许我添加一个采用sqldbtype而不是“仅”dbtype的参数)。根据您的响应更新了我的答案。您正在将sqldbtype强制转换为dbtype,这会更改您可以使用的选项。请注意,我认为您应该使用“.image”,因为VarBinary限制为8000。成功更改是否有可能产生副作用?(到目前为止,我只使用实体框架或dbcommand)对于实体框架,您可以向类中添加字节数组属性。我想不出这一点,因为SqlCommand不会隐藏我可以找到的任何DbCommand方法或属性。好的,在p之后还有最后一个问题。Value还有什么需要做的吗?Wel l lthat应该让您完成原始代码块,您仍然需要执行执行命令、获取结果等。