C#将大字节数组(image)作为参数添加到dbcommand中
我目前正在为一个项目创建一个手动数据库层。当我试图存储大于8k的字节数组(图像)时,遇到了一个问题 通常,我使用以下方法创建命令并填充参数: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
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应该让您完成原始代码块,您仍然需要执行执行命令、获取结果等。