2017-04-25 44 views
1

我想在varbinary(max)中插入空值,但它返回错误。无法在varbinary(max)中插入空值,但出现错误:不允许将数据类型nvarchar隐式转换为varbinary(max)

我想下面的代码保存照片,当我附上照片它没有任何问题保存。当没有照片时会抛出错误。

允许从数据类型nvarchar到varbinary(max)的隐式转换不是 。使用CONVERT函数来运行此查询。

protected void Button3_Click(object sender, EventArgs e) 
{ 
    newphoto pat = new newphoto(); 
    pat.id = id.Text; 
    byte[] photo = null; 
    if (Attch.HasFile) 
    { 
     Stream fs2 = Attch.PostedFile.InputStream; 
     BinaryReader br2 = new BinaryReader(fs2); 
     pat.photo = br2.ReadBytes((Int32)fs2.Length); 
    } 
    else 
    { 
     pat.photo = null; 
    } 
    pat.Addfile() 
} 

public bool Addfile() 
{ 
    Parameters.Clear(); 
    Parameters.AddWithValue("@pat_id", id); 
    if (photo == null) 
    { 
     Parameters.Add("@photo", SqlDbType.VarBinary, -1); 
     Parameters["@photo"].Value = DBNull.Value; 
    } 
    else 
    { 
     Parameters.AddWithValue("@photo", photo); 
    } 
    return FetchNonQuery(@"insert into mr_Info (@pat_id ,@photo)" + 
       " Values (@pat_id ,@photo)"); 
} 

protected bool FetchNonQuery(string CmdQuery) 
{ 
    bool result = false; 
    using (SqlConnection myConnection = DBConnection) 
    { 
     SqlCommand myCommand = new SqlCommand(CmdQuery, myConnection); 
     myCommand.CommandType = CommandType.Text; 
     //Set Parameters  
     foreach (SqlParameter Parameter in _parameters) 
     { 
      myCommand.Parameters.AddWithValue(Parameter.ParameterName, Parameter.Value); 
     } 
     //Execute the command 
     myConnection.Open(); 
     if (myCommand.ExecuteNonQuery() > 0) 
     { 
      result = true; 
     } 
     myConnection.Close(); 
    } 
    return result; 
} 
+1

试图更改添加行_myCommand.Parameters.Add(Parameter); _ – Steve

+0

中的命令的参数也是INSERT命令错误。您使用字段名称和值的参数。您应该写入_INSERT INTO(pat_id,photo)VALUES(@pat_id,@ photo)_ – Steve

+0

可能重复[参数varbinary数据类型中的空值](http://stackoverflow.com/questions/18170985/null-value-in -a-parameter-varbinary-datatype) –

回答

2

这是造成AddWithValue呼叫个微妙的问题。 (和not the only one)。
当AddWithValue能够正确识别参数的类型时,您没有问题,但是当您将参数值设置为DBNull.Value时,该方法会尝试将其转换为字符串,并且您会收到错误,因为数据字段期望VARBINARY。
但是,当您构建参数列表时,您可以精确地指定期望的类型,因此您可以简单地将该参数传递给Add方法,而不是使用AddWithValue构建另一个参数。

foreach (SqlParameter Parameter in _parameters) 
{ 
    myCommand.Parameters.Add(Parameter); 
} 

你甚至可以

myCommand.Parameters.AddRange(_parameters.ToArray()); 

而且消除环路,在我的其他评论指出,INSERT命令应该写成

INSERT INTO (pat_id,photo) VALUES (@pat_id ,@photo) 
相关问题