首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

遍历数据库出现错误

2013-07-01 
遍历数据库出现异常请问一下各位高手,小弟写了一个段遍历数据库的代码:string path @D:\a.txtFileStr

遍历数据库出现异常
请问一下各位高手,小弟写了一个段遍历数据库的代码:

 
            string path = @"D:\a.txt";
            FileStream f = new FileStream(path, FileMode.Open);
            StreamWriter sw = new StreamWriter(f,Encoding.UTF8);
            DateTime t = System.DateTime.Now;
            string strConnection = "Data Source=221.208.168.124;User ID=sa;Password=sa@123456";
            SqlConnection sqlConnetion = new SqlConnection(strConnection);
            string strDbas = "SELECT Name FROM Master..SysDatabases ORDER BY Name";
            SqlDataAdapter adpterDtbase = new SqlDataAdapter(strDbas, strConnection);
            DataTable dtbase = new DataTable();
            adpterDtbase.Fill(dtbase);
            sqlConnetion.Close();
            try
            {
                sw.WriteLine("一共有" + dtbase.Rows.Count.ToString() + "数据库 ");
                for (int u = 0; u < dtbase.Rows.Count; u++)
                {
                    string sql = "Data Source=221.208.168.124;Initial Catalog=" + dtbase.Rows[u][0].ToString() + ";User ID=sa;Password=sa@123456";
                    SqlConnection conn = new SqlConnection(sql);
                    sw.WriteLine("数据库的名称为" + dtbase.Rows[u][0].ToString());
                    string strSql = "SELECT Name FROM " + dtbase.Rows[u][0].ToString() + "..SysObjects ORDER BY Name";
                    SqlDataAdapter adpterDt = new SqlDataAdapter(strSql, conn);
                    DataTable dt = new DataTable();
                    adpterDt.Fill(dt);
                    try
                    {
                        sw.WriteLine("一共有" + dt.Rows.Count.ToString() );


                        for (int i = 0; i < dt.Rows.Count; i++)
                        {
                            sw.WriteLine("表的名称为" + dt.Rows[i][0].ToString() );
                            //string strSql1 = "SELECT Name FROM SysColumns WHERE id=Object_Id('" + dt.Rows[i][0].ToString() + "')";
                            string sqlTable = "select c.name as colna, t.name as typena, c.length as lenna from syscolumns c "
                            + "inner join sysobjects o on c.id = o.id and o.xtype = 'u' inner join systypes t on c.xtype = t.xtype "
                            + "where o.name = '" + dt.Rows[i][0].ToString() + "'";
                            SqlDataAdapter adp2 = new SqlDataAdapter(sqlTable, conn);
                            DataTable dt1 = new DataTable();
                            try
                            {
                                adp2.Fill(dt1);
                                sw.WriteLine("一共有" + dt1.Rows.Count.ToString() + "列");
                                sw.WriteLine("列名" + "         " + "字段类型" + "         " + "字段长度");
                                for (int j = 0; j < dt1.Rows.Count; j++)
                                {


                                    sw.WriteLine(dt1.Rows[j][0].ToString() + "         " + dt1.Rows[j][1].ToString() + "         " + dt1.Rows[j][2].ToString());
                                    Console.Clear();
                                    Console.WriteLine(System.DateTime.Now.ToLocalTime());
                                }
                                sw.WriteLine();
                                sw.WriteLine();
                                conn.Close();
                            }
                            catch (Exception ex1)
                            {
                                sw.WriteLine(ex1.Message);
                                Console.WriteLine(ex1.Message);
                            }

                        }
                        sw.WriteLine();
                        sw.WriteLine();
                    }
                    catch (Exception ex)
                    {
                        sw.WriteLine(ex.Message);


                        Console.WriteLine(ex.Message);
                    }
                }
            }
            catch (Exception ex2)
            {
                sw.WriteLine(ex2.Message);
                Console.WriteLine(ex2.Message);
            }
            finally
            {
                DateTime ed = System.DateTime.Now;
                TimeSpan timeout = ed - t;
                sw.WriteLine("用时:   " + timeout.TotalSeconds.ToString()+"秒");
                sw.Close();
                f.Close();
                Console.WriteLine(timeout.TotalSeconds.ToString() + "秒");
            }


出现了想要的结果,但同事有在SQL Server Management Studio管理器中看不到的数据库和数据表,而且看不到的数据表,只有表明没有数据列
[解决办法]
应该不是异常数据。
比如【SELECT Name FROM Master..SysDatabases ORDER BY Name】
应该鬼查出以下多出的db(除了你建立的db外)
master——所有系统级信息。比如账号,密码,其他数据库的名称等等。
model——model 数据库用作在 SQL Server 实例上创建的所有数据库的模板
msdb——msdb 数据库由 SQL Server 代理用于计划警报和作业
tempdb——tempdb 系统数据库是一个全局资源
以下的就不列出了。。
这个应该是sql数据库的问题。。不是。net的。
你应有安装sql的。查下在线帮助,里面的解释很全的。
[解决办法]
strSql = "SELECT Name FROM " + dtbase.Rows[u][0].ToString() + "..SysObjects ORDER BY Name";

name包括所有对象,用户表,系统表,视图,过程,函数,约束等,所以要遍历表,要加条件,
:用户表(xtype='U'),系统表(xtype='s')

strSql = "SELECT Name FROM " + dtbase.Rows[u][0].ToString() + "..SysObjects where xtype='u' ORDER BY Name ";

 

热点排行