пятница, 26 ноября 2010 г.

ASP.NET MVC 2 ошибка при использовании RenderAction : The controller for path '/' was not found or does not implement IController.

При использовании RenderAction в ASP.NET MVC view:

<%Html.RenderAction("BrowserVersion", "HomeController"); %>

Получаем ошибку:

The controller for path '/' was not found or does not implement IController.


Ниже приведен фрагмент кода HomeController-а:

public class HomeController : Controller
{

[ChildActionOnly]
public ActionResult BrowserName()
{
ViewData["BrowserName"] = Request.Browser.Browser;
return View();
}

}

четверг, 21 января 2010 г.

Как воостановить пропавшие панели инструментов в Visual Studio 2008?

Сегодня у меня пропали панели инструментов Visual Studio 2008.  Команда reset ничего не изменила. Поле этого сделал "show all".  Все панели со всеми компонтами появились (нужные и ненужные), но компоненты неактивные, добавить на форму нельзя.

Но решение все-таки есть. Нужно в папке

C:\Documents and Settings\[Имя пользователя]\Local Settings\Application Data\Microsoft\VisualStudio\9.0

Найти файлы

"toolbox.tbd", "toolboxIndex.tbd", "toolbox_reset.tbd", "toolboxIndex_reset.tbd"

и удалить их.

Теперь запустить Visual Studio 2008. Все вернулось на свои места.

понедельник, 7 декабря 2009 г.

Как создать прозрачное GIF изображение используя C#

Не существует аппаратно легкого пути создания прозрачного GIF изображения используя .NET framework. Microsoft предоставила метод класс Bitmap именуемый MakeTransparent(), но он не работет для GIF-ов, похоже он работет только PNG файлов.

Решение:

Нужно создать цветовую палитру используя спецификацию GIF specification. Для выполнения этого нужно сохранить непрозрачный GIF в MemoryStream, а затем перебрав бинарные данные, обновить цветову палитру новыми "прозрачными" битами.




/// <summary>
/// Returns a transparent background GIF image from the specified Bitmap.
/// </summary>
/// <param name="bitmap">The Bitmap to make transparent.</param>
/// <param name="color">The Color to make transparent.</param>
/// <returns>New Bitmap containing a transparent background gif.</returns>
public Bitmap MakeTransparentGif(Bitmap bitmap, Color color)
{
byte R = color.R;
byte G = color.G;
byte B = color.B;</p>
MemoryStream fin = new MemoryStream();
bitmap.Save(fin, System.Drawing.Imaging.ImageFormat.Gif);
MemoryStream fout = new MemoryStream((int)fin.Length);
int count = 0;
byte[] buf = new byte[256];
byte transparentIdx = 0;
fin.Seek(0, SeekOrigin.Begin);
//header
count = fin.Read(buf, 0, 13);
if ((buf[0] != 71) || (buf[1] != 73) || (buf[2] != 70)) return null; //GIF
fout.Write(buf, 0, 13);
int i = 0;
if ((buf[10] & 0×80) > 0)
{
i = 1 << ((buf[10] & 7) + 1) == 256 ? 256 : 0;
}
for (; i != 0; i—)
{
fin.Read(buf, 0, 3);
if ((buf[0] == R) && (buf[1] == G) && (buf[2] == B))
{
transparentIdx = (byte)(256 – i);
}
fout.Write(buf, 0, 3);
}
bool gcePresent = false;
while (true)
{
fin.Read(buf, 0, 1);
fout.Write(buf, 0, 1);
if (buf[0] != 0×21) break;
fin.Read(buf, 0, 1);
fout.Write(buf, 0, 1);
gcePresent = (buf[0] == 0xf9);
while (true)
{
fin.Read(buf, 0, 1);
fout.Write(buf, 0, 1);
if (buf[0] == 0) break;
count = buf[0];
if (fin.Read(buf, 0, count) != count) return null;
if (gcePresent)
{
if (count == 4)
{
buf[0] |= 0×01;
buf[3] = transparentIdx;
}
}
fout.Write(buf, 0, count);
}
}
while (count > 0)
{
count = fin.Read(buf, 0, 1);
fout.Write(buf, 0, 1);
}
fin.Close();
fout.Flush();
return new Bitmap(fout);
}

