【问题标题】:Returning a json data from database using c# and wcf使用 c# 和 wcf 从数据库返回 json 数据
【发布时间】:2016-02-11 07:50:15
【问题描述】:

大家好! 我正在尝试制作一个程序,从数据库中返回特定电子邮件地址的会议详细信息。现在的问题是,我正在尝试使用这些构造一个 JSON 响应:

[DataContract]
public class Meetings
{
    public string PresiderEmailAddress { get; set; }
    public List<MeetingDetails> Allmeeting { get; set; }
}

[DataContract]
public class MeetingDetails
{
    [DataMember(Order = 0)]
    public long MeetingId { get; set; }

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

    [DataMember(Order = 2)]
    public string MeetingName {get; set;}

    [DataMember(Order = 3)]
    public string MeetingDescription {get; set;}

    [DataMember(Order = 4)]
    public string MeetingDate {get; set;}

    [DataMember(Order = 5)]
    public string MeetingVenue {get; set;}

    [DataMember(Order = 6)]
    public string TimeStarted {get; set;}

    [DataMember(Order = 7)]
    public string TimeEnded {get; set;}

    [DataMember(Order = 8)]
    public decimal CompletionRate {get; set;}

    [DataMember(Order = 9)]
    public string Remarks {get; set;}
}

public Meetings retrieveMeetingDetailsByEmail(string EmailAddress)
{
    SqlConnection EMTConnection2 = new SqlConnection();
    EMTConnection2.ConnectionString = constring;
    EMTConnection2.Open();
    SqlDataReader dr2;
    string EMTQuery2 = "Select * from dbo.Meeting where PresiderEmailAddress = @PresiderEmailAddress";
    SqlCommand EMTCommand2 = new SqlCommand(EMTQuery2, EMTConnection2);
    EMTCommand2.Parameters.AddWithValue("@PresiderEmailAddress", EmailAddress);

    dr2 = EMTCommand2.ExecuteReader();

    if (dr2.HasRows)
    {
        while (dr2.Read())
        {

            var meeting = new Meetings
              {
                  Allmeeting = new List<MeetingDetails>
                {
                  new MeetingDetails{MeetingId = Convert.ToInt64(dr2["MeetingId"]), MeetingNumber = dr2["MeetingNumber"].ToString(), MeetingName = dr2["MeetingName"].ToString(), MeetingDescription = dr2["MeetingDescription"].ToString(), MeetingDate = Convert.ToDateTime(dr2["MeetingDate"]).ToShortDateString().ToString(), MeetingVenue = dr2["MeetingVenue"].ToString(), TimeStarted = dr2["TimeStarted"].ToString(), TimeEnded = dr2["TimeEnded"].ToString(), CompletionRate = Convert.ToDecimal(dr2["CompletionRate"]), Remarks = dr2["Remarks"].ToString()}
                }
              };
        }
    }
    EMTConnection2.Close();
    dr2.Close();
}

问题是,如何将所有数据返回给客户端?它总是告诉我该方法应该有一个返回值,我不知道我应该在哪里返回什么。 我真的很困惑。

【问题讨论】:

  • new MeetingDetails { ... } 完成所有分配后,您的意思是?然后在方法的最后,你需要一个 return meeting; ,因为 meeting 超出范围,所以你需要在外部范围内声明它,例如在 if() 之前.无论如何,请阅读How to Ask,“我很困惑”不是我们可以回答的问题。
  • 很抱歉。这里还是新手。是的,在所有任务之后。我应该把退货声明放在哪里?我无法访问会议变量。
  • 方法结束。

标签: c# wcf


【解决方案1】:

局部变量只在块内有作用域。你应该阅读一些好的 c# 材料Variables and scope。下一个问题,使用返回类型声明的函数应该返回该类型的对象。

为了解决您的问题,请更改您的方法 retrieveMeetingDetailsByEmail 如下

