Thứ Tư, 4 tháng 11, 2015

Get DataTable using EF DbContext

public System.Data.DataTable GetDataTable(string sql)
{
    DataTable dt = new DataTable();
    var conn = DbContext.Database.Connection;
    var connectionState = conn.State;

    if (connectionState != ConnectionState.Open)
        conn.Open();
    using (var cmd = conn.CreateCommand())
    {
        cmd.CommandText = sql;
        using (var reader = cmd.ExecuteReader())
        {
            dt.Load(reader);
        }
    }

    if (connectionState != ConnectionState.Open)
        conn.Close();

    return dt;
}

Thứ Tư, 28 tháng 10, 2015

Convert DataTable to CSV string

public static class DataTableExtension
{
    public static string ToCSV(this DataTable dt)
    {
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i <= dt.Columns.Count - 1; i++)
        {
            sb.Append(dt.Columns[i].ColumnName);

            if (i < dt.Columns.Count - 1)
            {
                sb.Append(",");
            }
        }

        sb.AppendLine();

        for (int i = 0; i <= dt.Rows.Count - 1; i++)
        {
            for (int j = 0; j <= dt.Columns.Count - 1; j++)
            {
                object o = dt.Rows[i][j];
                if (o != null)
                {
                    string value = o.ToString();

                    if (value.Contains(","))
                    {
                        value = string.Concat("\"", value, "\"");
                    }

                    if (value.Contains("\r"))
                    {
                        value = value.Replace("\r", " ");
                    }
                    if (value.Contains("\n"))
                    {
                        value = value.Replace("\n", " ");
                    }

                    sb.Append(value);
                }

                if (j < dt.Columns.Count - 1)
                {
                    sb.Append(",");
                }
            }

            sb.AppendLine();
        }

        return sb.ToString();
    }
}

Thứ Năm, 22 tháng 10, 2015

InitCap function for SQL Server

CREATE FUNCTION [dbo].[InitCap] ( @InputString varchar(4000) ) 
RETURNS VARCHAR(4000)
AS
BEGIN

DECLARE @Index          INT
DECLARE @Char           CHAR(1)
DECLARE @PrevChar       CHAR(1)
DECLARE @OutputString   VARCHAR(255)

SET @OutputString = LOWER(@InputString)
SET @Index = 1

