Office编程(二)C#读取Excel并存入数据库,通过XML自定义表名,是否重建并插入数据...

在之前操作了EXCEL存入数据库之后,我发现存在好多问题,这次加以改进。

本次主要进行的工作有:

1,创建一个XML文件,主要在里面定义数据库表名,是否重建表,excel文件路径,是否导入该文件。

2,操作该XML读取信息并根据属性值创建数据库表,插入数据等。

XML文件如下:

<?xml version="1.0" encoding="utf-8" ?>
<Files>
  <File Finished="false">
    <TableName  IsExist="false">
      Interments
    </TableName>
    <Path>
      C:\\projects\\CMS\\UserData\\CemeCare_Excel\\Interment Records (through 8-1-2009).xls
    </Path>
  </File>
  <File Finished="false">
    <TableName  IsExist="false">
      Plots
    </TableName>
    <Path>
      C:\\projects\\CMS\\UserData\\CemeCare_Excel\\PLOT FILES (Sections 1 - 99).xls
    </Path>
  </File>

</Files>

 

有了这个XML,我们就可以自由定位xls数据文件位置,并可以自己给表设定名字。对于多个excel插入一个表的情况,则只需指定IsExist="false"即可。

相关代码如下:

 

ExpandedBlockStart.gif 代码

        
static   void  Main( string [] args)
        {
            XmlDocument doc 
=   new  XmlDocument();
            
string  xmlFile  =   " ImportFiles.xml " ;
            doc.Load(xmlFile);

            XmlNode node 
=  doc.SelectSingleNode( " Files " );

            
foreach  (XmlNode xn  in  node.ChildNodes)
            {
                
if  (xn.Attributes[ " Finished " ].Value.ToString().ToLower()  ==   " false " )
                {
                    XmlNode tableNode 
=  xn.FirstChild;
                    XmlNode pathNode 
=  xn.LastChild;
                    
string  tableName  =  tableNode.InnerText.Trim();
                    
string  path  =  pathNode.InnerText.Trim();

                    
string  fileName  =  System.IO.Path.GetFullPath(path);
                    DataSet ds 
=  ImportExcel(fileName);

                    
if  (tableNode.Attributes[ " IsExist " ].Value  ==   " false " )
                    {
                        CreateTable(tableName, ds.Tables[
0 ]);
                    }
                    ToDataBase(ds, tableName);
                }
            }
            Console.WriteLine(
" Finished " );
            Console.ReadLine();
        }

        
private   static   void  CreateTable( string  tableName, DataTable dt)
        {
            
string  sql  =   " IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[ "   +  tableName  +   " ]') AND type in (N'U')) "
                         
+   "    DROP TABLE [dbo].[ "   +  tableName  +   " ] "
                         
+   "    " ;
            Microsoft.ApplicationBlocks.Data.SqlHelper.ExecuteNonQuery(
" server=local;database=TestData;uid=sa;pwd=; " , CommandType.Text, sql);

            
string  sqlCreate  =   @" CREATE TABLE [dbo].[ "   +  tableName  +   " ]( " ;
            
for  ( int  i  =   0 ; i  <  dt.Columns.Count; i ++ )
            {
                sqlCreate 
=  sqlCreate  +   " [ " + dt.Columns[i].ColumnName  +   " "   +   " nvarchar(255) null " ;
                
if  (i  !=  dt.Columns.Count  -   1 )
                {
                    sqlCreate 
=  sqlCreate  +   " , " ;
                }
            }
            sqlCreate 
=  sqlCreate  +   "  ) ON [PRIMARY] " ;
            Microsoft.ApplicationBlocks.Data.SqlHelper.ExecuteNonQuery(
" server=local;database=TestData;uid=sa;pwd=; " , CommandType.Text, sqlCreate);
        }

 

 

关于数据访问我就没有细写,大家可以根据自己的数据访问层情况自由改动就可以了。本文没什么技术含量,但真的对我的DataMigration帮助很大,使转移过程更自动化并且可配置,并且这是真实的应用。欢迎筒子们拍砖。

 

另有一个问题,也就是因为这个问题才导致的这些代码的出现:大家在使用sqlserver的import data时有没有出现这样一种状况---某列数据大多是(特别是前100行)数字,但是后来有些是数字+字符,这样在import结束后,那些带字符的数据就变成null了,并且系统自动认为该列是数字型。这个问题困扰我很久,到现在也没能解决。

转载于:https://www.cnblogs.com/GodSpeed/archive/2009/12/17/1626626.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值