Показаны сообщения с ярлыком SQL Server. Показать все сообщения
Показаны сообщения с ярлыком SQL Server. Показать все сообщения

вторник, 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();
}

}

среда, 10 июня 2009 г.

Пропадает диалоговое окно настроек Visual Studio 2005/2008 DDEX Provider для Firebird

При попытке использовать Visual Studio 2005/2008 DDEX Provider для Firebird, диалогове откно с параметрами подключения исщезает сразу же при попытке что-нибудь изменить. Я прописал все необходимое в machine.config, в реестре, но сторлкнулся с такой проблемой.
Оказалось что у многих такая проблема, но для меня она решилась тем, что по невнимательности я добавил в machine.config строку

<add name="FirebirdClient Data Provider"/>

не до а после закрывающего тега

</DbProviderFactories>

Вот такая невнимательность!

вторник, 28 апреля 2009 г.

Как в SQL Server отсортировать иерархический рекурсивный запрос?

В SQL Server 2005 появилось нововведение в виде CTE (common table expressions), которое позволяет выполнять иерархические рекурсивные запросы к базе данных.
При разработке сайта Калькулятор на автокредит у меня появилась задача: отобразить иерархическую структуру страниц сайта, причем отсортированную по полю pageorder у страниц с одинаковым уровнем иерархии.

Структура таблицы выглядит примерно так:


CREATE TABLE [dbo].[pages](
[id] [int] NULL,
[pid] [int] NULL,
[title] [nvarchar](max) NULL,
[pageorder] [int] NULL
) ON [PRIMARY]



Поле pid указывает на id родителя данной записи. Кроме того должна еще существовать одна root-запись, у которой pid = NULL.

Итак сам запрос выглядит таким образом:


WITH CTE(pid, id, title, level, pageorder, pathstr) AS
(
SELECT pid, id, title, 0, 0, CAST ('/' AS VARCHAR(MAX))
FROM pages
WHERE pid IS NULL
UNION ALL
SELECT e.pid, e.id, e.title, level + 1, e.pageorder, d.pathstr + CAST(e.pageorder as VARCHAR) + '/'
FROM pages e
INNER JOIN CTE d
ON e.pid = d.id

)
SELECT pid, id, replicate('... ', level) + title as title, level, pageorder, pathstr
FROM CTE
ORDER BY pathstr


Вот что мы получим после выполнения этого запроса:


pid id level pageorder pathstr title title
----------- ----------- ----------- ----------- --------- ------------------------------
NULL 1 0 0 / Главная
1 4 1 3 /3/ ... Товары
4 5 2 3 /3/3/ ... ... автомобили
4 8 2 6 /3/6/ ... ... мотоциклы
1 2 1 6 /6/ ... Услуги
2 6 2 3 /6/3/ ... ... Лизинг
2 3 2 6 /6/6/ ... ... Кредитование
1 7 1 9 /9/ ... О сайте

(8 row(s) affected)


Стоит также отметить, что в SQL Server 2008 появился новый тип данных hierarchyid, позволяющий работать с иерархическими данными намного проще и удобнее.