public Meetings retrieveMeetingDetailsByEmail(string EmailAddress)
{
    using(SqlConnection EMTConnection2 = new SqlConnection())
    {
        string constring = ""; //Initialize connection string here
        EMTConnection2.ConnectionString = constring;
        EMTConnection2.Open();
        string EMTQuery2 = "Select * from dbo.Meeting where PresiderEmailAddress = @PresiderEmailAddress";
        using(SqlCommand EMTCommand2 = new SqlCommand(EMTQuery2, EMTConnection2))
        {
            EMTCommand2.Parameters.AddWithValue("@PresiderEmailAddress", EmailAddress);
            var meeting = new Meetings();
            meeting.PresiderEmailAddress = EmailAddress;

            using (SqlDataReader dr2 = EMTCommand2.ExecuteReader();
            {
                if (dr2.HasRows)
                {
                    meeting.Allmeeting = new List<MeetingDetails>();
                    while (dr2.Read())
                    {
                        meeting.Allmeeting.add(new MeetingDetails{MeetingId = Convert.ToInt64(dr2["MeetingId"]), MeetingNumber = dr2["MeetingNumber"].ToString(), MeetingName = dr2["MeetingName"].ToString(), MeetingDescription = dr2["MeetingDescription"].ToString(), MeetingDate = Convert.ToDateTime(dr2["MeetingDate"]).ToShortDateString().ToString(), MeetingVenue = dr2["MeetingVenue"].ToString(), TimeStarted = dr2["TimeStarted"].ToString(), TimeEnded = dr2["TimeEnded"].ToString(), CompletionRate = Convert.ToDecimal(dr2["CompletionRate"]), Remarks = dr2["Remarks"].ToString());
                    }
                }
                dr2.Close();
            }
            EMTConnection2.Close();
        }
    }

    return meeting;
}

【讨论】:

  • 很抱歉。我对这门语言还是很陌生。我将测试这段代码,看看它是否有效。谢谢!
【解决方案2】:

你没有正确声明meeting对象

编辑: 1.在外部范围内创建会议对象 2.你必须在方法结束时返回会议对象。

public Meetings retrieveMeetingDetailsByEmail(string EmailAddress)
{
    SqlConnection EMTConnection2 = new SqlConnection();
    EMTConnection2.ConnectionString = constring;
    EMTConnection2.Open();
    SqlDataReader dr2;
    string EMTQuery2 = "Select * from dbo.Meeting where PresiderEmailAddress = @PresiderEmailAddress";
    SqlCommand EMTCommand2 = new SqlCommand(EMTQuery2, EMTConnection2);
    EMTCommand2.Parameters.AddWithValue("@PresiderEmailAddress",EmailAddress);

   dr2 = EMTCommand2.ExecuteReader();
   var meeting = new Meetings(); //declare here
   if (dr2.HasRows)
   {
       while (dr2.Read())
       {
            var meetingDetails = new MeetingDetails
            {  
                MeetingId = Convert.ToInt64(dr2["MeetingId"]), MeetingNumber = dr2["MeetingNumber"].ToString(), MeetingName = dr2["MeetingName"].ToString(), MeetingDescription = dr2["MeetingDescription"].ToString(), MeetingDate = Convert.ToDateTime(dr2["MeetingDate"]).ToShortDateString().ToString(), MeetingVenue = dr2["MeetingVenue"].ToString(), TimeStarted = dr2["TimeStarted"].ToString(), TimeEnded = dr2["TimeEnded"].ToString(), CompletionRate = Convert.ToDecimal(dr2["CompletionRate"]), Remarks = dr2["Remarks"].ToString()
            };
            meeting.AllMeetings.Add(meetingDetails);
       }
    }
    meeting.PresiderEmailAddress = EmailAddress; //add here 
    EMTConnection2.Close();
    dr2.Close();
    return meeting; // return the meeting object
}

【讨论】:

  • 是的,正如@Chris 告诉我的那样,我的变量超出了我的声明范围。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-28
  • 1970-01-01
  • 2019-01-26
  • 2012-10-30
相关资源
最近更新 更多