【问题标题】:LinqToSql query to datatable invalid cast exceptionLinq To Sql 查询到数据表 invalidcastexception
【发布时间】:2019-06-08 02:50:13
【问题描述】:

您好,这是一个创建 DataTables 的 linqtosql 查询:

private void GetStock()
    {
        using (DataClasses1DataContext dc = new DataClasses1DataContext())
        {

            #region ARTICLES
            DataTable dt = new DataTable("FICHES_ARTICLES");
            var article = from a in dc.FICHES_ARTICLES
                      where a.ART_SITE == 7
                      select new
                      {
                          a.ART_CODE,
                          a.ART_SITE,
                          a.ART_LIBELLE1,
                          a.ART_LIBELLE2,
                          a.ART_SIGNEQ,
                          a.ART_EAN13,
                          a.ART_DLUO,
                          a.ART_RESSUAGE,
                          a.EMB_CODE
                      };
            DataColumn dc1 = dt.Columns.Add("ART_CODE", typeof(string));
            DataColumn dc2 = dt.Columns.Add("ART_SITE", typeof(int));
            DataColumn dc3 = dt.Columns.Add("ART_LIBELLE1", typeof(string));
            DataColumn dc4 = dt.Columns.Add("ART_LIBELLE2", typeof(string));
            DataColumn dc5 = dt.Columns.Add("ART_SIGNEQ", typeof(string));
            DataColumn dc6 = dt.Columns.Add("ART_EAN13", typeof(string));
            DataColumn dc7 = dt.Columns.Add("ART_DLUO", typeof(int));
            DataColumn dc8 = dt.Columns.Add("ART_RESSUAGE", typeof(double));
            DataColumn dc9 = dt.Columns.Add("EMB_CODE", typeof(string));
            DataRow dw;
            foreach (var item in article)
            {
                dw = dt.NewRow();
                dw["ART_CODE"] = item.ART_CODE;
                dw["ART_SITE"] = item.ART_SITE;
                dw["ART_LIBELLE1"] = item.ART_LIBELLE1;
                dw["ART_LIBELLE2"] = item.ART_LIBELLE2;
                dw["ART_SIGNEQ"] = item.ART_SIGNEQ;
                dw["ART_EAN13"] = item.ART_EAN13;
                dw["ART_DLUO"] = item.ART_DLUO;
                dw["ART_RESSUAGE"] = item.ART_RESSUAGE;
                dw["EMB_CODE"] = item.EMB_CODE;
                dt.Rows.Add(dw);
            }
            #endregion

            #region ART_PARAM
            DataTable dt1 = new DataTable("ART_PARAM");
            var param = from p in dc.FICHES_ARTICLES
                        where p.ART_SITE == 7
                        orderby p.ART_LIBELLE1
                        select new
                        {
                            p.ART_CODE,
                            p.ART_SITE,
                            p.ART_LIBELLE1
                        };
            DataColumn dc10 = dt1.Columns.Add("ART_CODE", typeof(string));
            DataColumn dc11 = dt1.Columns.Add("ART_SITE", typeof(int));
            DataColumn dc12 = dt1.Columns.Add("ART_LIBELLE1", typeof(string));
            DataRow dw1;
            foreach (var c in param)
            {
                dw1 = dt1.NewRow();
                dw1["ART_CODE"] = c.ART_CODE;
                dw1["ART_SITE"] = c.ART_SITE;
                dw1["ART_LIBELLE1"] = c.ART_LIBELLE1;
                dt1.Rows.Add(dw1);
            }
            #endregion

            #region ENTREES_STOCKS
            DataTable dt2 = new DataTable("ENTREES_STOCKS");

            var ent = from e in dc.ENTREES_STOCKS
                      select new
                      {
                          e.ID,
                          e.ART_CODE,
                          e.ENTSTK_DTENTREE,
                          e.ENTSTK_PICKING,
                          e.ENTSTK_LOT,
                          e.ENTSTK_PNET,
                          e.ENTSTK_NBU,
                          e.ENTSTK_DATE_DEM,
                          e.ENTSTK_USER
                      };
            DataColumn dc13 = dt2.Columns.Add("ID", typeof(int));
            DataColumn dc14 = dt2.Columns.Add("ART_CODE", typeof(string));
            DataColumn dc15 = dt2.Columns.Add("ENTSTK_DTENTREE", typeof(DateTime));
            DataColumn dc16 = dt2.Columns.Add("ENTSTK_PICKING", typeof(string));
            DataColumn dc17 = dt2.Columns.Add("ENTSTK_LOT", typeof(int));
            DataColumn dc18 = dt2.Columns.Add("ENTSTK_PNET", typeof(float));
            DataColumn dc19 = dt2.Columns.Add("ENTSTK_NBU", typeof(int));
            DataColumn dc20 = dt2.Columns.Add("ENTSTK_DATE_DEM", typeof(DateTime));
            DataColumn dc21 = dt2.Columns.Add("ENTSTK_USER", typeof(string));
            DataRow dw2;
            foreach (var c in ent)
            {
                dw2 = dt2.NewRow();
                dw2["ID"] = c.ID;
                dw2["ART_CODE"] = c.ART_CODE;
                dw2["ENTSTK_DTENTREE"] = c.ENTSTK_DTENTREE;
                dw2["ENTSTK_PICKING"] = c.ENTSTK_PICKING;
                dw2["ENTSTK_LOT"] = c.ENTSTK_LOT;
                dw2["ENTSTK_PNET"] = c.ENTSTK_PNET;
                dw2["ENTSTK_NBU"] = c.ENTSTK_NBU;
                //dw2["ENTSTK_DATE_DEM"] = c.ENTSTK_DATE_DEM;
                if (dw2["ENTSTK_DATE_DEM"] != DBNull.Value)
                {
                    dw2["ENTSTK_DATE_DEM"] = c.ENTSTK_DATE_DEM;
                }
                dw2["ENTSTK_USER"] = c.ENTSTK_USER;
                dt2.Rows.Add(dw2);
            }
            #endregion

            #region DataSet
            DataSet ds = new DataSet();
            ds.Tables.Add(dt);
            ds.Tables.Add(dt1);
            ds.Tables.Add(dt2);
            #endregion

            #region Create Crystal Report
            string reportPath = DocNameTB.Text;
            ReportDocument cr = new ReportDocument();
            cr.Load(reportPath);
            cr.SetDataSource(ds);
            Cr_Viewer.ViewerCore.ReportSource = cr;
            #endregion

        }
    }

