关于C#中ADO.NET数据库操作的一些技巧代码

20 篇文章 0 订阅
18 篇文章 0 订阅
  在使用C#的ADO.NET的创建MSSQL连接对象,我们通常是用来组合连接字符串,然后通过这个字符串来创建一个连接对象,而我在做老师布置的项目时,就有一个想法,如果说由程序员来组合字符串,并将连接字符串写到程序源代码中,虽然能够解决数据库能否成功连接的问题,但程序一但编译,用户将无法更改数据库服务器的配置,将来如果要维护数据库,就变得非常的麻烦,我想这时会有人说,制作一个数据库的配置文件不就得了!不错,制作配置文件的确是一个解决的途径,但我想,仅仅写一个配置文件只是解决了问题的一个方面,作为我们程序员,我的理解是客户至上,程序要易用,也就是说,用户能够根据自己的需要来配置相应的数据库配置信息,而配置信息的过程要人性化,可视化,而配置文件在正常情况下,只能通过应用程序的相关程序来创建、更改或删除。

    为了解决这些问题,我们势必要遇见一些与数据库服务相关的方法,我几天前在一个IT论坛看到这些方法的相关代码,觉得写的非常好,所以在这里拿出来与大家分享:

一、取得数据库服务器列表:

public ArrayList GetServerList() 

     ArrayList alServers = new ArrayList() ; 
     SQLDMO.Application sqlApp = new SQLDMO.ApplicationClass() ; 
     try 
     { 
          SQLDMO.NameList serverList = sqlApp.ListAvailableSQLServers() ; 
          for(int i = 1;i<= serverList.Count;i++) 
          { 
               alServers.Add(serverList.Item(i)) ; 
          } 
     } 
     catch(Exception e) 
     { 
          throw(new Exception("取数据库服务器列表出错:"+e.Message)) ; 
     } 
     finally 
     { 
          sqlApp.Quit() ; 
     } 
     return alServers ; 
}

二、取得指定数据库服务器的数据库列表:

public ArrayList GetDbList(string strServerName,string strUserName,string strPwd) 

     ServerName = strServerName ; 
     UserName = strUserName ; 
     Password = strPwd ; 

     ArrayList alDbs = new ArrayList() ; 
     SQLDMO.Application sqlApp = new SQLDMO.ApplicationClass() ; 
     SQLDMO.SQLServer svr = new SQLDMO.SQLServerClass() ; 
     try 
     { 
          svr.Connect(ServerName,UserName,Password) ; 
          foreach(SQLDMO.Database db in svr.Databases) 
          { 
               if(db.Name!=null) 
               alDbs.Add(db.Name) ; 
          } 
     } 
     catch(Exception e) 
     { 
          throw(new Exception("连接数据库出错:"+e.Message)) ; 
     } 
     finally 
     { 
          svr.DisConnect() ; 
          sqlApp.Quit() ; 
     } 
     return alDbs ; 

三、数据库的备份和实时进度显示代码:

public bool BackUPDB(string strDbName,string strFileName, ProgressBar pgbMain) 

     PBar = pgbMain ; 
     SQLDMO.SQLServer svr = new SQLDMO.SQLServerClass() ; 
     try 
     { 
          svr.Connect(ServerName,UserName,Password) ; 
          SQLDMO.Backup bak = new SQLDMO.BackupClass(); 
          bak.Action = 0 ; 
          bak.Initialize = true ; 
          SQLDMO.BackupSink_PercentCompleteEventHandlerpceh  = 
                              new SQLDMO.BackupSink_PercentCompleteEventHandler(Step); 
          bak.PercentComplete += pceh; 

          bak.Files = strFileName; 
          bak.Database = strDbName; 
          bak.SQLBackup(svr); 
          return true ; 
     }      
     catch(Exception err) 
     { 
          throw(new Exception("备份数据库失败"+err.Message)) ; 
     } 
     finally 
     {      
          svr.DisConnect() ; 
     } 

private void Step(string message,int percent) 

      PBar.Value = percent ; 
}

在上面的代码中,这两个语句实现了进度的实时显示

SQLDMO.BackupSink_PercentCompleteEventHandler pceh =
                       new SQLDMO.BackupSink_PercentCompleteEventHandler(Step); 
bak.PercentComplete += pceh; 

 Step就是上面private void Step(string message,int percent) 的方法名称,它用来显示进度条的当前进度。 

四、数据库的恢复和杀死进程的代码:

public bool RestoreDB(string strDbName,string strFileName, ProgressBar pgbMain) 

      PBar = pgbMain ; 
      SQLDMO.SQLServer svr = new SQLDMO.SQLServerClass() ; 
      try 
      { 
          svr.Connect(ServerName,UserName,Password) ; 
          SQLDMO.QueryResults qr = svr.EnumProcesses(-1) ; 
          int iColPIDNum = -1 ; 
          int iColDbName = -1 ; 
          for(int i=1;i<=qr.Columns;i++) 
          { 
              string strName = qr.get_ColumnName(i) ; 
              if (strName.ToUpper().Trim() == "SPID") 
              { 
                  iColPIDNum = i ; 
              } 
              else if (strName.ToUpper().Trim() == "DBNAME") 
              { 
                  iColDbName = i ; 
              } 
              if (iColPIDNum != -1 && iColDbName != -1) 
                  break ; 
          } 

          for(int i=1;i<=qr.Rows;i++) 
          { 
              int lPID = qr.GetColumnLong(i,iColPIDNum) ; 
              string strDBName = qr.GetColumnString(i,iColDbName) ; 
              if (strDBName.ToUpper() == strDbName.ToUpper()) 
                  svr.KillProcess(lPID) ; 
          } 

          SQLDMO.Restore res = new SQLDMO.RestoreClass() ; 
          res.Action = 0 ; 
          SQLDMO.RestoreSink_PercentCompleteEventHandler  pceh= 
                     new  SQLDMO.RestoreSink_PercentCompleteEventHandler(Step); 
          res.PercentComplete += pceh; 
          res.Files = strFileName ; 

          res.Database = strDbName ; 
          res.ReplaceDatabase = true ; 
          res.SQLRestore(svr) ; 
          return true ; 
   } 
   catch(Exception err) 
   { 
          throw(new Exception("恢复数据库失败,请关闭所有和该数据库连接的程序!"+err.Message)) ; 
   } 
   finally 
   { 
       svr.DisConnect() ; 
   } 

其中这个语句取得了所有的进程列表:

SQLDMO.QueryResults qr = svr.EnumProcesses(-1) ; 

下面的语句找到和要恢复数据库相关的进程并杀死

int iColPIDNum = -1 ; 
int iColDbName = -1 ; 
for(int i=1;i<=qr.Columns;i++) 

      string strName = qr.get_ColumnName(i) ; 
      if (strName.ToUpper().Trim() == "SPID") 
      { 
         iColPIDNum = i ; 
      } 
      else if (strName.ToUpper().Trim() == "DBNAME") 
      { 
         iColDbName = i ; 
      } 
      if (iColPIDNum != -1 && iColDbName != -1) 
                  break ; 

for(int i=1;i<=qr.Rows;i++) 

      int lPID = qr.GetColumnLong(i,iColPIDNum) ; 
      string strDBName = qr.GetColumnString(i,iColDbName) ; 
      if (strDBName.ToUpper() == strDbName.ToUpper()) 
      svr.KillProcess(lPID) ; 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值