//This file is part of ORM.NET.
//
//ORM.NET is free software; you can redistribute it and/or
//modify it under the terms of the GNU Lesser General Public
//License as published by the Free Software Foundation; either
//version 2.1 of the License, or (at your option) any later version.
//
//ORM.NET is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
//Lesser General Public License for more details.
//
//You should have received a copy of the GNU Lesser General Public
//License along with ORM.NET; if not, write to the Free Software
//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
using System;
using System.Data;
using System.Data.SqlClient;
using System.Reflection;
using System.Windows.Forms;
namespace ORMBiz{
/// <summary>
/// Summary description for SchemaInfo.
/// </summary>
public class SchemaInfo
{
public delegate void LogDelegate(string message, bool lineFeed);
public string Dsn;
public event LogDelegate Log;
/// <summary>
/// Raises the Log event
/// </summary>
/// <param name="message"></param>
/// <param name="lineFeed"></param>
private void OnLog(string message, bool lineFeed)
{
if ( Log != null )
Log(message, lineFeed);
}
/// <summary>
/// Raises the Log event
/// </summary>
/// <param name="message"></param>
private void OnLog(string message)
{
OnLog(message, false);
}
public SchemaInfo()
{
}
private void DebugWrite(string data)
{
OnLog(data);
}
private DataSet FillDataSet( string sql, DataSet ds, params string[] tableMappings)
{
DebugWrite("Connecting to database...");
SqlConnection conn= new SqlConnection();
try
{
conn.ConnectionString = Dsn;
SqlCommand cmd = new SqlCommand();
conn.Open();
DebugWrite("Done\nRetrieving Database schema (This may take a long time for larger schemas).....");
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = sql;
cmd.CommandTimeout = 0;
SqlDataAdapter da = new SqlDataAdapter( cmd );
da.TableMappings.Add("Table", tableMappings[0]);
for(int i = 1; i < tableMappings.Length; i++)
da.TableMappings.Add("Table" + i.ToString(), tableMappings[i]);
da.Fill(ds);
DebugWrite("Done.\n");
}
catch(Exception)
{
throw;
}
finally
{
if (conn != null) conn.Close();
}
return ds;
}
public DataSet FetchSchemaInfo(string dsn)
{
this.Dsn = dsn;
DataSet ds = new DataSet();
string sql = OrmLib.FileTools.Resource2String( @"ORMBiz.Resources.FetchSql.sql", Assembly.GetExecutingAssembly() );
FillDataSet( sql, ds, "Database", "Table", "DataType", "Column", "Relation", "RelationColumn", "Procedure", "Param");
return ds;
}
public string GetDatabaseToken( string dsn )
{
SqlConnection conn= new SqlConnection();
try
{
conn.ConnectionString = dsn;
SqlCommand cmd = new SqlCommand();
conn.Open();
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = "set nocount on if not exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[__orm__]') and OBJECTPROPERTY(id, N'istable') = 1) BEGIN CREATE TABLE dbo.[__orm__] ( [databaseguid] [varchar] (100) NOT NULL ) ON [PRIMARY] END if not exists (select * from [__orm__]) BEGIN insert [__orm__] values (CONVERT(varchar(36), NEWID()) + '-' + CONVERT(varchar,RAND() * 1000000) + '-' + CONVERT(varchar,RAND(RAND()) * 1000000)) END set nocount off select * from [__orm__]";
string token = (string)cmd.ExecuteScalar();
conn.Close();
return token;
}
catch(Exception ex)
{
if (conn != null) conn.Close();
throw ex;
}
}
}
}
|