none
合并DataTable时类型不一致时该如何处理? RRS feed

  • 问题

  • 如题:

    private DataTable fSampleDataTable(string FilePath)
            {                              
                string connection = "Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = "+FilePath+";Extended Properties=Excel 8.0";
                OleDbConnection thisconnection = new OleDbConnection(connection);                     
                thisconnection.Open();
                DataTable schemaTable = thisconnection.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, null);
                DataTable MyNewTable = new DataTable();
                for(int i=0;i<schemaTable.Rows.Count;i++)
                {
                    //string table = schemaTable.Rows[1][2].ToString().Trim();//获取Excel的表名,默认值是sheet1
                    string table = schemaTable.Rows[i][2].ToString().Trim();
                    string command = "select * from [" + table + "]";
                    OleDbDataAdapter adapter = new OleDbDataAdapter(command, thisconnection);
                    DataSet ds = new DataSet();
                    adapter.Fill(ds,table);
                    thisconnection.Close();
                    //DataTable MyNewTable = new DataTable();
                    foreach (DataRow Row in ds.Tables[table].Rows)
                    {
                        if (Row[0].ToString().Trim().StartsWith("7"))
                        {                  
                                MyNewTable.Merge(MyGetTableMethod("t_StoreAndSale", Row[0].ToString().Trim()));
                        }
                        else//问题所在:这咋整咯``?
                        {
                            MyNewTable.Merge(MyGetTableMethod("t_AI", Row[0].ToString().Trim()));
                        }
                    }
                }
                    return MyNewTable;              
            }
     
    
    2009年11月25日 7:51

答案

  • 你好!

    MyNewTable 你并未对其进行结构初始,且你要确保再两个 if 中返回的结构都一样。


    private DataTable fSampleDataTable(string FilePath)
    {
        string connection = "Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = " + FilePath + ";Extended Properties=Excel 8.0";
        OleDbConnection thisconnection = new OleDbConnection(connection);
        thisconnection.Open();
        DataTable schemaTable = thisconnection.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, null);
        DataTable MyNewTable = null;
        for (int i = 0; i < schemaTable.Rows.Count; i++)
        {
            
            string table = schemaTable.Rows[i][2].ToString().Trim();
            string command = "select * from [" + table + "]";
            OleDbDataAdapter adapter = new OleDbDataAdapter(command, thisconnection);
            DataSet ds = new DataSet();
            adapter.Fill(ds, table);
            thisconnection.Close();
            
            foreach (DataRow Row in ds.Tables[table].Rows)
            {
                if (Row[0].ToString().Trim().StartsWith("7"))
                {
                    if (MyNewTable == null)
                        MyNewTable = MyGetTableMethod("t_StoreAndSale", Row[0].ToString().Trim());
                    else
                        MyNewTable.Merge(MyGetTableMethod("t_StoreAndSale", Row[0].ToString().Trim()));
                }
                else//问题所在:这咋整咯``?
                {
                    if (MyNewTable == null)
                        MyNewTable = MyGetTableMethod("t_AI", Row[0].ToString().Trim());
                    else
                        MyNewTable.Merge(MyGetTableMethod("t_AI", Row[0].ToString().Trim()));
                }
            }
        }
        return MyNewTable;
    }



    知识改变命运,奋斗成就人生!
    2009年11月25日 8:14
    版主
  • 名字相同的列,可能数据类型不同,导致了这个问题,你检查一下存储过程中相应字段的类型是否相同!
    周雪峰
    2009年11月25日 16:29
    版主

全部回复

  • 你好!
         可以使用这个方法:
    http://msdn.microsoft.com/zh-cn/library/wtk78t63%28VS.80%29.aspx
         可以指定缺失架构的情况下如何处理!
    周雪峰
    2009年11月25日 8:01
    版主
  • 周版主,你的MSN似乎在渡假中……-__-
    2009年11月25日 8:03
  • 你好!

    MyNewTable 你并未对其进行结构初始,且你要确保再两个 if 中返回的结构都一样。


    private DataTable fSampleDataTable(string FilePath)
    {
        string connection = "Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = " + FilePath + ";Extended Properties=Excel 8.0";
        OleDbConnection thisconnection = new OleDbConnection(connection);
        thisconnection.Open();
        DataTable schemaTable = thisconnection.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, null);
        DataTable MyNewTable = null;
        for (int i = 0; i < schemaTable.Rows.Count; i++)
        {
            
            string table = schemaTable.Rows[i][2].ToString().Trim();
            string command = "select * from [" + table + "]";
            OleDbDataAdapter adapter = new OleDbDataAdapter(command, thisconnection);
            DataSet ds = new DataSet();
            adapter.Fill(ds, table);
            thisconnection.Close();
            
            foreach (DataRow Row in ds.Tables[table].Rows)
            {
                if (Row[0].ToString().Trim().StartsWith("7"))
                {
                    if (MyNewTable == null)
                        MyNewTable = MyGetTableMethod("t_StoreAndSale", Row[0].ToString().Trim());
                    else
                        MyNewTable.Merge(MyGetTableMethod("t_StoreAndSale", Row[0].ToString().Trim()));
                }
                else//问题所在:这咋整咯``?
                {
                    if (MyNewTable == null)
                        MyNewTable = MyGetTableMethod("t_AI", Row[0].ToString().Trim());
                    else
                        MyNewTable.Merge(MyGetTableMethod("t_AI", Row[0].ToString().Trim()));
                }
            }
        }
        return MyNewTable;
    }



    知识改变命运,奋斗成就人生!
    2009年11月25日 8:14
    版主
  • 不好意思啊!
    最近事情太多了,实在没有时间登陆啊!
    周雪峰
    2009年11月25日 8:15
    版主
  • 还是不行……还是DataType类型错误……是不是从数据库里导出来的数据到C#界面会不同?
    2009年11月25日 15:41
  • 名字相同的列,可能数据类型不同,导致了这个问题,你检查一下存储过程中相应字段的类型是否相同!
    周雪峰
    2009年11月25日 16:29
    版主
  • 终于干掉这个错误了,谢谢XXY版主和周版主的指导,深夜都在为偶支招,谢谢你们……偶就不说您们了,免得把你们说老了
    -__-
    总是就在于[装配结存]这一列,第一个存储过程是转化为decimal(8,0)精度为8了,而第二个存储过程就直接为0,类型不一致,统统改掉
    ,再次谢谢二位版主指点
    -->第一个存储过程“t_StoreAndSale”
    CREATE procedure t_StoreAndSale
    @FFullNumber varchar(8000)
    as
    select [物料编码]=t3.FNumber,
    [型号]=t3.包成规格,
    [伴音/品牌]=t3.成品规格,
    [PCB板库存]='',
    [PCB板可用量]='',
    [装配结存]=case when t7.FQty is null then 0 else cast(t7.FQty as decimal(8,0)) end
    from   xxx
    
    
    -->第二个存储过程“t_AI”
    select a.物料编码,[型号]='',[伴音/品牌]='',[PCB板库存]='',[PCB板可用量]='',[装配结存]=0
    from xxx
    
    2009年11月26日 2:19
  • 不客气啊!
    问题终于解决了,太好了,恭喜啊!
    周雪峰
    2009年11月26日 3:34
    版主
  • 谢谢版主指点哈
    2009年11月27日 9:01