积极答复者
合并DataTable时类型不一致时该如何处理?

问题
-
如题:
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; }
- 已移动 Sheng Jiang 蒋晟Moderator 2009年11月25日 20:39 System.Data问题 (发件人:Visual C#)
答案
-
你好!
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; }
知识改变命运,奋斗成就人生!- 已标记为答案 .net小痞子 2009年11月26日 2:24
全部回复
-
你好!
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; }
知识改变命运,奋斗成就人生!- 已标记为答案 .net小痞子 2009年11月26日 2:24
-
终于干掉这个错误了,谢谢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