블로그 이미지
따시쿵

calendar

1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

Notice

2015. 7. 15. 11:23 C# with LINQ to SQL

SqlMetal 은 LINQ-to-SQL class 를 만드는 command-line 코드 생성기 툴입니다. 실행 파일입니다.

 

LINQ-to-SQL class 를 만드는 두 가지 방법은 아래와 같습니다.

  • Visual Studio
  • SqlMetal command-line code generator
1. SqlMetal 파일 위치 입니다.

 

C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin

 

2. 관리자 권한으로 Visual Studio Command Prompt 를 실행 시킵니다. 

 

 

3. 새로 생성될 dbml 파일을 저장할 폴더를 하나 만듭니다.

 

D:\win_project\winformapp4\SqlMetalFile

 

4. sqlmetal 을 이용해서 dbml 파일을 만듭니다.

 

예제는 지금까지 사용한 northwind database 를 dbml 파일로 만드는 과정을 보여 줍니다.

 

 

SqlMetal 에 대한 자세한 정보는 아래 사이트를 참조하시기 바랍니다.

https://msdn.microsoft.com/ko-kr/library/bb386987(v=vs.110).aspx

 

5. Visual Studio 를 실행하고 windows form 으로 프로젝트를 만들고, 화면에 dataGridView control 를 추가합니다.

 

northwind 디비에 있는 employees 테이블을 모두 가져와서 화면에 보여 주는 작업을 할 것입니다.

 

 

6. app.Config 파일에 northwind 디비를 연결하는 connection string 을 설정합니다.

 



  
    
  
     
        
    

 

 

7. 4번 단계에서 생성한 dbml 파일을 [프로젝트] => [추가] => [기존 항목]으로 프로젝트에 import 시킵니다.

 

 

8. 폼 로드시에 employees 테이블을 가져와서 화면에 보여 줍니다.

 

        private void Form1_Load(object sender, EventArgs e)
        {
            string connectinstring = ConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString;

            using(NorthwindDataContext dbConext = new NorthwindDataContext(connectinstring))
            {
                dataGridView1.DataSource = dbConext.Employees;
            }
        }

 

 

 

소스 파일

 MyLINQ10.zip

 

posted by 따시쿵
2015. 7. 9. 10:57 C# with LINQ to SQL

이번 포스트를 위해서 기존에 사용하던 프로그램을 MDI 폼으로 수정을 했으며,

메뉴 상단에 [Table] 이란 메뉴를 추가해서 기존에 테스트로 사용하던 [Customer] 테이블을 조회하는 화면과, 이번 포스트에 사용하기 위해서 새로 만든 [Order] 폼 화면을 추가했습니다.

 

전체소스는 맨 하단에서 다운 받으면 됩니다.

 

1. 예제 시나리오

 

주문자 테이블을 전체 가져와서, 판매자 정보를 out parameter 로 가져오고, 주문 상세 정보를 datagridview 에 보여주는 방식입니다. 이해를 돕기 위해서 완료된 화면부터 확인 하세요. 

 

상단의 [주문정보] 테이블에서 셀 안에 있는 정보(문자)를 더블클릭을 [판매자 정보]와 [주문 상세정보]를 가져옵니다. 마스터 테이블에는 [EmployeeID] 필드만 있어서 판매자의 이름과, 직위, 생일, 입사일을 보여 줍니다.

 

2. stored procedure 를 만듭니다.

CREATE PROCEDURE dbo.GetOrderDetailsInfo
@OrderID int,
@EmployeeID int,
@LastName nvarchar(20) out,
@FirstName nvarchar(10) out,
@Title nvarchar(30) out,
@BirthDate nchar(10) out,
@HireDate nchar(10) out
AS
BEGIN
	
	SET NOCOUNT ON;

    -- 1. 판매자 정보를 가져 옵니다.
	SELECT @LastName = LastName, @FirstName = FirstName, @Title = Title, 
			@BirthDate = CONVERT(nchar(10), BirthDate, 120),
			@HireDate = CONVERT(nchar(10), HireDate, 120)
	FROM [dbo].[Employees]
	WHERE [EmployeeID] = @EmployeeID

	-- 2. 주문 상세정보를 가져 옵니다.
	SELECT OrderID, ProductID, UnitPrice, Quantity, Discount
	FROM [dbo].[Order Details]
	WHERE [OrderID] = @OrderID
END

 

 

 

3. 스토어드 프로시저를 테스트 합니다.

