Thursday, February 8, 2018

ViewData, ViewBag, TempData

ViewData:

Data travels from the controller to the view via a ViewDataDictionary. This ViewDataDictionary is a dictionary class; we call this class "ViewData".




Passes the data from the controller to the view

It is a dictionary object that is derived from ViewDataDictionary



Note: ViewData is a dictionary which can contain key-value pairs where each key must be string.




It only transfers data from controller to view, not vice-versa. It is valid only during the current request.




Points to Remember :


  1. ViewData transfers data from the Controller to View, not vice-versa.
  2. ViewData is derived from ViewDataDictionary which is a dictionary type.
  3. ViewData's life only lasts during current http request. ViewData values will be cleared if redirection occurs.
  4. ViewData value must be type cast before use.
  5. ViewBag internally inserts data into ViewData dictionary. So the key of ViewData and property of ViewBag must NOT match.
  6. Data is stored as Object in ViewData.
  7. While retrieving, the data it needs to be Type Casted to its original type as the data is stored as objects and it also requires NULL checks while retrieving.


Example:



public class FirstController : Controller{    // GET: First    public ActionResult Index()    {        ViewData["Message"] = "Hello MVC!";        return View();    }}


View:

<html>
<head>
    <meta name="viewport" content="width=device-width"/>
    <title>Index</title>
</head>
<body>
    <div>
        @ViewData["Message"]
    </div>
</body>
</html>


OutPut:



Example 2:

//Controller Code 

 public ActionResult Index()  {        List<string> Student = new List<string>();        Student.Add("Uday");        Student.Add("Rajakonda");        Student.Add("Kittu");           ViewData["Student"] = Student;        return View();  }  

View:


//page code  
foreach (var student in ViewData["Student"] as List<string>)  
        { %>  
    <li><%: student%></li>  
    <% } %>  

</ul> 



Ex:3 
public class StudentController : Controller
    {
        IList<Student> studentList = new List<Student>() { 
                    new Student(){ StudentID=1, StudentName="A", Age = 21 },
                    new Student(){ StudentID=2, StudentName="B", Age = 25 },
                    new Student(){ StudentID=3, StudentName="C", Age = 20 },
                    new Student(){ StudentID=4, StudentName="D", Age = 31 },
                    new Student(){ StudentID=5, StudentName="E", Age = 19 }
                };
        // GET: Student
        public ActionResult Index()
        {
            ViewBag.TotalStudents = studentList.Count();

            return View();
        }

    }




<label>Total Students:</label>  @ViewBag.TotalStudents




ViewBag
ViewBag is just a dynamic wrapper around ViewData. With it you don't need to write the dynamic keyword, it takes the dynamic keyword internally.
We often call ViewBag "A dynamic data library".









  • Doesn't require type casting
  • It is a dynamic property


TempData
TempData helps in maintaining data when you move from one controller to another controller. For maintaining data it uses a session variable (internally).

It is a dictionary object that is derived from ViewDataDictionary.




  •  It requires typecasting for:
    • Getting Data
    • Check NULL values
    • Avoiding Errors
  • It is used to store one time messages like
    • Error Messages
    • Validation Messages
  •  It's life is very short
  •  It's a Key-Value-Collection object






Data maintenance
This table represents the data maintenance between a controller and a view in various aspects/scenarios.




NEW Features of SQL Server

DROPIFEXISTS:

A new syntax has been introduced to check if an object exists before dropping it. Previously, if you wanted to check if a procedure existed before you dropped it, you had to write a statement like this
/****** Object:  StoredProcedure [its].[updQueueItemEmailStatus]    ******/
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[its].[updQueueItemEmailStatus]') AND type in (N'P', N'PC'))
BEGIN
DROP PROCEDURE [its].[updQueueItemEmailStatus]
END
GO

Now with 2016 you can write this as

Syntax:
DROP OBJECT_TYPE [ IF EXISTS ] OBJECT_NAME
IF EXISTS: It is an optional clause and if it is mentioned in the DROP statement then it checks the existence of the object, if it exists it will drop otherwise continues executing the next statement in the block without raising any issues.


DROP PROCEDURE IF EXISTS [its].[updQueueItemEmailStatus]

Note: Now if the stored procedure does not exists it won't throw any Error
If the stored procedure doesn’t exists it will not raise any error, it will continue executing the next statement in the batch. Let’s try to re-drop the stored procedure WelcomeMessage which is already dropped.


Example:

If the table doesn’t exists it will not raise any error, it will continue executing the next statement in the batch. Let’s try to re-drop the Table dbo.Customers which is already dropped.

If the Database doesn’t exists it will not raise any error, it will continue executing the next statement in the batch. Let’s try to re-drop the Database SqlHintsDemoDB which is already dropped.

In the similar way we can drop Schema And Views


2 JSON support

Similar like XML, SQL Server now supports the JSON format. You can for example convert tabular data to JSON using the FOR JSON clause. An example:

SELECT NAME,first_name,entity_key,name_key FROM its_name
FOR JSON AUTO


Output:





OPENJSON - OPENJSON is a table-value function, which accepts some text which includes a JSON value and returns rows in the required format. FOR JSON, converts the rows into JSON format, but OPENJSON will convert back the JSON text into a table of rows.

IsJSON (< JSON text >) - This function verifies, whether the given text is formatted according to JSON standards/rules.

JSON_Value () - This is a scalar function and it parses the JSON text then extracts a value if it exists in the path arguments. This functionality is similar to 
XPATH (XML Path) which is used for selecting nodes from XML text. In addition, XPath may be used to compute values (e.g. strings, numbers or Boolean values) from the content of an XML document.

FOR JSON PATH – We can define the JSON structure in the query by defining column alias with a dot (.) separated value (for example ‘Root.level1’). This Functionality is similar to FOR XML PATH.

Example 1: Basic FOR JSON PATH example
SELECT 'Uday' FirstName, 'Kumar' LastName ,'Rajakonda' SurName
FOR JSON PATH
Output:
[{"FirstName":"Uday","LastName":"Kumar","SurName":"Rajakonda"}]

Example 2 :Basic FOR JSON AUTO requires at-least one table for generating the JSON output
SELECT 'Uday' FirstName, 'Kumar' LastName ,'Rajakonda' SurName
FOR JSON AUTO

RESULT:
Msg 13600, Level 16, State 1, Line 10
FOR JSON AUTO requires at least one table for generating JSON objects. Use FOR JSON PATH or add a FROM clause with a table name.
From the above result it is clear that the FOR JSON AUTO clause works only if at-least one table is mentioned in the from clause.


Example 3: FOR JSON PATH/AUTO example where column names are not specified in the select list, instead * is mentioned



Example 4: FOR JSON PATH/AUTO example where required columns in the JSON output are specified in the SELECT clause

PRINT '******* FOR JSON PATH output *******'
SELECT top 5 name,name_suffix_key,entity_key FROM its_name  FOR JSON PATH
GO
PRINT '******* FOR JSON AUTO output *******'
SELECT top 5 name,name_suffix_key,entity_key FROM its_name FOR JSON AUTO


Output:




Example 5: To include NULL values in the JSON output, we need to specify the property INCLUDE_NULL_VALUES in the FOR JSON clause

Note: If this option is not specified, in case of NULL value the name-value pair will be removed from the JSON output  

PRINT '******* FOR JSON PATH output *******'
SELECT top 5 name,name_suffix_key,entity_key FROM its_name  FOR JSON PATH,INCLUDE_NULL_VALUES
GO
PRINT '******* FOR JSON AUTO output *******'
SELECT top 5 name,name_suffix_key,entity_key FROM its_name FOR JSON AUTO,INCLUDE_NULL_VALUES

Output: 


Example 6 :We can use the ROOT option in the FOR JSON clause to generate a wrapper object around the generated JSON output. In the below example the ROOT option creates a Customers JSON wrapper object around the generated JSON output:

PRINT '******* FOR JSON PATH output *******'
SELECT top 5 name,name_suffix_key,entity_key FROM its_name  FOR JSON PATH,INCLUDE_NULL_VALUES,ROOT('Names')
GO

PRINT '******* FOR JSON AUTO output *******'
SELECT top 5 name,name_suffix_key,entity_key FROM its_name FOR JSON AUTO,INCLUDE_NULL_VALUES,ROOT('Names')



Example 7: In case of FOR JSON PATH clause using “.” Symbol in the column aliases, we can name the each object in the resultant JSON array as shown below:

SELECT   name_key[Name.namekey],name[Name.name] FROM ITS_NAME FOR JSON PATH,INCLUDE_NULL_VALUES,ROOT('Names')


Output:




Using “.” symbol in the column aliases doesn’t have any effect in the resulting JSON output in case of FOR JSON AUTO as shown below:


using JSON AUTO


SELECT   name_key[Name.namekey],name[Name.name] FROM ITS_NAME FOR JSON Auto,INCLUDE_NULL_VALUES,ROOT('Names')


Output:



Example 8: We can convert each row into a JSON object with multiple sub-objects by using “.” Symbol in the column alias as shown below:

SELECT   name_key[Name.namekey],name[Name.name],entity_key[Entity.entityKey] FROM ITS_NAME FOR JSON PATH,INCLUDE_NULL_VALUES,ROOT('Names')

OutPut:



3 FORMATMESSAGE

FROM 2016, We can supply our own String
Declare @str varchar(max)
set @str=FORMATMESSAGE('Hello %s,Uday %s' ,'RajaKonda', 'Kumar')
select @str

4 STRING_SPLIT

In previous release we used to write lot of code ( we used to create a function to split the string).
Old way of writing code
Example
DECLARE @string VARCHAR(800) = '001,002,003,004'
SELECT * FROM [dbo].[fnSplitString] (@string,',')

But with sql server 2016 we can write as
DECLARE @string VARCHAR(800) = '001,002,003,004'
SELECT * FROM STRING_SPLIT (@string,',')


Output:





Monday, August 14, 2017

Why C Sharp Supports Multiple Inheritance with Interface only.

Multiple Inhertiance

A class which derived from more than one class it is called Multiple inheritance

-----------------------------------------------------------------------------------------
Example:


public class Employee
    {
        public virtual void DoWork()
        {
            //Do work
        }
    }

    public class Manager:Employee
    {
        public override void DoWork()
        {
            //Manager's implementation of do work
        }
    }

    public class Developer : Employee
    {
        public override void DoWork()
        {
            //Deveoper's implementation of do work
        }
    }

    public class JuniorDeveloper:Manager, Developer// Compile Time Error :Cannot have multiple base classes but assume that it were possible
    { }


----------------------------------------------------------------------------------


public class A
    {
        public virtual void A_Method()
        {
            Console.WriteLine("Class A Method");
        }
    }

    public class B : A
    {
        public override void A_Method()
        {
            Console.WriteLine("Class B Method");
        }
    }

    public class C : A
    {
        public override void A_Method()
        {
            Console.WriteLine("Class C Method");
        }
    }

    public class D : B, C  // If Multiple inheritence is possible in C# then
    {
        public override void A_Method()
        {
            Console.WriteLine("Class C Method");
        }
    }


    public static void main()
    {
        D objD = new D();
        objD.A_Method();// Making object of class D and calling overloaded method A_method will 
                        //confuse the compiler which class method to call as both inherited class methods has been overloaded.
    }

Explanation:
In the code above we have the A_Method()
which is defined by class A. But, the problem is that class D derives from both classes B and C, which both derive from class A. This means that there are essentially 2 copies of the A_Method()
that are available because there are 2 instances of A in D’s class hierarchy.
And the compiler will give an error and say that the reference to A_Method() is ambiguous.

-------------------------------------------------------------------------------------

Step1 Interface Definition

public interface IEmployee
{
   string GetEmployeeId();
}
The above code contains a method signature named DoWork ().
 Step 2 : Interface Implementation
As I have already defined an interface IEmployee in the above code snippet. Now if I want to implement the interface to my class Engineer as shown below.
public class Engineer:IEmployee
{

}
Step 3: 

Now if I execute the above code I will get a compile time error


-----------------------------------------------------------------------------------



Step 4:

The correct implementation of the above code is shown below



As we can see from the above code the signature of the GetEmployeeId() method in the Engineer class is same as the signature of the method in the (IEmployee)Interface.

Step 5:
Interface can only “inherit” from the interface only. Suppose if we want to extend the implementation of an interface in some part of our project without disturbing the already existing interface, in that case we can create a new interface and inherit it into new interface as shown below.

Example:

public interface Ibase1
    {
        void message();
    }
    public interface Ibase2
    {
        void message();
    }
    public class child : Ibase1, Ibase2
    {
        public void message()
        {
            Console.WriteLine("Hello Multiple Inheritance");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            child obj = new child();
            obj.message();
            Console.ReadLine();
        }
    }


Output:


Important Points to Remembers 
    Class FirstClass { }
    Class SecondClass { }

interface X { }
interface Y { }
You can inherit like the following:

class NewClass : X, Y { }
In the above code, the class "NewClass" is created from multiple interfaces.


class NewClass : FirstClass, X { }
In the above code, the class "NewClass" is created from interface X and class "FirstClass".

WRONG:

class NewClass : FirstClass, SecondClass  { }
C# doesn't support Multiple inheritance

The above code is wrong in C# because the new class is created from class "FirstClass" and class "SecondClass". The reason is that C# does not allows multiple inheritance.



Finally Note: 
Point 1: 
When we use the Multiple inheritance , we use more than one class. Lets  us Assume one condition  like below
class A and class B are base classes and class c is is multiple inherting it and where class c is inheriting a function ,ok it may be possible that this function with same name and same signature can present in both class A and Class B .That time how the compiler will know that which function it should take wheather from class A or class B.
So this time Multiple inheritanc won't work .So avoiding this problem we use Interface. In interface we just declare a function  and in derived class we write the implemenation.

Point 2:
C# does not allow multiple inheritance because of ambiguity.



Thursday, August 10, 2017

How to create crystal Reports with MVC.

Visual Studio 2015 installation will not have Crystal Reports and hence we need to  install it you can download it from the following location

Download Link



After downloading the link. Click on Open  and follow the below steps .






After installation of Crystal Reports. Let us start working on the example.
Go to Visual Studio

File-> New-Project



After clicking on ok , the below screen gets displayed: 

Select Empty and select the check box MVC




Configuring and connecting Entity Framework to database

Go to App Data to Add the DataBase as shown below

App Data--->Add--> New Item--> Sql Server DataBase 




In the visual Studio in the solution explorer you can find as shown below



Click on the Open,  the below screen gets displayed  and select New Query and execute the below script  to create the table




Script: 

CREATE TABLE [dbo].[EmployeeInfo] (
    [EmpNo]       INT          IDENTITY (1, 1) NOT NULL,
    [EmpName]     VARCHAR (50) NOT NULL,
    [Salary]      INT          NOT NULL,
    [DeptName]    VARCHAR (50) NOT NULL,
    [Designation] VARCHAR (50) NOT NULL,
    [HRA]         AS           ([Salary]*(0.2)),
    [TA]          AS           ([Salary]*(0.15)),
)

Now the table has been created , 

Go To Model Folder

Add-->New Item-->ADO.NET Entity Data Model




Give any Name and click on Add, the below screen will be displayed






And Click On Finish

Controller:

public class CrstalReportExampleController : Controller
    {
        // GET: CrstalReportExample
        public ActionResult Index()
        {
            EmployeeModel emp = new EmployeeModel();
            return View(from employee in emp.EmployeeInfoes.Take(10)
                        select employee);
        }
    }

Index.cs.html

<html>
<body>
    <h4>Employees</h4>
    <hr />
    <table cellpadding="0" cellspacing="0">
        <tr>
            <th>Employee Id</th>
            <th>Employee Name</th>
            <th>DeptName</th>  
            <th>Designation</th>  
           