WHILE @Index <= LEN(@InputString)
BEGIN
    SET @Char     = SUBSTRING(@InputString, @Index, 1)
    SET @PrevChar = CASE WHEN @Index = 1 THEN ' '
                         ELSE SUBSTRING(@InputString, @Index - 1, 1)
                    END

    IF @PrevChar IN (' ', ';', ':', '!', '?', ',', '.', '_', '-', '/', '&', '''', '(')
    BEGIN
        IF @PrevChar != '''' OR UPPER(@Char) != 'S'
            SET @OutputString = STUFF(@OutputString, @Index, 1, UPPER(@Char))
    END

    SET @Index = @Index + 1
END

RETURN @OutputString

END

GO

Reference: http://www.sql-server-helper.com/faq/oracle-functions-p01.aspx

Thứ Tư, 21 tháng 10, 2015

sp_refreshview

SELECT DISTINCT 'EXEC sp_refreshview ''' + name + '''' 
FROM sys.objects AS so 
INNER JOIN sys.sql_expression_dependencies AS sed 
    ON so.object_id = sed.referencing_id 
WHERE so.type = 'V';

Reference: https://msdn.microsoft.com/en-us/library/ms187821.aspx

Thứ Sáu, 19 tháng 6, 2015

Cleaner Forms sử dụng Tag Helpers trong MVC 6


MVC 6 giới thiệu 1 tính năng mới được gọi là Tag Helpers. Trong bài viết này, chúng ta sẽ khám phá Tag Helpers có thể được sử dụng để cái thiện khả năng dễ đọc của Razor Views của bạn như thế nào.
Tag Helpers làm việc như thế nào?
Tag Helpers thay thế cho HTML Helpers trong việc tạo ra HTML. Dễ thấy điều này nhất với 1 ví dụ.
Hãy bắt đầu bằng cách nhìn vào 1 ví dụ đơn giản của 1 màn hình đăng nhập với 1 LoginViewModel chứa 1 UserName và 1 Password:
public class LoginViewModel
{
    public string UserName { get; set; }

    public string Password { get; set; }
}
Đây là cách mà chúng ta tạo HTML cho UserName sử dụng HTML Helper and a Tag Helper
<!--Create an input for UserName using Html Helper-->
@Html.EditorFor(l => l.UserName)
<!--Create an input for UserName using Tag Helper-->
<input asp-for="UserName" />

Với HTML Helper, chúng ta gọi code C# để tạo ra HTML. Với Tag Helpers, chúng ta thêm vào HTML một số thuộc tính đặc biệt. Những thuộc tính đặc biệt này sẽ được xử lý bới MVC và tạo ra HTML. Cả 2 cách trên đều sẽ tạo ra 1 thẻ input trông giống như:
<input name="UserName" class="text-box single-line" id="UserName" type="text" value="">

Tại sao điều này tốt hơn?
Nhìn thoáng qua, có vẻ như Tag Helpers chỉ là 1 sự thay đổi cú pháp mà không có lợi ích rõ ràng. Tuy nhiên, sự khác biệt, nó có thể làm cho Razor Forms của bạn thêm dễ đọc hơn. Hãy nói chúng ta muốn làm một cái gì đó đơn giản như thêm 1 class vào UserName input:
<!--Create an input with additional class for UserName using Html Helper-->
@Html.EditorFor(l => l.UserName, new { htmlAttributes = new { @class = "form-control" } })
<!--Create an input with additional class for UserName using Tag Helper-->
<input asp-for="UserName" class="form-control" />
Như bạn có thể thấy, phương pháp tiếp cận HTML Helper trở lên rất khó hiểu trong khi Tag Helper thì rất rõ ràng và súc tích.
Đây là 1 ví dụ đầy đủ của 1 form đăng nhập dùng HTML Helpers:
@using (Html.BeginForm("Login", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { role = "form" }))
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true, "", new { @class = "text-danger" })

    <div class="form-group">
        <div class="row">
            @Html.LabelFor(m => m.UserName, new { @class = "col-md-2 control-label" })
            <div class="col-md-10">
                @Html.TextBoxFor(m => m.UserName, new { @class = "form-control" })
                @Html.ValidationMessageFor(m => m.UserName, "", new { @class = "text-danger" })
            </div>
        </div>
    </div>
    <div class="form-group">
        <div class="row">
            @Html.LabelFor(m => m.Password, new { @class = "col-md-2 control-label" })
            <div class="col-md-10">
                @Html.PasswordFor(m => m.Password, new { @class = "form-control" })
                @Html.ValidationMessageFor(m => m.Password, "", new { @class = "text-danger" })
            </div>
        </div>
    </div>

    <div class="form-group">
        <div class="row">
            <div class="col-md-offset-2 col-md-2">
                <input type="submit" value="Log in" class="btn btn-primary" />
            </div>
        </div>
    </div>
}

Và tương tự khi sử dụng Tag Helpers:
<form asp-controller="Account" asp-action="Login" asp-route-returnurl="@ViewBag.ReturnUrl" method="post" class="form-horizontal" role="form">
    <div asp-validation-summary="ValidationSummary.All" class="text-danger"></div>
    <div class="form-group">
        <label asp-for="UserName" class="col-md-2 control-label"></label>
        <div class="col-md-10">
            <input asp-for="UserName" class="form-control" />
            <span asp-validation-for="UserName" class="text-danger"></span>
        </div>
    </div>
    <div class="form-group">
        <label asp-for="Password" class="col-md-2 control-label"></label>
        <div class="col-md-10">
            <input asp-for="Password" class="form-control" />
            <span asp-validation-for="Password" class="text-danger"></span>
        </div>
    </div>
    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Log in" class="btn btn-default" />
        </div>
    </div>
</form>
Tổng quan,  phiên bản dùng Tag Helper thì dễ đọc hơn. Tôi đặc biệt thích rằng chúng ta không còn cần dùng using statement để tạo form.
Một điều tuyệt vời khác nữa là chúng ta không cần nhớ để thêm AntiForgeryToken. Tag Helper làm điều này tự động trừ khi chúng ta tắt nó đi bằng cách sử dụng asp-anti-forgery=”false”. Tất nhiên, Visual Studio làm tốt việc highlight các thuộc tính tag helper nên dễ dàng phân biệt chúng với các thuộc tính HTML thông thường.


Chúng ta cũng có đầy đủ tính năng Intellisense bên trong các thuộc tính asp-for.

Kích hoạt Tag Helpers như thế nào
MVC Tag Helpers được đặt trong gói Microsoft.AspNet.Mvc.TagHelpers, bạn sẽ cần add reference đến nó trong file project.json. Khi đã add reference bạn có thể kích hoạt tag helpers trong tất cả view của bạn bằng cách thêm đoạn code sau đây vào _GlobalImports.cshtml.
@addTagHelper "*, Microsoft.AspNet.Mvc.TagHelpers"

Kết luận
HTML Helpers vẫn còn được hỗ trợ trong MVC 6 và bạn có thể tiếp tục sử dụng chúng như vẫn thường làm. Tôi nghĩ Tag Helpers cung cấp 1 cú pháp rõ ràng hơn, gần gũi hơn với HTML. Còn bạn thì sao?