DECLARE @LastName nvarchar(20) ,@FirstName nvarchar(10) , @Title nvarchar(30), @BirthDate nchar(10), @HireDate nchar(10)
EXECUTE dbo.GetOrderDetailsInfo 10248, 5, @LastName out, @FirstName out, @Title out, @BirthDate out, @HireDate out
SELECT @LastName + ':' + @FirstName + ':' + @Title + ':' + @BirthDate + ':' + @HireDate

 

 

4. Visual Studio 로 돌아와서 dbml 파일을 열고, 2번에서 만든 스토어드 프로시저를 선택하고 프로그램에 포함 시킵니다.

 

그리고, [주문 정보] datagridview control 의 이벤트 중에  CellContentDoubleClick 를 추가하고 다음의 소스를 붙여넣기 합니다.

        #region Row double click event
        private void dataGridView1_CellContentDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex >= 0)
            {
                DataGridViewRow row = this.dataGridView1.Rows[e.RowIndex];

                //디버깅 용도로 사용함    
                string displayStr = row.Cells["OrderID"].Value.ToString() + "-" + row.Cells["EmployeeID"].Value.ToString();
                Trace.Listeners.Add(new TextWriterTraceListener(Console.Out));
                Trace.AutoFlush = true;
                Trace.WriteLine(displayStr);        // 출력창에 sql 문을 출력하는 명령문
                
                int OrderID = Convert.ToInt32(row.Cells["OrderID"].Value.ToString());
                int EmployeeID = Convert.ToInt32(row.Cells["EmployeeID"].Value.ToString());

                string Employee_LastName    = string.Empty;
                string Employee_FirstName   = string.Empty;
                string Employee_Title       = string.Empty;
                string Employee_BirthDate   = string.Empty;
                string Employee_Hiredate    = string.Empty;

                using(northwindDataContext dbContext = new northwindDataContext())
                {
                    // call stored procedure and assign the datagridview detail control 
                    // and display the out parameters data in the screen.
                    dataGridView2.DataSource = dbContext.GetOrderDetailsInfo(OrderID, EmployeeID, 
                                                                            ref Employee_LastName, ref Employee_FirstName, 
                                                                            ref Employee_Title, ref Employee_BirthDate, 
                                                                            ref Employee_Hiredate);

                    textEmployeeID.Text     = row.Cells["EmployeeID"].Value.ToString();
                    textLastName.Text       = Employee_LastName;
                    textFirstName.Text      = Employee_FirstName;
                    textTitle.Text          = Employee_Title;
                    textBirthDate.Text      = Employee_BirthDate;
                    textHireDate.Text       = Employee_Hiredate;
                }
            }
        }
        #endregion

 

 

소스 파일

MyLINQ9.zip

 

posted by 따시쿵
2015. 7. 7. 10:47 C# with LINQ to SQL
1. 사용할 스토어드 프로시저 작성 합니다.

 

CREATE PROCEDURE dbo.InsertCustomers
@CustomerID nchar(5), 
@CompanyName nvarchar(40), 
@ContactName nvarchar(30), 
@ContactTitle nvarchar(30), 
@Address nvarchar(60), 
@City nvarchar(15), 
@Region nvarchar(15), 
@PostalCode nvarchar(10), 
@Country nvarchar(15), 
@Phone nvarchar(24), 
@Fax nvarchar(24)
AS
BEGIN

	SET NOCOUNT ON;

	INSERT INTO [dbo].[Customers](CustomerID, CompanyName, ContactName, ContactTitle, [Address], City, Region, PostalCode, Country, Phone, Fax)
	VALUES(@CustomerID, @CompanyName, @ContactName, @ContactTitle, @Address, @City, @Region, @PostalCode, @Country, @Phone, @Fax);
END
GO


CREATE PROCEDURE dbo.UpdateCustomers
@CustomerID nchar(5), 
@CompanyName nvarchar(40), 
@ContactName nvarchar(30), 
@ContactTitle nvarchar(30), 
@Address nvarchar(60), 
@City nvarchar(15), 
@Region nvarchar(15), 
@PostalCode nvarchar(10), 
@Country nvarchar(15), 
@Phone nvarchar(24), 
@Fax nvarchar(24)
AS
BEGIN

	SET NOCOUNT ON;

	UPDATE [dbo].[Customers]
	SET CompanyName = @CompanyName, 
		ContactName = @ContactName, 
		ContactTitle = @ContactTitle, 
		[Address] = @Address, 
		City = @City, 
		Region = @Region, 
		PostalCode = @PostalCode, 
		Country = @Country, 
		Phone = @Phone, 
		Fax = @Fax
	WHERE CustomerID = @CustomerID;
END
GO

CREATE PROCEDURE dbo.DeleteCustomers
@CustomerID nchar(5)
AS
BEGIN

	SET NOCOUNT ON;

	DELETE FROM [dbo].[Customers] WHERE CustomerID = @CustomerID;
END
GO

 

 

2. [서버 탐색기]를 펼쳐서 위에서 생성한 프로시저를 찾아서 오른쪽 윈도우창에 드래그&드랍 시킵니다.

  

 

3. [동작 구성] 설정창에서 stored procedure 이름을 선택해 줍니다. 

 

 

4. SQL Server Management Studio 을 열어서 프로파일러를 실행 합니다. 그리고 프로그램을 실행해서 insert, update, delete 를 실행하고, 다시 프로파일러에서 캡쳐한 부분을 확인해 보면 우리가 작성한 프로시저가 실행 된 것을 확인 할 수 있습니다.

 

화면 캡쳐는 insert 연산만 챕쳐 했습니다. 

 

 

전체 소스

MyLINQ9.zip

 

 

posted by 따시쿵
2015. 7. 6. 11:54 C# with LINQ to SQL

이번 장에서는 스토어드 프로시져를 호출하는 방법과 호출된 sql 문을 확인 해 보도록 하겠습니다.

 

1. 스토어드 프로시서를 생성합니다.

CREATE PROCEDURE dbo.GetCustomers
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;


	select CustomerID, CompanyName, ContactName, ContactTitle, Address, City, Region, PostalCode, Country, Phone, Fax
	from [dbo].[Customers]
END
GO

 

2. [서버 탐색기]를 펼쳐서 위에서 생성한 프로시저를 찾아서 오른쪽 윈도우창에 드래그&드랍 시킵니다.

 

3. 프로그램 쿼리문을 스토어 프로시저를 호출하는 구문으로 변경합니다.

        #region Select ALL
        private void GetData()
        {
            northwindDataContext dbContext = new northwindDataContext();
            dataGridView1.DataSource = dbContext.GetCustomers();    // 스토어 프로시저 호출하는 구문
        }
        #endregion

 

 

4. [SQL Server Management Studio] 에서 [도구]창에서 [SQL Profiler]를 실행 한 후, 프로그램을 실행해서 생성된 sql 문을 확인 해 봅니다. 

 

 

5. 스토어드 프로시저가 프로그램에 포함되는 형태입니다.

 

실제로 프로시저가 northwind.designer.cs 파일에 아래와 같이 포함되어 있습니다.

		[global::System.Data.Linq.Mapping.FunctionAttribute(Name="dbo.GetCustomers")]
		public ISingleResult<Customers> GetCustomers()
		{
			IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())));
			return ((ISingleResult<Customers>)(result.ReturnValue));
		}

 

 

전체 소스

MyLINQ9.zip

 

posted by 따시쿵
2015. 7. 2. 17:55 C# with LINQ to SQL

이번 포스트에서는 LINQ to SQL 에서 생성 된 sql 문을 확인 해 보도록 하겠습니다.

 

windows form 타입을 기준으로 알아 보도록 하겠습니다.

1. dbContext.Log = Console.Out;

 

가장 간단하게는 다음과 같이 작업해 주시면 됩니다.

            northwindDataContext dbContext = new northwindDataContext();
            dbContext.Log = Console.Out;    // 출력창에 sql 문을 출력하는 명령문
            dataGridView1.DataSource = dbContext.Customers;

 

 

[Get Data] 버튼을 클릭시 출력창에 나오는 sql 문입니다.

 

만약 웹 페이지에서 작업을 한다면 위 구문을 다음으로 변경합니다.

dbContext.Log = Response.Out;

 

 

2. 문자열을 Trace.WriteLine 을 이용해서 출력창에 쿼리문을 보이는 방법

 

1번 쿼리와 데이타 쿼리 결과가 같으며 출력창에 보이는 쿼리도 같습니다.

            northwindDataContext dbContext = new northwindDataContext();

            var linqQuery = from customer in dbContext.Customers
                            select customer;
            string strQuery = linqQuery.ToString();

            Trace.Listeners.Add(new TextWriterTraceListener(Console.Out));  
            Trace.AutoFlush = true;
            Trace.WriteLine(strQuery);        // 출력창에 sql 문을 출력하는 명령문          

            dataGridView1.DataSource = linqQuery;

 

 

3. DataContext.GetCommand.CommandText 를 이용하는 방법

            northwindDataContext dbContext = new northwindDataContext();

            var linqQuery = from customer in dbContext.Customers
                            select customer;

            string strQuery = dbContext.GetCommand(linqQuery).CommandText;

            Trace.Listeners.Add(new TextWriterTraceListener(Console.Out)); 
            Trace.AutoFlush = true;
            Trace.WriteLine(strQuery);      // 출력창에 sql 문을 출력하는 명령문

            dataGridView1.DataSource = linqQuery;

 

 

 

4. SQL Profiler를 이용하는 방법

 

위에서 설명한 방법들이 프로그램 파트에서 이루어진 부분이라면 지금은 디비 파트에서 실행되는 명령어를 프로파일러를 이용해서 캡쳐한 것입니다.

 

어떤 방법을 이용하든 생성된 sql 문은 동일합니다.

 

전체 소스

MyLINQ9.zip

 

posted by 따시쿵
2015. 7. 1. 14:27 C# with LINQ to SQL

이번 포스트에서는 datagridview control 에 데이타를 select, insert, update, delete 시키는 모든 연산을 sql db 의 northwind db를 이용해서 작업해 보도록 하겠습니다.

 

일단은 sql 2012 의 norhwind db를 다음의 사이트에서 다운로드를 받아서 설치를 합니다.

http://businessimpactinc.com/install-northwind-database/

 

최종적인 결과 화면입니다.

 

1. LINQ to SQL 클래스 만들기

 

프로젝트 선택 => [추가] => [새항목] => [데이타] =>[LINQ to SQL 클래스] 선택하고 이름을 "northwind" 라 입력을 합니다.

 

그리고, 테이블을 모두 drag & drop 으로 끌어다 좌측 윈도우에 위치 시키며, 스토어 프로시저를 끌어다 오른쪽 창에 위치 시킵니다.

 

이제, northwind.dbml 파일 하단에 있는 northwind.designer.cs 파일을 열고 확인 해 보면,

맨 상단에 northwindDataContext 클래스가 있으며 하단으로 테이블명으로 되어 있는 클래스들을 확인 할 수 있습니다.

 

이번 예제에서는 Customers 테이블에 연산하는 것을 예시로 보입니다.

 

2. select

 

[Get Data] 버튼을 클릭했을 시 보이는 method, 모든 데이타를 가져옵니다.

            northwindDataContext dbContext = new northwindDataContext();

            dataGridView1.DataSource = dbContext.Customers;

 

3. insert

 

[Insert] 버튼 클릭시 작동하는 method 입니다.

            using (northwindDataContext dbContext = new northwindDataContext())
            {
                var userInfo = dbContext.Customers.Where(u => u.CustomerID == textCustomerID.Text);
                if (userInfo.Count() > 0)
                {
                    MessageBox.Show("[CustomerID] 가 중복입니다. 다른 것으로 변경하시기 바랍니다.", "에러", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                else
                {
                    Customers customer = new Customers
                    {
                        CustomerID = textCustomerID.Text,
                        CompanyName = textCompanyName.Text,
                        ContactName = textContactName.Text,
                        ContactTitle = textContactTitle.Text,
                        Address = textAddress.Text,
                        City = textCity.Text,
                        Region = textRegion.Text,
                        PostalCode = textPostalCode.Text,
                        Country = textCountry.Text,
                        Phone = textPhone.Text,
                        Fax = textFax.Text
                    };

                    dbContext.Customers.InsertOnSubmit(customer);
                    dbContext.SubmitChanges();

                    GetData();
                }
            }

 

 

4. update

 

[Update] 버튼 클릭시 작동하는 method 입니다.

            using (northwindDataContext dbContext = new northwindDataContext())
            {
                Customers customer = dbContext.Customers.SingleOrDefault(x => x.CustomerID == textCustomerID.Text);
                customer.CompanyName = textCompanyName.Text;
                dbContext.SubmitChanges();                
            }

            GetData();

 

 

5. delete

 

[Delete] 버튼 클릭시 작동하는 method 입니다.

            using (northwindDataContext dbContext = new northwindDataContext())
            {
                try
                {
                    Customers customer = dbContext.Customers.SingleOrDefault(x => x.CustomerID == textCustomerID.Text);
                    dbContext.Customers.DeleteOnSubmit(customer);
                    dbContext.SubmitChanges();
                }
                catch(ArgumentNullException ex)
                {
                    MessageBox.Show(ex.Message, "에러", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }

            GetData();

 

 

 

전체 소스 

MyLINQ9.zip

 

posted by 따시쿵
prev 1 next