2014-02-05 43 views
1

我正试图发送SqlPrameter到wcf服务。我试图发送的SqlParameter参数包括字符串,整数和字节(我将数据库中的文件存储在varbinary中)。该如何将SqlParameter发送到SQLParameter包含字节[]的WCF?

下面是我用我的应用程序的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服务得到以下错误:

There was an error while trying to serialize parameter
http://tempuri.org/:params .
The InnerException message was 'Type 'System.Data.SqlTypes.SqlBinary' with data contract name 'base64Binary: http://www.w3.org/2001/XMLSchema ' is not expected. Consider using a DataContractResolver or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.'. Please see InnerException for more details

UPDATE

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; 
+0

您为'@ img'设置的参数类型是什么? –

+1

你想通过WCF发送一个SqlParameter吗?这是一个可怕的想法。这将是一个巨大的安全问题,我很确定SQLParameter是不可序列化的。只需将您的**数据**发送到您的服务,并让它创建SqlParameters – Liam

+1

您的抽象内容正在泄漏...... –

回答

0

设置你的参数类型VarBinary

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

检查Data type mappings

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

,你可以用它代替SqlDbType.VarBinary

看看这个SqlDbType.Image question也不是相同的问题,但你可以从这里得到你的答案。

+0

这并未解决WCF问题。即使OP添加了这些代码,他的方法仍然不起作用。 – Liam