블로그 이미지
따시쿵

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 31

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. 14. 16:49 C# with Excel

엑셀 데이타를 프로그램에서 읽어 들여서 datagridview 에 보이는 예제입니다.

최종 화면부터 확인하겠습니다.

 

 

1. 필요한 네임스페이스 포함 시킵니다.

 

using System.IO;
using System.Data;
using System.Data.OleDb;

 

2. 엑셀 파일 연결을 위한 connection string 을 만듭니다.

 

엑셀 버전이 97-2003 과 2007 ( 더 높은 버전) 은 다른 커넥션 스트링을 사용하는데, 전자는 Microsoft Jet Engine 을 사용하고, 후자는 Microsoft Ace Engine 을 사용합니다. 

 

그래서 다음과 같이 두 개의 커넥션 스트링을 만들어서 파일 버전에 따라서 연결 스트링을 다르게 사용합니다.

 

private string Excel03ConString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='Excel 8.0;HDR={1}'";
private string Excel07ConString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 8.0;HDR={1}'";

 

3. 엑셀 파일을 선택하기 위해서 openFileDialog control 을 추가하고 click 이벤트에 파일 선택창을 띄웁니다.
        private void btnSelect_Click(object sender, EventArgs e)
        {
            openFileDialog1.ShowDialog();
        }

 

4. 엑셀 데이타를 datagridview 에 보이게 합니다.

 

엑셀 파일이 선택 되자마자 1. 엑셀 파일의 전체 path 를 포함하는 파일 이름을 가져오고 2. 파일 이름에서 확장자를 따로 떼어서 구번전인지 신버전인지를 체크 합니다. 그리고 파일 버전에 맞게 연결 스트링을 선택합니다.

 

datagridview 에 헤더를 포함할지 말지를 선택하는 구분이 있습니다.

 

엑셀의 첫번째 파일 쉬트으 이름을 알아내고, 쉬트 데이타를 DataTable 에 저장하고 이것을 DataGridView Control 에 최종적으로 보이게 합니다.

 

        private void openFileDialog1_FileOk(object sender, CancelEventArgs e)
        {
            string filePath = openFileDialog1.FileName;
            string fileExtension = Path.GetExtension(filePath);
            string header = rbHeaderYes.Checked ? "Yes" : "No";
            string connectionString = string.Empty;
            string sheetName = string.Empty;

            // 확장자로 구분하여 커넥션 스트링을 가져옮
            switch(fileExtension)
            {
                case ".xls":    //Excel 97-03
                    connectionString = string.Format(Excel03ConString, filePath, header);
                    break;
                case ".xlsx":  //Excel 07
                    connectionString = string.Format(Excel07ConString, filePath, header);
                    break;
            }

            // 첫 번째 시트의 이름을 가져옮
            using (OleDbConnection con = new OleDbConnection(connectionString))
            {
                using (OleDbCommand cmd = new OleDbCommand())
                {
                    cmd.Connection = con;
                    con.Open();
                    DataTable dtExcelSchema = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                    sheetName = dtExcelSchema.Rows[0]["TABLE_NAME"].ToString();
                    con.Close();
                }
            }
            Console.WriteLine("sheetName = " + sheetName);

            // 첫 번째 쉬트의 데이타를 읽어서 datagridview 에 보이게 함.
            using (OleDbConnection con = new OleDbConnection(connectionString))
            {
                using (OleDbCommand cmd = new OleDbCommand())
                {
                    using (OleDbDataAdapter oda = new OleDbDataAdapter())
                    {
                        DataTable dt = new DataTable();
                        cmd.CommandText = "SELECT * From [" + sheetName + "]";
                        cmd.Connection = con;
                        con.Open();
                        oda.SelectCommand = cmd;
                        oda.Fill(dt);
                        con.Close();

                        //Populate DataGridView.
                        dataGridView1.DataSource = dt;
                    }
                }
            }
        }

 

소스 파일 :

MyExcel1.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 따시쿵