WCF休息服务以Json对象的列表作为参数

问题描述:

我正尝试使用WCF Rest服务将节假日列表插入我的Oracle 12c数据库内的假日表中。当我运行我的服务时,我没有收到错误,但运行服务时未插入数据。 我相信我的cmdStr和UpdateHoliday()有问题。任何帮助都很赞赏。谢谢。WCF休息服务以Json对象的列表作为参数

IService1.cs

public interface IService1 
{ 
    [OperationContract()] 
    [WebInvoke(UriTemplate = "UpdateHoliday", ResponseFormat = WebMessageFormat.Json, Method = "POST")] 
    void UpdateHoliday(List<Holiday> Holidays); 
} 


[DataContract] 
public class Holiday 
{ 
    [DataMember(Order = 0)] 
    public string HOLIDAY { get; set; } 

    [DataMember(Order = 1)] 
    public string DESCRIPTION { get; set; } 

    public List<Holiday> Holidays { get; set; } 
} 

public class ListofHoliday 
{ 
    [DataMember] 
    List<Holiday> Holidays { get; set; } 
} 

Service1.cs

public class Service1 : IService1 
{ 
    public void UpdateHoliday(List<Holiday> Holidays) 
    { 
     List<ListofHoliday> firstStringList = new List<ListofHoliday>(); 
     string cmdStr = String.Format("INSERT INTO HOLIDAY (HOLIDAY, Description)" + 
            " VALUES('HOLIDAY','Description')"); 

     foreach (var item in firstStringList) 
     { 
      (new DbHelper()).SqlExecute(cmdStr); 
     } 
    } 


} 

DbHelper.cs

class DbHelper 
    { 
     private static string ConnectionString 
     { 
      get 
      { 
       return System.Configuration.ConfigurationManager.ConnectionStrings["cn"].ConnectionString; 
      } 
     } 

     public DataTable GetResultSet(string sql) 
     { 
      DataTable dt = new DataTable(); 
      using (OracleDataAdapter da = new OracleDataAdapter(sql, ConnectionString)) 
      { 
       da.Fill(dt); 
      } 
      return dt; 
     } 

     public void SqlExecute(string sql) 
     { 
      using (OracleCommand cmd = new OracleCommand(sql, new OracleConnection(ConnectionString))) 
      { 
       cmd.Connection.Open(); 
       cmd.ExecuteNonQuery(); 
       cmd.Connection.Close(); 
      } 
     } 

    } 

我终于能够找到一种方法,使其工作。这些变化是下面: Service1.cs

public class Service1 : IService1 
{ 
    public void UpdateHoliday(List<Holiday> Holidays) 
    { 
     if (Holidays == null) 
      throw new ArgumentNullException("Holidays"); 

     foreach (var item in Holidays) 
     { 
      StringBuilder sb = new StringBuilder(); 
      sb.Append("INSERT INTO HOLIDAY (HOLIDAY, DESCRIPTION) VALUES "); 
      sb.AppendFormat("('{0}', '{1}')", 
       item.HOLIDAY, item.DESCRIPTION); 
      //sb.AppendFormat(";"); 
      (new DbHelper()).SqlExecute(sb.ToString()); 
     } 
    } 


} 
+0

任何错误指示符? –

+0

我根本没有收到任何错误。在发送我的Json对象列表之后,我唯一得到的是“响应是空的”。如果它有效,预计会如何。 :| – user5511576

+0

我不知道你在服务操作循环中想要做什么,但是,通过该代码,什么都不会被插入。您正在创建一个空列表,然后遍历它并在每次迭代中插入相同的值。您的for循环会在空列表被评估后立即中断。这是你的预期吗? –

丰和有关服务操作尝试这种代码。如果下面的代码有效,那么为了使DBHelper接受带有参数的命令,您仍然需要做一些工作。

public class Service1 : IService1 
{ 
    public void UpdateHoliday(List<Holiday> Holidays) 
    { 
     if(Holidays==null) 
      throw new ArgumentNullException("Holidays"); 

     string cmdStr = String.Format("INSERT INTO HOLIDAY (HOLIDAY, Description)" + 
            " VALUES('HOLIDAY','Description')"); 

     foreach (var item in Holidays) 
     { 
      (new DbHelper()).SqlExecute(cmdStr); 
     } 
    } 


} 
+0

if(Holiday == null)part给我一个错误:'假日是一种在给定的上下文中无效的类型'。另一个问题是我想从参数输入中得到值('HOLIDAY','Description')。 – user5511576

+0

它应该是(假期== null),我更新答案。至于参数,有一个很好的方法来清理使用参数的内联sql字符串。因为我已经使用了内联,所以我不得不查看如何参数化SqlCommand。 –

+0

我找到了一个在线参考 - > https://msdn.microsoft.com/en-us/library/system.data.oracleclient.oraclecommand.parameters(v=vs.110).aspx –