SQL Server - ③ : 테이블에 데이터 추가하기(INSERT)
지난번에 생성한 테이블을 바탕으로 오늘은 데이터(행)를 추가해보겠습니다.
단순히 문자열만으로 구성된 INSERT 쿼리문만을 작성하면 지난번과 비슷하기 때문에 매개변수화된 쿼리문을 작성해서 데이터를 삽입(INSERT)해 보겠습니다.
또한, 명령줄인수라는 기능을 통해 프로그램 실행시 DB관련 문자열을 전달받아서 좀 더 사용자 친화적인 프로그램을 만들어 보겠습니다.
오늘 실습에 사용할 WinForm의 형태는 아래와 같습니다.
✅ 오늘 정리할 내용 ✅
1️⃣ 명령줄인수를 통해 App.config에 있는 DB 연결 문자열의 Tag Name을 전달받기.
2️⃣ 매개변수화된 쿼리문을 작성해서 테이블에 데이터를 INSERT 하기.
1. 명령줄인수를 통해 App.config에 있는 Tag Name을 전달받기
그동안 App.config에 있는 DB 연결 문자열을 읽어들이기 위해서 직접 TagName을 코드에 입력하였습니다.
ConnectionString = ConfigurationManager.ConnectionStrings["MSSQL"].ConnectionString;
하지만 이러한 방식은 TagName이 바뀔때마다 매번 코드를 변경해주어야하는 번거로움이 발생합니다.
따라서 명령줄인수라는 기능을 활용해서 코드를 직접적으로 수정하지 않아도 TagName을 전달받을 수 있도록 하겠습니다.
명령줄인수란?
실행파일을 실행시킬때 문자열의 배열형태로 전달되는 매개 변수
① 먼저 명령줄인수 칸에 해당 TagName을 입력합니다.
명령줄인수창은 작업중인 네임스페이스의 상위인 어셈블리를 우클릭 후 속성창에 들어갑니다.
그리고 디버그탭을 눌러서 가운데에 위치한 명령줄 인수에 App.config에 있는 TagName을 적도록 합니다.
저는 DB 연결 문자열이 적혀있는 app.config의 Tag name이 "MSSQL"이기 때문에 위와 같이 작성하였습니다.
<add name="MSSQL" connectionString="server=127.0.0.1,1433; user id=sa; pwd=1; database=Practice_Yhyou_DB;Encrypt=True;TrustServerCertificate=True;"/>
② 프로그램의 시작점(Program.cs)에서 해당 명령줄 인수의 문자열을 전달 받도록 합니다.
✅ Environment.GetCommandLineArgs() 메서드는 명령줄 인수의 매개 변수의 값을 뽑아줍니다.
아래의 두개의 코드를 참고해서 어떠한 방식으로 명령줄 인수의 문자열의 배열형태를 뽑아내는지 확인해보세요!!
만약 위의 코드를 잘 비교해보셨다면 한가지 의문점이 들수도 있습니다.
❓❓ ProgramArgs[0]에는 어떠한 값이 들어 갈까??
✅ ProgramArgs[0]에는 실행파일의 경로가 들어가게 됩니다. 아래를 참고하세요 😀
이렇게 저장한 문자열은 아래와 같이 Form1의 string 타입 변수에 저장해서 연결 문자열을 뽑아내는데 사용하였습니다.
public static string DatabaseConnectName { get => databaseConnectName; set => databaseConnectName = value; }
// ....................................... 중 략 ....................................... //
ConnectionString = ConfigurationManager.ConnectionStrings[DatabaseConnectName].ConnectionString;
2. 매개변수화된 쿼리문을 작성해서 테이블에 데이터를 INSERT 하기
지난 시간에는 단순히 문자열을 연결한 형태로 쿼리문을 구성하였습니다.
하지만 이와 같은 방법은 크게 2가지의 문제점이 발생한다고 합니다.
1️⃣ 보안에 취약하다.
2️⃣ 서버측의 쿼리 수행 성능 저하를 야기시킨다.
따라서 매개변수화된 쿼리를 사용해서 위와 같은 문제점을 해결한다고 합니다!!
먼저 이번 실습에 사용할 TABLE의 구성은 아래와 같습니다.
CREATE TABLE [dbo].[USER](
[Id] [varchar](50) NOT NULL PRIMARY KEY,
[Name] [nvarchar](50) NOT NULL,
[Age] [tinyint] NOT NULL,
[Address] [nvarchar](max) NOT NULL,
[Birth] [date] NOT NULL,
[CreateDate] [datetime] NULL DEFAULT GETDATE()
)
대충 아래와 같은 데이터가 입력되게 됩니다.
① SqlParameter 객체를 생성해서 값 저장하기
테이블의 한 행을 구성할 ID, NAME, AGE, ADDRESS, BIRTH의 값을 FORM으로 부터 전달 받고,
이를 SqlParameter 객체의 값(Value)에 저장합니다.
//@Id 파라미터 준비
SqlParameter paraId = new SqlParameter("Id", SqlDbType.VarChar, 50);
paraId.Value = tb_id.Text;
// Name 파라미터 준비
SqlParameter paraName = new SqlParameter("Name", SqlDbType.NVarChar, 50);
paraName.Value =tb_name.Text;
// Age 파라미터 준비
SqlParameter paraAge = new SqlParameter("Age", SqlDbType.TinyInt);
paraAge.Value = tb_age.Text;
// Address 파라미터 준비
SqlParameter paraAddress = new SqlParameter("Address", SqlDbType.NVarChar);
paraAddress.Value = tb_address.Text;
// Birth 파라미터 준비
SqlParameter paraBirth = new SqlParameter("Birth", SqlDbType.Date);
paraBirth.Value = dtp_birth.Value.ToString("yyyy-MM-dd");
✅ Birth의 경우 WinForm에서 "DateTimePicker"라는 컴포넌트를 사용했기 때문에 DEFAULT 값으로는 "yyyy-MM-dd-hh-mm-ss" 형태로 출력하게 됩니다.
따라서 ToString 매서드를 통해 "yyyy-MM-dd"로 간단하게만 출력하도록 변환해주었습니다.
② SqlParameter객체를 SqlCommand 객체의 Parameters 속성에 추가하기
// cmd.Parameters 컬렉션에 SqlParameter 개체 추가
cmd2.Parameters.Add(paraId);
cmd2.Parameters.Add(paraName);
cmd2.Parameters.Add(paraAge);
cmd2.Parameters.Add(paraAddress);
cmd2.Parameters.Add(paraBirth);
③ @를 사용해서 매개변수화된 쿼리문(INSERT) 작성하고 쿼리문 수행하기
@를 사용해서 행을 구성하는 값(VALUES)에 매개변수형태로 구성하였습니다.
(저는 먼저 SqlParameter 객체를 만들어서 SqlCommand 객체에 추가한 후 쿼리문을 작성하였지만,
반대로 쿼리문을 먼저 작성하고 SqlParameter 객체를 만들어서 매개변수값을 저장해주어도 상관은 없습니다.)
cmd2.CommandText = "INSERT INTO [DBO].[" + cb_tableName.SelectedItem + "] (ID, NAME, AGE, ADDRESS, BIRTH) VALUES (@Id, @Name, @Age, @Address, @Birth);";
// 정상적으로 쿼리문이 입력되면 반영된 행의 수가 리턴값으로 들어온다.
int a = cmd2.ExecuteNonQuery();
if (a > 0)
{
MessageBox.Show(String.Format("쿼리문이 정상적으로 입력되었습니다. 반영된 행의 갯수는 {0}개 입니다", a));
tb_id.Text = tb_age.Text = tb_address.Text = tb_name.Text = "";
}
else MessageBox.Show("쿼리문이 반영되지 않았습니다. 다시 한번 확인해주세요.");
ExecuteNonQuery()가 정상적으로 처리되면 반영된 행의 갯수를 리턴해줍니다.
코드 전문(파일)
다음에는 위의 테이블을 조회하는 간단한 프로시저를 만들어 보고 C#에서 프로시저를 통해 테이블을 조회(SELECT)하는 과정을 정리해보도록 하겠습니다. 😁
댓글