程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#發現之旅第三講 使用C#開發基於XSLT的代碼生成器(1)(9)

C#發現之旅第三講 使用C#開發基於XSLT的代碼生成器(1)(9)

編輯:關於C語言

LoadFromSQLServer 函數用於分析一個MSSQLServer數據庫,加載其表和字段設計信息。其代碼如下。在 SQLSERVER中包含了一些系統表,比如SysObjects,SysColumns等等,裡面就存儲了系統中所 有對象的信息,比如表,字段,存儲過程,觸發器等等。我們就可以從這些系統表中查詢所 有的表和字段定義信息。SQLSERVER中還有一個名為sp_helpindex的系統預定義存儲過程,可 用來查詢指定表的索引信息。

在代碼中我們首先使用一個比較復雜的SQL語句從系統 表中查詢數據庫中所有的數據表名,字段名,字段類型和長度等信息。這裡的SQL語句是我個 人摸索的,相信大家可以寫出更好更准確的SQL語句。我們讀取查詢結果就可以構造出基本的 表和字段對象結構,然後針對每一個表對象,調用sp_helpindex存儲過程,獲得數據表中定 義的關鍵字段信息。

/// <summary>
/// 從 SQLServer 中加載數據庫結構信息
/// </summary>
/// <param name="myConn">數據庫連接對象</param>
/// <returns>加載的字段信息個數</returns>
public int LoadFromSQLServer( IDbConnection myConn )
{
intFillStyle = FillStyleConst.SQLServer ;
int RecordCount = 0 ;
if( myConn is OleDbConnection )
strName = ( ( OleDbConnection ) myConn ).DataSource ;
else if( myConn is System.Data.SqlClIEnt.SqlConnection )
strName = ( ( System.Data.SqlClIEnt.SqlConnection ) myConn ).DataSource ;
strName = strName + " - " + myConn.Database ;
string strSQL = null;
strSQL = @"
select
sysobjects.name ,
syscolumns.name ,
systypes.name ,
syscolumns.length ,
syscolumns.isnullable ,
sysobjects.type
from
syscolumns,
sysobjects,
systypes
where
syscolumns.id=sysobjects.id
and syscolumns.xusertype=systypes.xusertype
and (sysobjects.type='U' or sysobjects.type='V' )
and systypes.name <>'_default_'
and systypes.name<>'sysname'
order by
sysobjects.name,
syscolumns.name";
myTables.Clear();
using( System.Data.IDbCommand myCmd = myConn.CreateCommand())
{
myCmd.CommandText = strSQL ;
IDataReader myReader = myCmd.ExecuteReader( CommandBehavior.SingleResult );
TableInfo LastTable = null;
while( myReader.Read())
{
string TableName = myReader.GetString(0).Trim();
if( LastTable == null || LastTable.Name != TableName )
{
LastTable = new TableInfo();
myTables.Add( LastTable );
LastTable.Name = TableName ;
LastTable.Tag = Convert.ToString( myReader.GetValue( 5 ));
}
FieldInfo NewField = new FIEldInfo();
LastTable.Fields.Add( NewFIEld );
NewFIEld.Name = myReader.GetString(1);
NewField.FIEldType = myReader.GetString(2);
NewField.FIEldWidth = myReader[3].ToString();
if( myReader.IsDBNull( 4 ) == false)
NewFIEld.Nullable = (myReader.GetInt32(4) == 1);
RecordCount ++ ;
}//while
myReader.Close();
// 加載主鍵信息
for( int iCount = myTables.Count - 1 ; iCount >= 0 ; iCount -- )
{
TableInfo myTable = myTables[ iCount ] ;
if( string.Compare( ( string ) myTable.Tag , "U" , true ) == 0 )
{
try
{
myCmd.CommandText = "sp_helpindex \"" + myTable.Name + "\"" ;
//myCmd.CommandType = System.Data.CommandType.Text ;
myReader = myCmd.ExecuteReader( );
while( myReader.Read())
{
string strKeyName = myReader.GetString(0);
string strDesc = myReader.GetString(1);
string strFIElds = myReader.GetString(2);
bool bolPrimary = ( strDesc.ToLower().IndexOf("primary") >= 0 );
foreach( string strField in strFIElds.Split(','))
{
FieldInfo myField = myTable.Fields[ strFIEld.Trim()];
if( myFIEld != null)
{
myFIEld.Indexed = true;
myFIEld.PrimaryKey = bolPrimary ;
}
}//foreach
}//while
myReader.Close();
}
catch( Exception ext )
{
//this.List.Remove( myTable );
myTable.Name = myTable.Name + " " + ext.Message ;
}
}
}//foreach
}//using
return RecordCount ;
}//public int LoadFromSQLServer( System.Data.IDbConnection myConn )

目前 DataBaseInfo對象只能分析Access2000,SQLSERVER和Oralce數據庫,大家以後可以完善它, 使得它能分析比如DB2,MySQL等其他數據庫類型。在未來的軟件開發過程中,若需要分析數 據庫結構的,則只要調用這個DataBaseInfo就可以了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved