【问题标题】:How to send SqlParameter to WCF where SQLParameter contains Bytes[]?如何将 SqlParameter 发送到 SQLParameter 包含 Bytes[] 的 WCF?
【发布时间】:2014-02-05 10:34:47
【问题描述】:

我正在尝试将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;

【问题讨论】:

  • 你为@img设置的参数类型是什么?
  • 您是否尝试通过 WCF 发送 SqlParameter?这是一个可怕的想法。这将是一个巨大的安全问题,我很确定 SQLParameter 是不可序列化的。只需将您的 data 发送到您的服务并让它创建 SqlParameters
  • 您的抽象正在泄漏...

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


【解决方案1】:
Dim data As byte()
Dim parameter As New SqlParameter("@Param1", SqlDbType.VarBinary);
parameter.Value = data

您可以使用 SqlDbType.Image 代替 SqlDbType.VarBinary

查看这个question 也不是同一个问题,但您可以从这里得到答案。

【讨论】:

  • 这并没有解决 WCF 问题。即使 OP 添加了此代码,他的方法仍然行不通。
【解决方案2】:

将参数类型设置为VarBinary

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

查看Data type mappings

【讨论】:

    猜你喜欢
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-17
    • 1970-01-01
    • 2012-07-01
    相关资源
    最近更新 更多