WebService.asmx.cs

[WebMethod]
public HashSet<callInfo> getCalls(string Date, string techID)
{
    HashSet<callInfo> list = new HashSet<callInfo>();
    var today = Convert.ToDateTime(Date);
    var tomorrow = today.AddDays(1).ToString("MM-dd-yyyy");
    var comm = new SqlCommand("Select RTrim(CallNbr), RTrim(CustNmbr), RTrim(AdrsCode), RTrim(SvcDescr), RTrim(SrvStat), RTrim(Customer_Reference), Convert(Varchar, ETADTE, 101), Convert(Varchar, ETATME, 108), RTrim(Address1), RTrim(City), RTrim(State), RTrim(Zip), Left(Phone1, 3) + '-' + SubString(Phone1, 5, 3) + '-' + SubString(Phone1, 9, 4) From SVC00200 Where ETADTE In ('" + Date + "','" + tomorrow +"') And TechID = '" + techID + "' And SrvStat Between '20D' And '59Z'", SQL01);
    SQL01.Open();
    SqlDataReader dr = comm.ExecuteReader();

    if (!dr.HasRows) { dr.Close(); SQL01.Close(); return null;}

        while (dr.Read())
        {
            callInfo ci = new callInfo
                              {
                                  callNumber = dr[0].ToString(),
                                  customer = dr[1].ToString(),
                                  adrsCode = dr[2].ToString(),
                                  svcDesc = dr[3].ToString(),
                                  srvStat = dr[4].ToString(),
                                  poNumber = dr[5].ToString(),
                                  etaDte = dr[6].ToString(),
                                  etaTime = dr[7].ToString(),
                                  address = dr[8].ToString(),
                                  city = dr[9].ToString(),
                                  state = dr[10].ToString(),
                                  zip = dr[11].ToString(),
                                  phone = dr[12].ToString()
                              };
            list.Add(ci);
        }

    dr.Close();
    SQL01.Close();
    return list;

}

Метод пытается использовать этот веб-сервис и заполнить HashSet из getCalls ()

private string getCalls()
{
    callInfo defaultCall = new callInfo() {callNumber = "None"};
    var calls = inst.getCalls(_date, _techID).DefaultIfEmpty(defaultCall).ToList();
    if (calls.First().callNumber == "None")
        return "None";
    foreach (callInfo info in calls)
    {
        try
        {
            var SQL = string.Format("Insert Or Ignore Into Calls Values ('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}','{10}','{11}','{12}')", info.callNumber, info.customer, info.adrsCode, info.svcDesc, info.srvStat, info.poNumber, info.etaDte, info.etaTime, info.address, info.city, info.state, info.zip, info.phone);
            new SQLite(SQL, false);
        }
        catch (Exception ex)
        {
            return "Error " + ex.Message;
        }
    }
    return "Success";
}

var calls = inst.getCalls бросков

«Необработанное исключение: System.ArgumentNullException: аргумент не может быть пустым. Имя параметра: источник»

Веб-метод возвращает значение null, когда нет вызовов, как и положено. Но даже когда у меня объявлено пустое значение по умолчанию, оно все равно создает исключение нулевого аргумента. Как обрабатывать нулевые возвращаемые значения?

1
jmease 12 Мар 2012 в 23:04

3 ответа

Лучший ответ

Если inst.getCalls(_date, _techID) возвращает null, разве не следующее .DefaultIfEmpty(defaultCall).ToList() вызывает исключение?

1
Nicklas Møller Jepsen 12 Мар 2012 в 19:15

Иногда слишком много прямых обратных сигналов. Я изменю ваш код таким образом:

   var calls = inst.getCalls(_date, _techID);
   if(calls == null) calls = defaultCall;
0
Steve 12 Мар 2012 в 19:17
    var result = inst.getCalls(_date, _techID)
    if (result != null)
    {
       callInfo defaultCall = new callInfo() {callNumber = "None"};
       var calls = result.ToList().DefaultIfEmpty(defaultCall)

    }

Как насчет чего-то подобного? Я думаю, вам нужно проверить, что результат вызова службы не равен нулю, прежде чем запрашивать список из него.

0
unnknown 12 Мар 2012 в 19:33