【问题标题】:Additional information: Data source is an invalid type. It must be either an IListSource, IEnumerable, or IDataSource附加信息:数据源是无效类型。它必须是 IListSource、IEnumerable 或 IDataSource
【发布时间】:2016-08-30 05:40:36
【问题描述】:

我正在尝试根据 CustomerID 从数据库中检索和显示用户数据。执行时出现上述错误。
这是我显示数据的代码。

protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            int customerID = Convert.ToInt32(Session["CustomerID"]);
            MyProfileGridView.DataSource = CustomerBL.GetCustomer(customerID);
            MyProfileGridView.DataBind(); 
        }
    }

获取客户方法代码:

public static Customer GetCustomer(int customerID)
    {
        Customer customer = new Customer();

        string query = "SELECT * FROM [Customers] WHERE [CustomerID] = @CustomerID";
        SqlCommand cmd = new SqlCommand(query);
        cmd.Parameters.AddWithValue("@CustomerID", SqlDbType.Text).Value = customerID;

        DataTable dt = DbUtility.GetRecordsInDataTable(cmd);
        if (dt.Rows.Count > 0)
        {
            customer.CustomerID = Convert.ToInt32(dt.Rows[0]["CustomerID"]);
            customer.LoginID = dt.Rows[0]["LoginID"].ToString();
            customer.Password = dt.Rows[0]["Password"].ToString();
            customer.CustomerName = dt.Rows[0]["CustomerName"].ToString();
            customer.ShopName = dt.Rows[0]["ShopName"].ToString();
            customer.Address = dt.Rows[0]["Address"].ToString();
            customer.Mobile1 = dt.Rows[0]["Mobile1"].ToString();
            customer.Mobile2 = dt.Rows[0]["Mobile2"].ToString();
            customer.ReferenceNumber = dt.Rows[0]["ReferenceNumber"].ToString();
            customer.SignUpDate = Convert.ToDateTime(dt.Rows[0]["SignUpDate"]);
            customer.Enabled = Convert.ToBoolean(dt.Rows[0]["Enabled"]);
            return customer;
        }
        else
        {
            return null;
        }

    }

用户注册页面代码:

protected void Page_Load(object sender, EventArgs e)
    {
        int customerID;

        if (!Page.IsPostBack)
        {
            if (Request.QueryString["CustomerID"] != null)
            {

                customerID = Convert.ToInt32(Request.QueryString["CustomerID"]);

                Customer customer = CustomerBL.GetCustomer(customerID);

                if (customer != null)
                {
                    LoginIdLabel.Text = customer.LoginID;
                    PasswordLabel.Text = customer.Password;
                }
            }

        }
    }

错误 8 无法将类型 'System.Collections.Generic.List' 隐式转换为 '******.Entities.Customer' C:\Users*** **\桌面\新文件夹*******\UserSignUpSuccess.aspx.cs 25 41 ******

请帮我解决这个问题

【问题讨论】:

  • 看过这些类似的 SO 问题 herehere
  • 如果您在需要集合或IEnumerable 时尝试绑定到单个对象,则会产生这样的错误。请查看前面提到的问题的答案。

标签: c# sql asp.net


【解决方案1】:

由于错误很清楚,您需要将List<Customer> 分配给DataSourceDataSource 不能与 single object 一起分配。

你需要从GetCustomer方法返回List<Customer>并赋值给DataSource

public static List<Customer> GetCustomer(int customerID)
{
    Customer customer = new Customer();
    List<Customer> list = new List<Customer>();
    string query = "SELECT * FROM [Customers] WHERE [CustomerID] = @CustomerID";
    SqlCommand cmd = new SqlCommand(query);
    cmd.Parameters.AddWithValue("@CustomerID", SqlDbType.Text).Value = customerID;

    DataTable dt = DbUtility.GetRecordsInDataTable(cmd);
    if (dt.Rows.Count > 0)
    {
        customer.CustomerID = Convert.ToInt32(dt.Rows[0]["CustomerID"]);
        customer.LoginID = dt.Rows[0]["LoginID"].ToString();
        customer.Password = dt.Rows[0]["Password"].ToString();
        customer.CustomerName = dt.Rows[0]["CustomerName"].ToString();
        customer.ShopName = dt.Rows[0]["ShopName"].ToString();
        customer.Address = dt.Rows[0]["Address"].ToString();
        customer.Mobile1 = dt.Rows[0]["Mobile1"].ToString();
        customer.Mobile2 = dt.Rows[0]["Mobile2"].ToString();
        customer.ReferenceNumber = dt.Rows[0]["ReferenceNumber"].ToString();
        customer.SignUpDate = Convert.ToDateTime(dt.Rows[0]["SignUpDate"]);
        customer.Enabled = Convert.ToBoolean(dt.Rows[0]["Enabled"]);
        list.Add(customer);            
        return list;
    }
    else
    {
        return null;
    }

}

您的 GetCustomer 方法返回 List`,因此您需要从列表中获取对象以访问其属性。

Customer customer = CustomerBL.GetCustomer(customerID).FirstOrDefault();

【讨论】:

  • 我收到此错误。错误 8 无法将类型 'System.Collections.Generic.List' 隐式转换为 '******.Entities.Customer' C:\Users*****\桌面\新建文件夹********\UserSignUpSuccess.aspx.cs 25 41 ******
  • 你没有改变方法的返回类型应该是public static List&lt;Customer&gt; GetCustomer(int customerID)
  • 非常感谢。像冠军一样工作。
【解决方案2】:

问题是您将一个且唯一的Customer 对象插入到请求List 类型数据源的GridView 组件。顺便说一句,如果您想将该客户对象添加到该GridView,您可以尝试返回一个列表,

    public static List<Customer> GetCustomer(int customerID)
        {
            List<Customer> CusList = new List<Customer>();
            Customer customer = new Customer();
            .... // Before returning,
            CusList.Add(customer);
            return CusList;
        }

【讨论】:

    猜你喜欢
    • 2017-04-25
    • 2011-04-25
    • 1970-01-01
    • 2017-02-04
    • 1970-01-01
    相关资源
    最近更新 更多