вторник, 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, позволяющий работать с иерархическими данными намного проще и удобнее.

четверг, 26 марта 2009 г.

Как подключиться к SQL Server 2008 используя SQL Server Management Studio 2005?

При разработке сайта Автокредитование: калькулятор автокредита столкнулся с проблемой: на одном из хостинг-серверов админы установили SQL Server 2008 вместо SQL Server 2008. При попытке подключения со своей локальной машины к этому серверу через SQL Server Management Studio 2005 закончилась неудачей. Management Studio 2005 сообщила, что не не рассчитана на подключение к данной версии SQL Server-а. Установливать SQL Server 2008 и идущий с ней Management Studio 2008 мне пока не было необходимости, поэтому нашлось другое решение.

Для начала я установил у себя Microsoft SQL Server 2005 Service Pack 2. После этого установил последний на нынешний момент апдейт на SP2: Cumulative update package 12 for SQL Server 2005 Service Pack 2 (server).
И, наконец, самое главное: Cumulative update package 12 for SQL Server 2005 Service Pack 2 (naitive client)

После этого теперь мой SQL Server Management Studio 2005 успешно заходит на SQL Server 2008.

Замечу однако, что в SQL Server 2008 Express Edition with Advanced Services при попытке открытия таблицы (Open Table) или именения ee (Design) вываливается ошибка

Неопознанная ошибка (MS Visual Database Tools)

хотя в то же время запросы в Management Studio выполняются и результаты отображаются нормально.

среда, 25 марта 2009 г.

Как запретить передавать HTTP header "Expect: 100-continue" при выполнении запроса используя класс HttpWebRequest в C#?

По умолчанию,  при выполнении веб-запроса,  используя класс HttpWebRequest, .NET Framework добавляет HTTP заголовок (HTTP header)  "Expect: 100-continue". Для того, чтобы запретить формирование этого заголовка нужно сделать следующее:

HttpWebRequest myHttpWebRequest = (HttpWebRequest)HttpWebRequest.Create("http://a-kicker.blogspot.com");
myHttpWebRequest.ServicePoint.Expect100Continue = false; 

Как поместить DateTimePicker на ToolStrip в Windows приложении на платформе Microsoft .NET?

Чтоб поместить DateTimePicker на ToolStrip в Windows Forms приложении на платформе Microsoft .NET, нужно сделать следующее:

DateTimePicker dateTimePcr = new DateTimePicker();
toolStrip1.Items.Add(new ToolStripControlHost(dateTimePcr));

вторник, 3 марта 2009 г.

Как задействовать Gzip и Deflate HTTP компрессию в ASP.NET страницах?

Как задействовать Gzip и Deflate HTTP компрессию в ASP.NET страницах? В файле Global.asax нужно написать следующее:


<%@ Application Language="C#" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.IO.Compression" %>

<script runat="server">
void Application_PreRequestHandlerExecute(object sender, EventArgs e)
{
HttpApplication app = sender as HttpApplication;
string acceptEncoding = app.Request.Headers["Accept-Encoding"];
Stream prevUncompressedStream = app.Response.Filter;

if (!(app.Context.CurrentHandler is Page) ||
app.Request["HTTP_X_MICROSOFTAJAX"] != null)
return;

if (acceptEncoding == null || acceptEncoding.Length == 0)
return;

acceptEncoding = acceptEncoding.ToLower();

if (acceptEncoding.Contains("deflate") || acceptEncoding == "*")
{
// defalte
app.Response.Filter = new DeflateStream(prevUncompressedStream,
CompressionMode.Compress);
app.Response.AppendHeader("Content-Encoding", "deflate");
} else if (acceptEncoding.Contains("gzip"))
{
// gzip
app.Response.Filter = new GZipStream(prevUncompressedStream,
CompressionMode.Compress);
app.Response.AppendHeader("Content-Encoding", "gzip");
}
}
</script>