вторник, 28 июля 2009 г.

Получение данных из базы данных FireBird используя сторед процедуру, хранящуюся на MS SQL Server

При решении одной из задач (рассчет автокредита) мне понадобилась возможность, выполняя хранимую процедуру SQL Server 2005, получать данные из базы данных FireBird.

Обычной хранимой процедурой на T-SQL сделать такое нельзя, поэтому я написал сторед процедуру на C#, в которой получаю необходимые данные в DataTable(s), откуда потом используя метод SqlContext.Pipe.SendResultsRow, передаю строки SQL Server-у.
Примерный код такой:


public class SQLFIREBIRDCLR
{

[SqlProcedure()]
public static void ProcedureToFirebird(SqlString sServerName, SqlString sDatabaseName)
{

FbConnectionStringBuilder cs = new FbConnectionStringBuilder();
cs.DataSource = sServerName.ToString();
cs.Database = sDatabaseName.ToString();
cs.UserID = "SYSDBA";
cs.Password = "masterkey";
cs.Dialect = 3;
string ConnectionString = cs.ToString();

SqlDataRecord record = new SqlDataRecord(
new SqlMetaData("field1", SqlDbType.SmallInt),
new SqlMetaData("field2", SqlDbType.NVarChar, 30));


SqlContext.Pipe.SendResultsStart(record);
DataTable dt = new DataTable();
FbConnection conn = new FbConnection(ConnectionString);
using (conn)
{
string ssql = "select field1, field2 from table1";
FbCommand command = new FbCommand(ssql, conn);
FbDataAdapter adapt = new FbDataAdapter(command);
conn.Open();
adapt.Fill(dt);

}

foreach (DataRow dr in dt.Rows)
{
record.SetValue(0, dr["field1"]);
record.SetValue(1, dr["field2"]);
SqlContext.Pipe.SendResultsRow(record);
}
SqlContext.Pipe.SendResultsEnd();
}

}