        </tr>
        @foreach (WebApplication1.Models.EmployeeInfo employee in Model)
        {
            <tr>
                <td>@employee.EmpNo</td>
                <td>@employee.EmpName</td>
                <td>@employee.DeptName</td>
                <td>@employee.Designation</td>
            </tr>
        }
    </table>
    <br />
    <a href="~/Reports/WebForm1.aspx">View Report</a>
</body>
</html>

Create a new folder with the name Reports 





Right click on the folder Reports -Select -->Add-->New Item



Click on Add button

Select Standard Button as shown below



Once you press OK in the above screen  dialog, the Report Wizard starts and you get the following dialog where you need to choose the type of Database connection for your Crystal Report. 


Click on Next Button


Choose the columns which you want to display in the reports as shown below



After Clicking on Finish button the below screen gets displayed




Note now, Crystal Report works only with a Crystal Report Viewer control which is available only in ASP.Net Web Forms and hence for displaying a Crystal Report, you will need to add a Web Forms page.

Go to Reports Folder and Select Add--> New Item--> 



Now in this web form we need to add  Crystal Report Viewer control from the ToolBox as shown below




WebForm.aspx( Create this form in the Reports Folder).

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    
    </div>
        <CR:CrystalReportViewer ID="CrystalReportViewer1" runat="server" AutoDataBind="true" Height="450" Width="650"/>