在第一个区域“ARTICLES”中,我遇到了一个错误 “foreach(var item in article)”:无效的强制转换异常 我不(不明白为什么?? 问题是这段代码对于其他所有区域都是相似的(并且可以完美运行)......

谢谢你帮助我。

【问题讨论】:

  • 哪一行正是失败了;请注意,调试器并不总是准确的 - 例如,它是 dw["ART_CODE"] = item.ART_CODE; 吗?但更根本的是:为什么您将非常好的类推入数据表中? (好奇的人很想知道......)
  • 我建议注释掉除循环内第一个之外的所有值分配。然后运行它。如果它有效,则将下一行返回到代码中,然后重试....直到找到实际上导致错误数据类型的行
  • ART_SITE 是字符串的数字吗?我认为这一行是问题所在: where a.ART_SITE == 7
  • @jdweng 如果它是一个字符串,那么 OP 会得到一个编译错误,而不是异常的运行时错误
  • 没有。编译不知道数据表列中的类型。

标签: c# linq-to-sql


【解决方案1】:

您可能需要考虑使用扩展方法来自动执行此操作,这也将消除(数据)输入问题:

public static IEnumerableExt {
    public static List<MemberInfo> GetPropertiesOrFields(this Type t, BindingFlags bf = BindingFlags.Public | BindingFlags.Instance) =>
        t.GetMembers(bf).Where(mi => mi.MemberType == MemberTypes.Field || mi.MemberType == MemberTypes.Property).ToList();

    public static DataTable ToDataTable<T>(this IEnumerable<T> rows) {
        var dt = new DataTable();
        if (rows.Any()) {
            var memberInfos = typeof(T).GetPropertiesOrFields();
            foreach (var info in memberInfos)
                dt.Columns.Add(new DataColumn(info.Name, info.GetMemberType()));

            foreach (var r in rows)
                dt.Rows.Add(memberInfos.Select(i => i.GetValue(r)).ToArray());
        }
        return dt;
    }
}

【讨论】:

    猜你喜欢
    • 2015-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多