如何将SqlParameter发送到SQLParameter包含Bytes []的WCF?

时间:2014-02-05 10:34:48

标签: c# asp.net vb.net wcf

我正在尝试将SqlPrameter发送给wcf服务。我试图发送的SqlParameter参数包括字符串,整数和字节(我在varbinary中的数据库中存储文件)。

以下是我在我的应用程序中使用的C#代码:

Public Function InsertadanceClaimAttachMents(ByVal params As SqlParameter()) As Integer Implements IService.InsertadanceClaimAttachMents
       Dim i As Int16
       Try
           sql = ""
           sql = "Proc_InsertAdvanceClamAtt"

           i = Db.ExecProcedure(Declarations.ConnectionString, sql, params)
           Return i
       Catch ex As Exception
           Db.WriteErrorLog(ex, "Wcf_DBAccess.vb", "InsertadanceClaimAttachMents")
           Return 0
       End Try
   End Function

以下是我在WCF服务中使用的VB函数

  public bool insertAdvanceAttachments(Byte[] bytes, string filename, string ClaimNo, string mkrid)
       {
           Int32 I;
           SqlConnection con = new SqlConnection(conn);
           SqlCommand cmd = new SqlCommand();
           SqlDataAdapter da = new SqlDataAdapter();
           cmd.Connection = con;
           cmd.CommandType = CommandType.StoredProcedure;
           cmd.CommandText = "Proc_InsertAdvanceClamAtt";


           cmd.Parameters.AddWithValue("@img", bytes);
           cmd.Parameters.AddWithValue("@imgname", filename);
           cmd.Parameters.AddWithValue("@ClaimNo", ClaimNo);
           cmd.Parameters.AddWithValue("@mkrid", mkrid);

           try
           {
               con.Open();
               cmd.ExecuteNonQuery();
               return true;
           }
           catch
           {
               return false;
           }
           //finally { con.Close(); }


           //try
           //{
           //    // string param, paramval;
           //    //param = "@img|@imgname|@ClaimNo|@mkrid";
           //    //paramval = ASCIIEncoding.ASCII.GetString(bytes).ToString() + "|" + filename + "|" + ClaimNo + "|" + mkrid;


           //    //SqlParameter[] param = { new SqlParameter("@img", bytes ), new SqlParameter("@imgname", filename), new SqlParameter("@ClaimNo", ClaimNo), new SqlParameter("@mkrid", mkrid) };


           //    SqlParameter[] param = { new SqlParameter("@img", SqlDbType.VarBinary, bytes.Length, ParameterDirection.Input, false, 0, 0, "Data", DataRowVersion.Current, (SqlBinary)bytes), new SqlParameter("@imgname", filename), new SqlParameter("@ClaimNo", ClaimNo), new SqlParameter("@mkrid", mkrid) };

           //    I = baz_obj.InsertadanceClaimAttachMents(param);
           //    return true;
           //}
           //catch (Exception ex)
           //{
           //    return false;
           //}
           return true;
       }

问题是我甚至无法到达WCF服务获得以下错误:

  

尝试序列化参数时出错   http://tempuri.org/:params
  InnerException消息是“Type”System.Data.SqlTypes.SqlBinary',不期望数据协定名称为“base64Binary:http://www.w3.org/2001/XMLSchema”。考虑使用DataContractResolver或将任何静态未知的类型添加到已知类型列表中 - 例如,通过使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中。有关详细信息,请参阅InnerException

更新

SqlParameter[] param = { new SqlParameter("@img", SqlDbType.VarBinary), new SqlParameter("@imgname", SqlDbType.VarChar), new SqlParameter("@ClaimNo", SqlDbType.VarChar), new SqlParameter("@mkrid", SqlDbType.VarChar) };
           param[0].Value = bytes;
           param[1].Value = filename;
           param[2].Value = ClaimNo;
           param[3].Value = mkrid;

2 个答案:

答案 0 :(得分:1)

Dim data As byte()
Dim parameter As New SqlParameter("@Param1", SqlDbType.VarBinary);
parameter.Value = data

您可以使用SqlDbType.Image而不是SqlDbType.VarBinary

查看此question也不是同一个问题,但您可以从此处获得答案。

答案 1 :(得分:0)

将参数类型设置为VarBinary

SQLParameter param1=new SqlParameter("@img",SqlDbType.VarBinary);
param1.Value=bytes
param.Add(param1);
param.AddRange(etc);

检查Data type mappings

相关问题