C#

[C#] .NET MAUI Blazor - MySql DataBase Connection 과 Stored Procedure 활용 [2]

universedevelope 2024. 9. 19. 13:34

** 준비물 

- MySql (8.3)

- MySql WorkBench (8.0) -> DB 관리 툴(스키마 생성, 쿼리 작성 등..)

- Visual Studio 2022 -> .NET MAUI Blazor 프로젝트 생성

 

 

** 형상관리

- GitHub (GitHub DeskTop App 사용중입니다..)

   > 소스코드 내부에 ConnectionString 문자열을 직접 작성하지 않습니다.

   > GitHub Repository(리포지토리)를 Public (모두에게 공개) 으로 관리하시는 분들은

      DataBase ConnectionString (데이터베이스 연결문자열)을 노출하시지 않길 권장드립니다.

   > 따라서 저는 .xml 파일을 임의로 만들어서 GitHub Repository 경로가 아닌 다른 경로에 따로

      파일을 두어 해당 파일의 특정 속성값을 읽어오는 방식으로 사용합니다.

 

** 순서

- MySql WorkBench 에서 스키마 생성

  > 생성된 스키마에서 Table (테이블) 생성

  > 생성된 스키마에서 Stored Procedure (저장 프로시저) 생성

 

- Visual Studio 에서 클래스 생성

   > 생성된 클래스에서 MySqlConnection 객체 생성

      * ConnectionString 을 .xml 로 관리하고, 프로그램에서 불러오는 기능 적용

   > MysqlConnection 객체의 MySqlCommand 객체 생성

   > MySqlCommand 속성 정의 및 실행

   > 결과 반환

 

 

[Visual Studio]

* .NET MAUI Blazor 프로젝트 생성

> 솔루션에 폴더 추가 (DB)

> 클래스 추가(SqlHelper.cs)

 

 

* 거두절미 코드작성

 

//using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using MySqlConnector;


namespace Tomorrow.DB
{
    public class SqlHelper
    {
        public string mySqlconnection;

        public SqlHelper()
        {
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load("D:\\.NET_MAUI\\Settings\\applicationSettings.xml");

            #nullable disable
            XmlNode xmlKeyNode = xmlDoc.SelectSingleNode("AppSettings/DBConnection/ConnectionStrings");
            mySqlconnection = xmlKeyNode.Attributes["id"].Value;
        }

        public SqlHelper(string connectionStrings)
        {
            mySqlconnection = connectionStrings;
        }


        public DataSet GetDataSet(string SpName, Dictionary<string, object> arrParams)
        {
            DataSet result = new DataSet();
            using (MySqlConnection conn = new(mySqlconnection))
            {
                conn.Open();
                using (MySqlCommand mySqlCommand = new MySqlCommand(SpName, conn))
                {
                    mySqlCommand.CommandType = CommandType.StoredProcedure;
                    mySqlCommand.CommandTimeout = 30;
                    mySqlCommand.Parameters.AddRange(ToSqlParams(arrParams));

                    MySqlDataAdapter adapter = new MySqlDataAdapter(mySqlCommand);

                    adapter.Fill(result);
                }
                conn.Close();
            }
            return result;
        }



        public int ExecuteNonQuery(string SpName, Dictionary<string, object> arrParams)
        {
            int result = 0;

            using (MySqlConnection conn = new(mySqlconnection))
            {
                conn.Open();

                using (MySqlCommand mySqlCommand = new MySqlCommand(SpName, conn))
                {
                    mySqlCommand.CommandType = CommandType.StoredProcedure;
                    mySqlCommand.CommandTimeout = 30;
                    mySqlCommand.Parameters.AddRange(ToSqlParams(arrParams));

                    result = mySqlCommand.ExecuteNonQuery();
                }

                conn.Close();
            }

            return result;
        }

        public MySqlParameter[] ToSqlParams(Dictionary<string, object> paramSource)
        {
            MySqlParameter[] mySqlParams = new MySqlParameter[paramSource.Count];
            int i = 0;

            foreach (KeyValuePair<string, object> param in paramSource)
            {
                mySqlParams[i] = new MySqlParameter();
                mySqlParams[i].ParameterName = param.Key;
                mySqlParams[i].Value = param.Value;
                i += 1;
            }
            return mySqlParams;
        }
    }
}

 

** 주요 확인사항

01. SqlHelper 클래스의 생성자 2개

      - ConnectionString (연결문자열) 을 넘겨받지 않는 생성자

         > 내가 지정한 특정 경로에 있는 xml 파일 (D 드라이브 > .NET_MAUI > Settings > applicationSettings.xml 의

         > AppSettings / DBConnection / ConnectionStrings 노드의 

         > id 속성의 값을 가져와서 사용한다.

            # ConnectionString 을 xml로 관리하는 건 은 GitHub 형상관리 시 노출되지 않게 하고싶어서 입니다.

 

      - ConnectionString (연결문자열) 을 넘겨받는 생성자

         > 넘겨받은 문자열로 사용한다.

 

 

<?xml version="1.0" encoding="utf-8" ?>
<AppSettings id="AppSettings">
	<DBConnection>
		<ConnectionStrings id="Server=localhost;Port=3306;Database=tomorrow;Uid=아이디;Pwd=비밀번호"></ConnectionStrings>
	</DBConnection>
</AppSettings>

 

02. SqlHelper 클래스 의 구조

      - 기본적으로 저장 프로시저를 호출하게끔 설계

        > GetDataSet () 메소드

           - Select 로 마무리 되는 저장 프로시저(DB 에서 반환되는 내용이 Select 인 경우 사용)

           - DataSet 을 반환한다.

 

        > ExecuteNonQuery () 메소드

           - DML 구문(Insert, Update, Delete 로 마무리 되는 저장 프로시저(DB 에서 반환되는 내용이

             영향을 미친 행 수 인 경우 사용)

           - int 를 반환한다. (1행 영향을 받은경우 1 반환)

 

        > ToSqlParams() 메소드

           - 저장프로시저 호출 시 MySqlCommand 객체의 Parameters 에 Add 되어야 한다. 

           - GetDataSet, ExecuteNonQuery 메소드 내부에서 실행됀다.

           - MySqlParameter [] 을 반환한다.

 

[프로세스 막그림]

 

 

* SqlHelper 호출

ExecuteNonQuery를 호출합니다.

 

* 호출한 결과를 DB에서 조회

 

 

** 간단하게 구현해보았습니다.

** 감사드립니다.

728x90