czwartek, 17 grudnia 2009

ASSEMBLY MS SQL 2005 - notatki

Będe zamieszczał w tym poście notatki z moich prac związanych z ASSEMBLY na MS SQL 2005



--Włączanie obsługi assembly na serwerze ms sql
use master
go
sp_configure 'clr enabled', 1
go
reconfigure
go



--sprawdzanie konfiguracji
sp_configure 'clr enabled'


--ładowanie assembly
USE ASM --This is our test database.
GO
CREATE ASSEMBLY [test_call] FROM 'C:\work\ASM - CP\TEST\TEST\bin\Debug\test.dll'



bledy:

en:
The requested operation requires a Sql Server execution thread. The current thread was started by user code or other non-Sql Server engine code.
pl:
Żądana operacja wymaga kontekstu SqlClr, który jest dostępny tylko podczas uruchamiania procesu programu SQL Server.

solution:
http://www.sqlclr.net/Articles/tabid/54/articleType/ArticleView/articleId/34/Default.aspx




Metoda do instalowanie Assembly na serwerze

///
///
///

///
/// sciezka gdzie znajduje sie biblioteka
/// nazwa pod jaka ma zostac utworzone assmebly w bazie
/// Nazwa klasy dla danej assmbly
/// pelna nazwa biblioteki np test.dll
/// nazwa bazy na jakiej ma zostac postawiona assembly
public static void InstallMe(string connectionString, string path, string assemblyName, string className, string assemblyDLL
, string databaseName)
{
try
{
string directory = Path.GetDirectoryName(path);


string sql = @"USE {0} ";

//skasowanie procedur(y) uzywjacych assembly
sql += "IF EXISTS ( select 1 from sysobjects WHERE xtype = 'PC' AND name = '{1}') BEGIN ";
sql += "DROP PROCEDURE {1} END ";

//skasowanie assembly
sql += "IF EXISTS (SELECT 1 FROM [sys].[assemblies] AS asmbl WHERE asmbl.[name] = '{1}') BEGIN ";
sql += "DROP ASSEMBLY {1} END ";

//dodaje assembly
sql += "CREATE ASSEMBLY [{1}] FROM '{2}{3}' ";



string sqlM1 = "CREATE PROCEDURE asm_AssemblyCCPForMSSQL ";
sqlM1 += "@ConnectionString [nvarchar](100), ";
sqlM1 += "@XMLFileLocation[nvarchar](100) ";
sqlM1 += "WITH EXECUTE AS CALLER ";
sqlM1 += "AS ";
sqlM1 += "EXTERNAL NAME [{1}].[{4}].[ImportXMLToDB] ";





sql = string.Format(sql, databaseName, assemblyName, path, assemblyDLL, className);
sqlM1 = string.Format(sqlM1, databaseName, assemblyName, path, assemblyDLL, className);


//zapis sql do pliku
FileStream file = File.Create(path + "create_script.sql");
file.Close();
System.IO.StreamWriter sw = new StreamWriter(path + "create_script.sql", true);
sw.WriteLine(sql);
sw.WriteLine("/*################################*/");
sw.WriteLine(sqlM1);
sw.Close();




using (SqlConnection conn = new SqlConnection(connectionString))
{
SqlCommand InsertCurrencyCommand = new SqlCommand();
InsertCurrencyCommand.CommandText = sql;
InsertCurrencyCommand.Connection = conn;

SqlCommand InsertCurrencyCommand2 = new SqlCommand();
InsertCurrencyCommand2.CommandText = sqlM1;
InsertCurrencyCommand2.Connection = conn;

conn.Open();
InsertCurrencyCommand.ExecuteNonQuery();
InsertCurrencyCommand2.ExecuteNonQuery();
conn.Close();
}
}
catch (Exception exc)
{
Console.WriteLine(exc.Message);
}


}


Oraz jej przykładowe wywołanie:

MSSQLASM.InstallMe("Data Source=APE\\SQLEXPRESS;Initial Catalog=ASM;Integrated Security=True"
, "C:\\work\\ASM - CP\\Assembly_CPP_C+\\Assembly_CPP_C+\\AssemblyCCP\\AssemblyCCPForMSSQL\\bin\\Debug\\"
, "asm_AssemblyCCPForMSSQL"
, "AssemblyCCPForMSSQL"
, "AssemblyCCPForMSSQL.dll"
, "ASM");

Brak komentarzy:

Prześlij komentarz