    </form>
</body>
</html>


.cs

 private EmployeeModel context = new EmployeeModel();
        protected void Page_Load(object sender, EventArgs e)
        {

            
            CrystalReportViewer1.ToolPanelView = CrystalDecisions.Web.ToolPanelViewType.None;
            CrystalReport1 crystalReport = new CrystalReport1();
            List<EmployeeInfo> allemps = new List<EmployeeInfo>();
            allemps = context.EmployeeInfoes.ToList();

            crystalReport.SetDataSource(allemps);
            CrystalReportViewer1.ReportSource = crystalReport;
            //Response.Buffer = false;
            Response.ClearContent();
            //Response.ClearHeaders();
        }


Output:



After clicking on view Report



2 Example :

You can display the same report in another way as shown below

Modify the Controller code as shown below

private EmployeeModel context = new EmployeeModel();
        // GET: CrstalReportExample
        public ActionResult Index()
        {
            EmployeeModel emp = new EmployeeModel();
            return View(from employee in emp.EmployeeInfoes.Take(10)
                        select employee);
        }

        public ActionResult ExportCustomers()
        {

            List<EmployeeInfo> allemps = new List<EmployeeInfo>();
            allemps = context.EmployeeInfoes.ToList();


            ReportDocument rd = new ReportDocument();
            rd.Load(Path.Combine(Server.MapPath("~/Reports"), "CrystalReport1.rpt"));

            rd.SetDataSource(allemps);

            Response.Buffer = false;
            Response.ClearContent();
            Response.ClearHeaders();


            Stream stream = rd.ExportToStream(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat);
            stream.Seek(0, SeekOrigin.Begin);
            return File(stream, "application/pdf", "EmployeeList.pdf");
        }

In the index.cs.html add the below line


<div><a href="@Url.Action("ExportCustomers")"> View Crystal Report </a></div>



output





Kubernetes

Prerequisites We assume anyone who wants to understand Kubernetes should have an understating of how the Docker works, how the Docker images...