无法将类型字符串隐式转换为System.Collections.Generic.Dictionary <string,system.collections.generic.dictionary> <string,object>&gt; </string,object> </string,system.collections.generic.dictionary>

时间:2014-04-03 10:22:03

标签: c# json web-services

我在return errmsg(ex);附近收到错误:

  

无法隐式转换类型字符串   system.collections.generic.dictionary&GT;

这是我的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Script.Serialization;
using System.Web.Script.Services;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.ComponentModel;


namespace Webservice
{
    /// <summary>
    /// Summary description for Service1
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    // [System.Web.Script.Services.ScriptService]
    public class Service1 : System.Web.Services.WebService
    {
        public Service1()
        {
            //Uncomment the following line if using designed components 
            //InitializeComponent(); 
        }
        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        //public string GetEmployees(string SearchTerm) 
        private static Dictionary<string, Dictionary<string, object>> DatatableToDictionary(DataTable dt)
        {
            var cols = dt.Columns.Cast<DataColumn>();
            return dt.Rows.Cast<DataRow>()
                     .ToDictionary(r => dt.Rows.IndexOf(r).ToString(),
                                   r => cols.ToDictionary(c => c.ColumnName, c => r[c.ColumnName]));
        }
        public Dictionary<string, Dictionary<string, object>> GetEmployees()
        {
            try
            {
                SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["NSConstr"].ToString());
                con.Open();
                SqlCommand cmd = new SqlCommand();
                //cmd.CommandText = "SELECT *  FROM Contact e WHERE FirstName LIKE '%" + SearchTerm + "%'";
                cmd.CommandText = "SELECT *  FROM Contact e ";
                DataSet ds = new DataSet();
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                da.SelectCommand.Connection = con;
                da.Fill(ds);
                con.Close();

                return DatatableToDictionary(ds.Tables[0]);
            }
            catch (Exception ex)
            {
                ***return errmsg(ex);***

            }
        }

        public string errmsg(Exception ex)
        {
            return "[['ERROR','" + ex.Message + "']]";
        }
     }
 }

提前致谢。

2 个答案:

答案 0 :(得分:0)

您无法从返回类型为Dictionary<string, Dictionary<string, object>>

的方法返回字符串
public Dictionary<string, Dictionary<string, object>> GetEmployees()
{
    try
    {
        SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["NSConstr"].ToString());
        con.Open();
        SqlCommand cmd = new SqlCommand();
        cmd.CommandText = "SELECT *  FROM Contact e ";
        DataSet ds = new DataSet();
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        da.SelectCommand.Connection = con;
        da.Fill(ds);
        con.Close();

        return DatatableToDictionary(ds.Tables[0]);
    }
    catch (Exception ex)
    {
        // Here you are returning a string, the method signature is Dictionary<string, Dictionary<string, object>>
        return errmsg(ex);
    }
}

让调用代码在调用堆栈的后面进一步处理异常,而不是捕获Exception并返回异常消息。所以你有类似的东西:

public Dictionary<string, Dictionary<string, object>> GetEmployees()
{                    
    SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["NSConstr"].ToString());
    con.Open();
    SqlCommand cmd = new SqlCommand();
    cmd.CommandText = "SELECT *  FROM Contact e ";
    DataSet ds = new DataSet();
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    da.SelectCommand.Connection = con;
    da.Fill(ds);
    con.Close();
    return DatatableToDictionary(ds.Tables[0]);
}

答案 1 :(得分:0)

以下代码解决了我的问题:

public string GetEmployees()
        {
            System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();

            SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["NSConstr"].ToString());
            SqlCommand cmd = new SqlCommand();
            cmd.CommandText = "SELECT *  FROM Contact e ";
            DataSet ds = new DataSet();
            DataTable dt = new DataTable();
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            da.SelectCommand.Connection = con;
            da.Fill(dt);
            con.Close();

            List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
            Dictionary<string, object> row = null;
            foreach (DataRow rs in dt.Rows)
            {
                row = new Dictionary<string, object>();
                foreach (DataColumn col in dt.Columns)
                {
                    row.Add(col.ColumnName, rs[col]);
                }
                rows.Add(row);
            }
            return serializer.Serialize(rows);
        }     

        public string errmsg(Exception ex)
        {
            return "[['ERROR','" + ex.Message + "']]";
        }