using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using System.Data;
using System.Xml;
namespace sharpcomparer
{
public class DatabaseRegistration
{
private string name;
private string dataSource;
private bool integratedSecurity;
private string initialCatalog;
private string userID;
private string password;
private List
tables;
private List views;
private List procedures;
private List users;
private List tablesData;
private SqlConnection connection;
public string Name
{
get { return name; }
set { name = value; }
}
public string DataSource
{
get { return dataSource; }
set { dataSource = value; }
}
public bool IntegratedSecurity
{
get { return integratedSecurity; }
set { integratedSecurity = value; }
}
public string InitialCatalog
{
get { return initialCatalog; }
set { initialCatalog = value; }
}
public string UserID
{
get { return userID; }
set { userID = value; }
}
public string Password
{
get { return password; }
set { password = value; }
}
public string ConnectionString
{
get
{
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
builder.DataSource = DataSource;
builder.IntegratedSecurity = IntegratedSecurity;
builder.UserID = UserID;
if (!string.IsNullOrEmpty(Password))
{
builder.Password = Password;
}
if (!string.IsNullOrEmpty(InitialCatalog))
{
builder.InitialCatalog = InitialCatalog;
}
return builder.ConnectionString;
}
}
[Hide()]
public List Tables
{
get
{
if (tables == null)
{
tables = GetTables(false);
}
return tables;
}
}
[Hide()]
public List Views
{
get
{
if (views == null)
{
views = GetViews();
}
return views;
}
}
[Hide()]
public List Procedures
{
get
{
if (procedures == null)
{
GetProcedures();
}
return procedures;
}
}
[Hide()]
public List Users
{
get
{
if (users == null)
{
GetUsers();
}
return users;
}
}
[Hide()]
public List TablesData
{
get
{
if (tablesData == null)
{
tablesData = GetTablesData();
}
return tablesData;
}
}
[Hide()]
public SqlConnection Connection
{
get
{
if (connection == null)
{
connection = new SqlConnection(ConnectionString);
}
return connection;
}
}
public DatabaseRegistration(string name, string dataSource, bool integratedSecurity, string initialCatalog, string userID, string password)
{
this.name = name;
this.dataSource = dataSource;
this.integratedSecurity = integratedSecurity;
this.initialCatalog = initialCatalog;
this.userID = userID;
this.password = password;
}
private List GetTables(bool view)
{
List list = new List();
string[] restrictions = new string[] { InitialCatalog, null, null, view ? "VIEW" : "BASE TABLE" };
Connection.Open();
DataTable dt = Connection.GetSchema("Tables", restrictions);
foreach (DataRow row in dt.Rows)
{
string tableCatalog = (string)row["TABLE_CATALOG"];
string tableSchema = (string)row["TABLE_SCHEMA"];
string tableName = (string)row["TABLE_NAME"];
string tableType = (string)row["TABLE_TYPE"];
Table table = new Table(
tableCatalog,
tableSchema,
tableName,
tableType
);
GetTableColumns(connection, table);
if (!view)
{
GetIndexes(connection, table);
}
list.Add(table);
}
Connection.Close();
return list;
}
private List GetViews()
{
List list = new List();
string[] restrictions = new string[] { InitialCatalog };
Connection.Open();
DataTable dt = Connection.GetSchema("Views", restrictions);
foreach (DataRow row in dt.Rows)
{
string tableCatalog = (string)row["TABLE_CATALOG"];
string tableSchema = (string)row["TABLE_SCHEMA"];
string tableName = (string)row["TABLE_NAME"];
string checkOption = (string)row["CHECK_OPTION"];
string isUpdatable = (string)row["IS_UPDATABLE"];
View view = new View(
tableCatalog,
tableSchema,
tableName,
checkOption,
isUpdatable
);
GetTableColumns(connection, view);
list.Add(view);
}
Connection.Close();
return list;
}
private void GetProcedures()
{
string[] restrictions = new string[] { InitialCatalog };
Connection.Open();
DataTable dt = Connection.GetSchema("Procedures", restrictions);
procedures = new List();
foreach (DataRow row in dt.Rows)
{
string specificCatalog = (string)row["SPECIFIC_CATALOG"];
string specificSchema = (string)row["SPECIFIC_SCHEMA"];
string specificName = (string)row["SPECIFIC_NAME"];
string routineCatalog = (string)row["ROUTINE_CATALOG"];
string routineSchema = (string)row["ROUTINE_SCHEMA"];
string routineName = (string)row["ROUTINE_NAME"];
string routineType = (string)row["ROUTINE_TYPE"];
DateTime created = (DateTime)row["CREATED"];
DateTime lastAltered = (DateTime)row["LAST_ALTERED"];
Procedure procedure = new Procedure(
specificCatalog,
specificSchema,
specificName,
routineCatalog,
routineSchema,
routineName,
routineType,
created,
lastAltered);
procedures.Add(procedure);
GetProcedureParamters(Connection, procedure);
}
Connection.Close();
}
private void GetUsers()
{
string[] restrictions = new string[] { InitialCatalog };
Connection.Open();
DataTable dt = Connection.GetSchema("Users");
users = new List();
foreach (DataRow row in dt.Rows)
{
short uid = Convert.ToInt16(row["uid"]);
string userName = (string)row["user_name"];
DateTime createdate = (DateTime)row["createdate"];
DateTime updatedate = (DateTime)row["updatedate"];
User user = new User(
uid,
userName,
createdate,
updatedate);
users.Add(user);
}
Connection.Close();
}
private void GetTableColumns(SqlConnection connection, Table table)
{
DataTable columns = connection.GetSchema("Columns", new string[] { InitialCatalog, null, table.TableName, null });
foreach (DataRow row in columns.Rows)
{
string tableCatalog = (string)row["TABLE_CATALOG"];
string tableSchema = (string)row["TABLE_SCHEMA"];
string tableName = (string)row["TABLE_NAME"];
string columnName = (string)row["COLUMN_NAME"];
int ordinalPosition = Convert.ToInt32(row["ORDINAL_POSITION"]);
string columnDefault = row["COLUMN_DEFAULT"] == DBNull.Value ? null : (string)row["COLUMN_DEFAULT"];
bool isNullable = (string)row["IS_NULLABLE"] == "YES";
string dataType = (string)row["DATA_TYPE"];
int characterMaximumLength = row["CHARACTER_MAXIMUM_LENGTH"] == DBNull.Value ? -1 : Convert.ToInt32(row["CHARACTER_MAXIMUM_LENGTH"]);
int characterOctetLength = row["CHARACTER_OCTET_LENGTH"] == DBNull.Value ? -1 : Convert.ToInt32(row["CHARACTER_OCTET_LENGTH"]);
byte numericPrecision = row["NUMERIC_PRECISION"] == DBNull.Value ? (byte)0 : Convert.ToByte(row["NUMERIC_PRECISION"]);
short numericPrecisionRadix = row["NUMERIC_PRECISION_RADIX"] == DBNull.Value ? (short)-1 : Convert.ToInt16(row["NUMERIC_PRECISION_RADIX"]);
int numericScale = row["NUMERIC_SCALE"] == DBNull.Value ? -1 : Convert.ToInt32(row["NUMERIC_SCALE"]);
short datetimePrecision = row["DATETIME_PRECISION"] == DBNull.Value ? (short)-1 : Convert.ToInt16(row["DATETIME_PRECISION"]);
string characterSetCatalog = row["CHARACTER_SET_CATALOG"] == DBNull.Value ? null : (string)row["CHARACTER_SET_CATALOG"];
string characterSetSchema = row["CHARACTER_SET_SCHEMA"] == DBNull.Value ? null : (string)row["CHARACTER_SET_SCHEMA"];
string characterSetName = row["CHARACTER_SET_NAME"] == DBNull.Value ? null : (string)row["CHARACTER_SET_NAME"];
string collationCatalog = row["COLLATION_CATALOG"] == DBNull.Value ? null : (string)row["COLLATION_CATALOG"];
Column column = new Column(
tableCatalog,
tableSchema,
tableName,
columnName,
ordinalPosition,
columnDefault,
isNullable,
dataType,
characterMaximumLength,
characterOctetLength,
numericPrecision,
numericPrecisionRadix,
numericScale,
datetimePrecision,
characterSetCatalog,
characterSetSchema,
characterSetName,
collationCatalog);
table.Columns.Add(column);
}
}
private void GetViewColumns(SqlConnection connection, View view)
{
DataTable columns = connection.GetSchema("ViewColumns", new string[] { InitialCatalog, null, view.TableName });
//DataTable columns = connection.GetSchema("ViewColumns", new string[] { Database, null, view.TableName, null });
//foreach (DataRow row in columns.Rows)
//{
// string viewCatalog = (string)row["VIEW_CATALOG"];
// string viewSchema = (string)row["VIEW_SCHEMA"];
// string viewName = (string)row["VIEW_NAME"];
// string tableCatalog = (string)row["TABLE_CATALOG"];
// string tableSchema = (string)row["TABLE_SCHEMA"];
// string tableName = (string)row["TABLE_NAME"];
// string columnName = (string)row["COLUMN_NAME"];
// ViewColumn column = new ViewColumn(
// viewCatalog,
// viewSchema,
// viewName,
// tableCatalog,
// tableSchema,
// tableName,
// columnName);
// view.Columns.Add(column);
//}
}
private void GetProcedureParamters(SqlConnection connection, Procedure procedure)
{
DataTable parameters = connection.GetSchema("ProcedureParameters", new string[] { InitialCatalog, null, procedure.RoutineName, null });
foreach (DataRow row in parameters.Rows)
{
string specificCatalog = (string)row["SPECIFIC_CATALOG"];
string specificSchema = (string)row["SPECIFIC_SCHEMA"];
string specificName = (string)row["SPECIFIC_NAME"];
int ordinalPosition = Convert.ToInt32(row["ORDINAL_POSITION"]);
string parameterMode = (string)row["PARAMETER_MODE"];
string isResult = (string)row["IS_RESULT"];
string asLocator = (string)row["AS_LOCATOR"];
string parameterName = (string)row["PARAMETER_NAME"];
string dataType = (string)row["DATA_TYPE"];
int characterMaximumLength = row["CHARACTER_MAXIMUM_LENGTH"] == DBNull.Value ? -1 : Convert.ToInt32(row["CHARACTER_MAXIMUM_LENGTH"]);
int characterOctetLength = row["CHARACTER_OCTET_LENGTH"] == DBNull.Value ? -1 : Convert.ToInt32(row["CHARACTER_OCTET_LENGTH"]);
string collationCatalog = row["COLLATION_CATALOG"] == DBNull.Value ? null : (string)row["COLLATION_CATALOG"];
string collationSchema = row["COLLATION_SCHEMA"] == DBNull.Value ? null : (string)row["COLLATION_SCHEMA"];
string collationName = row["COLLATION_NAME"] == DBNull.Value ? null : (string)row["COLLATION_NAME"];
string characterSetCatalog = row["CHARACTER_SET_CATALOG"] == DBNull.Value ? null : (string)row["CHARACTER_SET_CATALOG"];
string characterSetSchema = row["CHARACTER_SET_SCHEMA"] == DBNull.Value ? null : (string)row["CHARACTER_SET_SCHEMA"];
string characterSetName = row["CHARACTER_SET_NAME"] == DBNull.Value ? null : (string)row["CHARACTER_SET_NAME"];
byte numericPrecision = row["NUMERIC_PRECISION"] == DBNull.Value ? (byte)0 : Convert.ToByte(row["NUMERIC_PRECISION"]);
short numericPrecisionRadix = row["NUMERIC_PRECISION_RADIX"] == DBNull.Value ? (short)-1 : Convert.ToInt16(row["NUMERIC_PRECISION_RADIX"]);
int numericScale = row["NUMERIC_SCALE"] == DBNull.Value ? -1 : Convert.ToInt32(row["NUMERIC_SCALE"]);
short datetimePrecision = row["DATETIME_PRECISION"] == DBNull.Value ? (short)-1 : Convert.ToInt16(row["DATETIME_PRECISION"]);
string intervalType = row["INTERVAL_TYPE"] == DBNull.Value ? null : (string)row["INTERVAL_TYPE"];
string intervalPrecision = row["INTERVAL_PRECISION"] == DBNull.Value ? null : (string)row["INTERVAL_PRECISION"];
ProcedureParameter parameter = new ProcedureParameter(
specificCatalog,
specificSchema,
specificName,
ordinalPosition,
parameterMode,
isResult,
asLocator,
parameterName,
dataType,
characterMaximumLength,
characterOctetLength,
collationCatalog,
collationSchema,
collationName,
characterSetCatalog,
characterSetSchema,
characterSetName,
numericPrecision,
numericPrecisionRadix,
numericScale,
datetimePrecision,
intervalType,
intervalPrecision);
procedure.Parameters.Add(parameter);
}
}
private void GetIndexes(SqlConnection connection, Table table)
{
DataTable indexes = connection.GetSchema("Indexes", new string[] { InitialCatalog, null, table.TableName });
foreach (DataRow row in indexes.Rows)
{
string constraintCatalog = (string)row["CONSTRAINT_CATALOG"];
string constraintSchema = (string)row["CONSTRAINT_SCHEMA"];
string constraintName = (string)row["CONSTRAINT_NAME"];
string tableCatalog = (string)row["TABLE_CATALOG"];
string tableSchema = (string)row["TABLE_SCHEMA"];
string tableName = (string)row["TABLE_NAME"];
string indexName = (string)row["INDEX_NAME"];
Index index = new Index(
constraintCatalog,
constraintSchema,
constraintName,
tableCatalog,
tableSchema,
tableName,
indexName);
table.Indexes.Add(index);
GetIndexColumns(connection, table, index);
}
}
private void GetIndexColumns(SqlConnection connection, Table table, Index index)
{
DataTable indexColumns = connection.GetSchema("IndexColumns", new string[] { InitialCatalog, null, table.TableName, index.IndexName });
foreach (DataRow row in indexColumns.Rows)
{
string constraintCatalog = (string)row["CONSTRAINT_CATALOG"];
string constraintSchema = (string)row["CONSTRAINT_SCHEMA"];
string constraintName = (string)row["CONSTRAINT_NAME"];
string tableCatalog = (string)row["TABLE_CATALOG"];
string tableSchema = (string)row["TABLE_SCHEMA"];
string tableName = (string)row["TABLE_NAME"];
string columnName = (string)row["COLUMN_NAME"];
int ordinalPosition = Convert.ToInt32(row["ORDINAL_POSITION"]);
byte keyType = Convert.ToByte(row["KEYTYPE"]);
string indexName = (string)row["INDEX_NAME"];
IndexColumn indexColumn = new IndexColumn(
constraintCatalog,
constraintSchema,
constraintName,
tableCatalog,
tableSchema,
tableName,
columnName,
ordinalPosition,
keyType,
indexName);
index.IndexColumns.Add(indexColumn);
}
}
public Table GetTable(string name)
{
Table result = Tables.Find(
delegate(Table table)
{
return table.TableName == name;
}
);
return result;
}
private List GetTablesData()
{
List tablesData = new List();
foreach (Table table in Tables)
{
int count = (int)ExecuteScalar("SELECT COUNT(*) FROM " + table.TableName);
TableData data = new TableData(table.TableName, count);
tablesData.Add(data);
}
return tablesData;
}
public object ExecuteScalar(string cmdText)
{
Connection.Open();
SqlCommand command = new SqlCommand(cmdText, Connection);
object ret = command.ExecuteScalar();
Connection.Close();
return ret;
}
public SqlDataReader ExecuteReader(string cmdText)
{
Connection.Open();
SqlCommand command = new SqlCommand(cmdText, Connection);
SqlDataReader reader = command.ExecuteReader();
return reader;
}
public void CreateTable(Table table)
{
string fields = string.Empty;
for (int i = 0; i < table.Columns.Count; i++)
{
Column column = table.Columns[i];
string field = string.Format("{0} {1} {2}",
column.ColumnName,
column.Type,
column.IsNullable ? string.Empty : "not null");
fields += field;
if (i < table.Columns.Count - 1) fields += ",";
}
string cmdText = string.Format(
"CREATE TABLE {0} ({1})",
table.TableName,
fields
);
SqlConnection connection = new SqlConnection(ConnectionString);
connection.Open();
SqlCommand command = new SqlCommand(cmdText, connection);
command.ExecuteNonQuery();
connection.Close();
}
}
}