2023년 9월 14일 목요일

javascript - (Web) 브라우저 뒤로가기 막기 (히스토리를 이용)

 


Javascript로 뒤로가기 막기

(히스토리를 이용해서 막기)


history.pushState(null, null, location.href);

    window.onpopstate = function () {

        history.go(1);

};


2023년 8월 8일 화요일

javascript - location.reload() submit()



1. (b)팝업창에서 (a)부모창 Reload 하기

    parent.opener.location.reload();
    window.close();

    * 함수 호출도 가능
    * parent.opener.function-name();


2. (c)아이프레임(iframe)에서 (a)부모창 Submit 하기

    parent.document.form-name.submit();

    * 함수 호출도 가능
    * parent.function-name();


3. (a)부모창에서 (c)아이프레임(iframe)에서 특정 태그 값 가지고 오기

    var chkList = $("#iframe1").contents().find("input:checkbox[name='code1']:checked");
    var val1 = $("#iframe2").contents().find("#val1").val();





2023년 8월 7일 월요일

javascript - SheetJS (JS로 엑셀 파일 쓰기)


[JS로 엑셀 파일 쓰기]

https://github.com/kkaok/examples/blob/master/jsExcelExample/src/main/resources/static/html/sheetjs-create-xlsx-aoa.html

https://github.com/kkaok/examples/blob/master/jsExcelExample/src/main/resources/static/html/sheetjs-create-xlsx-json.html

https://github.com/kkaok/examples/blob/master/jsExcelExample/src/main/resources/static/html/sheetjs-create-xlsx-table.html

https://github.com/kkaok/examples/blob/master/jsExcelExample/src/main/resources/static/html/sheetjs-create-xlsx.html



[소스]

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>sheetjs create xlsx excel example(json)</title>
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.14.3/xlsx.full.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/1.3.8/FileSaver.min.js"></script>
<script>
//공통
// 참고 출처 : https://redstapler.co/sheetjs-tutorial-create-xlsx/
function s2ab(s) { 
    var buf = new ArrayBuffer(s.length); //convert s to arrayBuffer
    var view = new Uint8Array(buf);  //create uint8array as viewer
    for (var i=0; i<s.length; i++) view[i] = s.charCodeAt(i) & 0xFF; //convert to octet
    return buf;    
}
function exportExcel(){ 
    // step 1. workbook 생성
    var wb = XLSX.utils.book_new();

    // step 2. 시트 만들기 
    var newWorksheet = excelHandler.getWorksheet();
    
    // step 3. workbook에 새로만든 워크시트에 이름을 주고 붙인다.  
    XLSX.utils.book_append_sheet(wb, newWorksheet, excelHandler.getSheetName());

    // step 4. 엑셀 파일 만들기 
    var wbout = XLSX.write(wb, {bookType:'xlsx',  type: 'binary'});

    // step 5. 엑셀 파일 내보내기 
    saveAs(new Blob([s2ab(wbout)],{type:"application/octet-stream"}), excelHandler.getExcelFileName());
}
$(document).ready(function() { 
    $("#excelFileExport").click(function(){
        exportExcel();
    });
});
</script>
<script>
var excelHandler = {
        getExcelFileName : function(){
            return 'json-test.xlsx';
        },
        getSheetName : function(){
            return 'Json Test Sheet';
        },
        getExcelData : function(){
            return [{'상품명':'삼성 갤럭시 s11' , '가격':'200000'}, {'상품명':'삼성 갤럭시 s12' , '가격':'220000'}, {'상품명':'삼성 갤럭시 s13' , '가격':'230000'}]; 
        },
        getWorksheet : function(){
            return XLSX.utils.json_to_sheet(this.getExcelData());
        }
}
</script>
</head>
<body>
파일 내보내기(JSON) : <input type="button" id="excelFileExport" value="엑셀 파일 다운로드(JSON)" />
</body>
</html>


javascript - SheetJS (JS로 엑셀 파일 읽기)

 

[JS로 엑셀 파일 읽기]

https://github.com/kkaok/examples/blob/master/jsExcelExample/src/main/resources/static/html/js-excel-example01.html

https://github.com/kkaok/examples/blob/master/jsExcelExample/src/main/resources/static/html/js-excel-example02.html

https://github.com/kkaok/examples/blob/master/jsExcelExample/src/main/resources/static/html/js-excel-example03.html



[소스]

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>js excel example 03</title>
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.14.3/xlsx.full.min.js"></script>
<script>
function excelExport(event){
	excelExportCommon(event, handleExcelDataAll);
}
function excelExportCommon(event, callback){
    var input = event.target;
    var reader = new FileReader();
    reader.onload = function(){
        var fileData = reader.result;
        var wb = XLSX.read(fileData, {type : 'binary'});
        var sheetNameList = wb.SheetNames; // 시트 이름 목록 가져오기 
        var firstSheetName = sheetNameList[0]; // 첫번째 시트명
        var firstSheet = wb.Sheets[firstSheetName]; // 첫번째 시트 
        callback(firstSheet);      
    };
    reader.readAsBinaryString(input.files[0]);
}
function handleExcelDataAll(sheet){
	handleExcelDataHeader(sheet); // header 정보 
	handleExcelDataJson(sheet); // json 형태
	handleExcelDataCsv(sheet); // csv 형태
	handleExcelDataHtml(sheet); // html 형태
}
function handleExcelDataHeader(sheet){
    var headers = get_header_row(sheet);
    $("#displayHeaders").html(JSON.stringify(headers));
}
function handleExcelDataJson(sheet){
    $("#displayExcelJson").html(JSON.stringify(XLSX.utils.sheet_to_json (sheet)));
}
function handleExcelDataCsv(sheet){
    $("#displayExcelCsv").html(XLSX.utils.sheet_to_csv (sheet));
}
function handleExcelDataHtml(sheet){
    $("#displayExcelHtml").html(XLSX.utils.sheet_to_html (sheet));
}
// 출처 : https://github.com/SheetJS/js-xlsx/issues/214
function get_header_row(sheet) {
    var headers = [];
    var range = XLSX.utils.decode_range(sheet['!ref']);
    var C, R = range.s.r; /* start in the first row */
    /* walk every column in the range */
    for(C = range.s.c; C <= range.e.c; ++C) {
        var cell = sheet[XLSX.utils.encode_cell({c:C, r:R})] /* find the cell in the first row */

        var hdr = "UNKNOWN " + C; // <-- replace with your desired default 
        if(cell && cell.t) hdr = XLSX.utils.format_cell(cell);

        headers.push(hdr);
    }
    return headers;
}
</script>
</head>
<body>
파일 선택 : <input type="file" id="excelFile" onchange="excelExport(event)"/>
<h1>Header 정보 보기</h1>
<div id="displayHeaders"></div>
<h1>JSON 형태로 보기</h1>
<div id="displayExcelJson"></div>
<h1>CSV 형태로 보기</h1>
<div id="displayExcelCsv"></div>
<h1>HTML 형태로 보기</h1>
<div id="displayExcelHtml"></div>
</body>
</html>



2023년 4월 5일 수요일

MSSQL - CLR

 

-- master 테이블로 변경합니다.
use [master]
go

--clr을 사용할수 있도록 변경을 해야 하는데 sysadmin 권한이 있어야 한다.
exec sp_configure 'clr enabled', 1;
reconfigure;
go

-- 그다음 함수를 하용하고자 하는 디비에 대해 trustworthy 기본 속성이 off이므로 높은 권한적용을 위해 on 시킴
alter database  [사용하고자 하는 디비명]
set trustworthy on

/* 에셈블리를 등록하다 보면 
master 데이터베이스에 기록된 데이터베이스 소유자 sid가 데이터베이스 '~~'에 기록된 
데이터베이스 소유자 sid와 다릅니다. 
alter authorization 문을 사용하여 데이터베이스 '~~~'의 소유자를 다시 설정하여 
이 문제를 해결해야 합니다.
라는 에러가 나면 
master 에 등록된 디비의 소유자를 sa 로 변경합니다.
alter authorization on database::사용하고자 하는 디비명 to sa ;
*/

이제 어셈블리를 등록합니다 . 
--assembly 생성 - 대소문자 구분함. [] 없으면 안됩니다.
create assembly [SqlFunction]
from 'd:\sqldb\SqlFunction.dll'  --파일 지정 경로
with permission_set = unsafe
go

에러가 나올수 있습니다. 
어셈블리 'sqlfunction'이(가) 트러스트되어 있지 않으므로 어셈블리 'sqlfunction'에 대한 create assembly가 실패했습니다. 어셈블리는 unsafe assembly 권한과 함께 해당하는 로그인이 있는 인증서 또는 비대칭 키로 서명되어 있는 경우나 sp_add_trusted_assembly를 사용하여 트러스트되어 있는 경우에 트러스터됩니다.
​위에서 꼭 set trustworthy on 해주어야 합니다 . 
했는데 이번엔 다른 에러가 나옵니다. 
master 데이터베이스에 기록된 데이터베이스 소유자 sid가 데이터베이스 '사용하고자 하는 디비명'에 기록된 데이터베이스 소유자 sid와 다릅니다. alter authorization 문을 사용하여 데이터베이스 '사용하고자 하는 디비명'의 소유자를 다시 설정하여 이 문제를 해결해야 합니다.

그러면 위에 있던 디비 소유자를 변경해 줍니다. 
대부분은 sa 일거니가... sa 로 해줍니다. 

d:\sqldb\SqlFunction.dll 에 복사해두었습니다 . 
SqlFunction.dll 이라는 CLR을  SqlFunction 라는 어셈블리로 등록한다는 의미..

이제 dll에 있는 함수를 sql 에 사용할수 있도록 sql 함수를 만듭니다. 
create function dbo.fn_UsrFun1(
@p_original_string nvarchar(4000)
)
returns nvarchar(max) with execute as caller
as
-- 어셈블리명.dll 내 class 명.함수명
external name [SqlFunction].UsrFunction.UsrFun1
go

sql 서버내 함수명 : dbo.fn_UsrFun1
external name [SqlFunction].UsrFunction.UsrFun1
이 부분이 제일 중요하겠죠 ... 
SqlFunction 어셈블리 > UsrFunction Class > UsrFun1 method 라는 의미입니다 .

UsrFun2 라는 함수도 만들었으니  아래처럼 될겁니다.
create function dbo.fn_UsrFun2(
@p_original_string nvarchar(4000)
)
returns nvarchar(max) 
with execute as caller
as
external name [SqlFunction].UsrFunction.UsrFun2
go

디비에서 확장하면  다음처럼 등록된 것을 볼수 있습니다.


참조 : https://m.blog.naver.com/jskimmail/222083779381


2023년 3월 22일 수요일

ASP - SQL Injection and XSS Cross

 
Function SQLInjection(str) 

Dim resultStr
resultStr = str 

resultStr = Replace(resultStr, ";", " ")
resultStr = Replace(resultStr, "@variable", " ")
resultStr = Replace(resultStr, "@@variable", " ")
resultStr = Replace(resultStr, "+", " ")
resultStr = Replace(resultStr, "print", " ")
resultStr = Replace(resultStr, "set", " ")
resultStr = Replace(resultStr, "%", " ")
resultStr = Replace(resultStr, "<script>", " ")
resultStr = Replace(resultStr, "<SCRIPT>", " ")
resultStr = Replace(resultStr, "script", " ")
resultStr = Replace(resultStr, "SCRIPT", " ")
resultStr = Replace(resultStr, "or", " ")
resultStr = Replace(resultStr, "union", " ")
resultStr = Replace(resultStr, "and", " ")
resultStr = Replace(resultStr, "insert", " ")
resultStr = Replace(resultStr, "openrowset", " ")
resultStr = Replace(resultStr, "xp_", " ")
resultStr = Replace(resultStr, "decare", " ")
resultStr = Replace(resultStr, "select", " ")
resultStr = Replace(resultStr, "update", " ")
resultStr = Replace(resultStr, "delete", " ")
resultStr = Replace(resultStr, "shutdown", " ")
resultStr = Replace(resultStr, "drop", " ")
resultStr = Replace(resultStr, "--", " ")
resultStr = Replace(resultStr, "/*", " ")
resultStr = Replace(resultStr, "*/", " ")
resultStr = Replace(resultStr, "XP_", " ")
resultStr = Replace(resultStr, "DECLARE", " ")
resultStr = Replace(resultStr, "SELECT", " ")
resultStr = Replace(resultStr, "UPDATE", " ")
resultStr = Replace(resultStr, "DELETE", " ")
resultStr = Replace(resultStr, "INSERT", " ")
resultStr = Replace(resultStr, "SHUTDOWN", " ")
resultStr = Replace(resultStr, "DROP", " ")

SQLInjection = removeXSS(resultStr)

End Function


Function removeXSS(str) 

Dim resultVal
resultVal = str 

resultVal = Replace(resultVal, "&", "&amp;") 
resultVal = Replace(resultVal, "<xmp", "<x-xmo", 1, -1, 1) 
resultVal = Replace(resultVal, "javascript", "<x-javascript", 1, -1, 1) 
resultVal = Replace(resultVal, "script", "<x-script", 1, -1, 1) 
resultVal = Replace(resultVal, "iframe", "<x-iframe", 1, -1, 1) 
resultVal = Replace(resultVal, "document", "<x-document", 1, -1, 1) 
resultVal = Replace(resultVal, "vbscript", "<x-vbscript", 1, -1, 1) 
resultVal = Replace(resultVal, "applet", "<x-applet", 1, -1, 1) 
resultVal = Replace(resultVal, "embed", "<x-embed", 1, -1, 1) 
resultVal = Replace(resultVal, "object", "<x-object", 1, -1, 1) 
resultVal = Replace(resultVal, "frame", "<x-frame", 1, -1, 1) 
resultVal = Replace(resultVal, "grameset", "<x-grameset", 1, -1, 1) 
resultVal = Replace(resultVal, "layer", "<x-layer", 1, -1, 1) 
resultVal = Replace(resultVal, "bgsound", "<x-bgsound", 1, -1, 1) 
resultVal = Replace(resultVal, "alert", "<x-alert", 1, -1, 1) 
resultVal = Replace(resultVal, "onblur", "<x-onblur", 1, -1, 1) 
resultVal = Replace(resultVal, "onchange", "<x-onchange", 1, -1, 1) 
resultVal = Replace(resultVal, "onclick", "<x-onclick", 1, -1, 1) 
resultVal = Replace(resultVal, "ondblclick","<x-ondblclick", 1, -1, 1) 
resultVal = Replace(resultVal, "enerror", "<x-enerror", 1, -1, 1) 
resultVal = Replace(resultVal, "onfocus", "<x-onfocus", 1, -1, 1) 
resultVal = Replace(resultVal, "onload", "<x-onload", 1, -1, 1) 
resultVal = Replace(resultVal, "onmouse", "<x-onmouse", 1, -1, 1) 
resultVal = Replace(resultVal, "onscroll", "<x-onscroll", 1, -1, 1) 
resultVal = Replace(resultVal, "onsubmit", "<x-onsubmit", 1, -1, 1) 
resultVal = Replace(resultVal, "onunload", "<x-onunload", 1, -1, 1) 
resultVal = Replace(resultVal, "<", "&lt;")
resultVal = Replace(resultVal, ">", "&gt;")

removeXSS = resultVal

End Function


출처 : https://blog.minov.co.kr/entry/ASP-SQL-Injection-XSS-Cross-%EB%B0%A9%EC%A7%80-%EC%BD%94%EB%93%9C


2023년 3월 17일 금요일

HTML - 엑셀 다운로드 시 한글 깨짐 현상 (여러가지 처리 방법)


<ASP - euc-kr 기준>

[#1]

<meta http-equiv="content-type" content="application/vnd.ms-excel; charset=euc-kr">
or
<meta http-equiv="content-type" content="text/html; charset=euc-kr"> 


[#2]

Response.Buffer = True
Response.CharSet = "euc-kr"
'Response.CacheControl = "public"
Response.ContentType = "application/vnd.ms-excel"
Response.AddHeader "Content-Disposition", "attachment;filename=엑셀파일명.xls"


[#3]

Session.CodePage = 949



<ASP - utf-8 기준>

[#1]

<meta http-equiv="Content-Language" content="ko">

FileName = Server.urlEncode("한글깨짐방지")
or
FileName = Server.URLPathEncode("한글깨짐방지")




<C# 기준>


[#1]

<meta name="viewport" http-equiv="Content-Type" content="text/html; charset=utf-8" />
or
<meta name="viewport" http-equiv="Content-Type" content="text/html; charset=euc-kr" />


[#2]

Response.Charset = "euc-kr";   
Response.ContentType = "application/vnd.ms-excel"; 
Response.ContentEncoding = System.Text.Encoding.GetEncoding("euc-kr"); 


[#3]

Response.Clear();
Response.ClearHeaders();
Response.Buffer = true;
Response.AddHeader("content-disposition", "attachment; filename=" + "파일명_" + DateTime.Now.ToString("yyyy_MM_dd") + ".xls");
Response.Charset = "utf-8";
Response.ContentType = "application/vnd.xls";
 
string table = @"<Table><tr><td>111</td></tr><tr><td>222</td></tr></Table>";
Response.Write(table);
Response.End();











2023년 2월 24일 금요일

C# - string.Format


int a = 10;

int b = 20;


// [1] 문자열에 변수를 적용하는 기본 방법

string s = string.Format("{0} + {1} = {2}", a, b, a+b);


// [2] 문자열에 직접 변수를 사용하고 할 경우 (조금 더 직관적)

string s = string.Format($"{a} + {b} = {a+b}");


// [3] 여러 줄의 문자열로 구성된 내용을 표시 할 경우의 기본 방법

StringBuilder sb = new StringBuilder();

sb.Append("<table>");

sb.Append("<tr>");

sb.Append("<td>");

sb.Append("a=" + a + ", b=" + b);

sb.Append("</td>");

sb.Append("</tr>");

sb.Append("</table>");


// [4] 여러 줄의 문자열로 구성된 내용을 표시 할 경우 (조금 더 직관적)

string s = string.Format($@"

    <table>

        <tr>

            <td>

            a={a}, b={b}

            <td>

        </tr>

    </table>

               ");


[추가 설명]

$ : 문자열에 직접 변수를 사용하고 할 경우

@ : 여러 문자열을 화면에 표현되는 그대로 인식하고자 할 경우



2023년 1월 10일 화요일

MSSQL - INDEX 재 정리


SQL Server Management Studio 사용하여 인덱스 유지 관리


인덱스를 다시 구성하거나 다시 작성하려면


1. 개체 탐색기에서 인덱스를 다시 구성할 테이블이 포함된 데이터베이스를 확장합니다.

2. 테이블 폴더를 확장합니다.

3. 인덱스를 다시 구성할 테이블을 확장합니다.

4. 인덱스 폴더를 확장합니다.

5. 다시 구성할 인덱스를 마우스 오른쪽 단추로 클릭하고 다시 구성을 선택합니다.

6. 인덱스 다시 구성 대화 상자에서 다시 구성할 인덱스 표에 올바른 인덱스가 있는지 확인한 다음 확인을 클릭합니다.

7. 큰 개체 열 데이터 압축 확인란을 선택하여 LOB(Large Object) 데이터가 포함된 모든 페이지도 압축되도록 지정합니다.

8. 확인.


테이블의 모든 인덱스를 다시 구성하려면


1. 개체 탐색기에서 인덱스를 다시 구성할 테이블이 포함된 데이터베이스를 확장합니다.

2. 테이블 폴더를 확장합니다.

3. 인덱스를 다시 구성할 테이블을 확장합니다.

4. 인덱스 폴더를 마우스 오른쪽 단추로 클릭하고 모두 다시 구성을 선택합니다.

5. 인덱스 다시 구성 대화 상자에서 다시 구성할 인덱스에 올바른 인덱스가 있는지 확인합니다. 다시 구성할 인덱스 표에서 인덱스를 제거하려면 인덱스를 선택한 다음 Delete 키를 누릅니다.

6. 큰 개체 열 데이터 압축 확인란을 선택하여 LOB(Large Object) 데이터가 포함된 모든 페이지도 압축되도록 지정합니다.

7. 확인.





[1] 특정 인덱스를 다시 구성하려면


ALTER INDEX IX_Employee_OrganizationalLevel_OrganizationalNode

    ON HumanResources.Employee

    REORGANIZE;



[2] 테이블의 모든 인덱스를 다시 구성하려면 (인덱스를 다시 작성하는 것보다 리소스가 덜 사용됩니다. 기본 인덱스 유지 관리 방법.)


ALTER INDEX ALL ON HumanResources.Employee 

REORGANIZE;



[3] 인덱스를 다시 작성하려면 (인덱스가 삭제된 다음 다시 생성됩니다. 작업 시 잠금 및 DB성능 저하.)


ALTER INDEX PK_Employee_BusinessEntityID ON HumanResources.Employee 

REBUILD;



[4] 테이블에서 모든 인덱스를 다시 작성하려면 (서비스 내리고 진행해야 함. 데이터의 크기에 따라 시간이 오래 걸릴 수 있음.)


ALTER INDEX ALL ON Production.Product

REBUILD WITH (FILLFACTOR = 80, SORT_IN_TEMPDB = ON,

              STATISTICS_NORECOMPUTE = ON);



2023년 1월 4일 수요일

C# - WebClient (예문)


[예1]
            try
            {
                string uri = ChatbotCommon.ChatbotAPIUrl + "/api/chat/";
                requestJson = JsonConvert.SerializeObject(chatbotRequest);
                WebClient webClient = new WebClient();
                webClient.Headers[HttpRequestHeader.ContentType] = "application/json";
                webClient.Headers.Add("Session", GetChatBotSessionID());
                webClient.Encoding = UTF8Encoding.UTF8;
                responseJSON = webClient.UploadString(uri, requestJson);
                resObj = JsonConvert.DeserializeObject<ChatbotResponse>(responseJSON);
                var bizChatbot = BizFactory.GetInstance<BizChatbot>();
                // 미소몰 챗봇 로그 저장
                bizChatbot.SetMisomallChatbotLog(MisoMember.MemIdx, resObj);
            }
            catch
            {
                //어떠한 상황이건 API 결과가 에러일 경우 아래 메시지 출력
                resObj = new ChatbotResponse();
                resObj.QueryResult.Intent.Name = "ERROR";
                resObj.QueryResult.Answer.Type = "TEXT";
                resObj.QueryResult.Answer.Value = "잠시 후 다시 이용해 주세요.";
            }
            finally
            {
                // 로그 저장
            }


[예2]
            try
            {
                string uri = SearchCommons.SearchAPIDomainPath + "/extensions/totalSearch/";
                string requestJSON = JsonConvert.SerializeObject(searchInput);

                using (WebClient webClient = new WebClient())
                {
                    webClient.Headers[HttpRequestHeader.ContentType] = "application/json";
                    webClient.Encoding = UTF8Encoding.UTF8;

                    responseJSON = webClient.UploadString(uri, requestJSON);  // POST
                    //responseJSON = webClient.DownloadString(uri + "?" + data);  // GET
                }
                searchResult = JsonConvert.DeserializeObject<SearchResult>(responseJSON);
            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
            }


[예3 - SecurityProtocol]
            try
            {
                ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

                string uri = "~/api/o-purchase/~";
                string requestJSON = JsonConvert.SerializeObject(request);
                using (WebClient webClient = new WebClient())
                {
                    webClient.Encoding = Encoding.UTF8;
                    webClient.Headers[HttpRequestHeader.ContentType] = "application/json";
                    responseJSON = webClient.UploadString(uri, requestJSON);
                }
                Result = JsonConvert.DeserializeObject<Reponse>(responseJSON);
            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
            }


[예4]
            try
            {
                string uri = "~/api/drug/info~";
                string EncKimsID = GetBase64(KimsID + ':');
                string requestJSON = JsonConvert.SerializeObject(kimsDrugRequest);

                using (WebClient webClient = new WebClient())
                {
                    webClient.Encoding = UTF8Encoding.UTF8;
                    webClient.Headers[HttpRequestHeader.ContentType] = "application/json";
                    webClient.Headers[HttpRequestHeader.Authorization] = "Basic " + EncKimsID;

                    responseJSON = webClient.UploadString(uri, requestJSON);  // POST
                }
                kimsDrugResponse = JsonConvert.DeserializeObject<KimsDrugResponse>(responseJSON);
            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
            }

 

C# - 이니시스 결제 Model (Moblie)


namespace Misomall.Model
{
    #region 승인결과
    public class InicisMobileResult
    {
        #region 공통
        /// <summary>
        /// 거래상태 (성공:00)
        /// </summary>
        [StringLength(4)]
        public string P_STATUS { get; set; }
        /// <summary>
        /// 거래번호
        /// </summary>
        [StringLength(40)]
        public string P_TID { get; set; }
        /// <summary>
        /// 지불수단
        /// </summary>
        [StringLength(10)]
        public string P_TYPE { get; set; }
        /// <summary>
        /// 승인일자 (YYYYmmddHHmmss)
        /// </summary>
        [StringLength(14)]
        public string P_AUTH_DT { get; set; }
        /// <summary>
        /// 상점아이디
        /// </summary>
        [StringLength(10)]
        public string P_MID { get; set; }
        /// <summary>
        /// 상점 주문번호
        /// </summary>
        [StringLength(100)]
        public string P_OID { get; set; }
        /// <summary>
        /// 거래금액
        /// </summary>
        [StringLength(8)]
        public string P_AMT { get; set; }
        /// <summary>
        /// 주문자명
        /// </summary>
        [StringLength(30)]
        public string P_UNAME { get; set; }
        /// <summary>
        /// 가맹점 이름
        /// </summary>
        public string P_MNAME { get; set; }
        /// <summary>
        /// 메시지 1
        /// </summary>
        [StringLength(500)]
        public string P_RMESG1 { get; set; }
        /// <summary>
        /// 기타 주문정보 (주문정보에 입력한 값 반환)
        /// </summary>
        [StringLength(800)]
        public string P_NOTI { get; set; }
        /// <summary>
        /// 가맹점 전달 NOTI URL (거래요청 시 입력한 값을 그대로 반환합니다.)
        /// </summary>
        public string P_NOTEURL { get; set; }
        /// <summary>
        /// 가맹점 전달 NEXT URL (거래요청 시 입력한 값을 그대로 반환합니다.)
        /// </summary>
        public string P_NEXT_URL { get; set; }
        #endregion

        #region 가상계좌
        /// <summary>
        /// 입금할 계좌 번호
        /// </summary>
        [StringLength(20)]
        public string P_VACT_NUM { get; set; }
        /// <summary>
        /// 입금마감일자
        /// </summary>
        [StringLength(8)]
        public string P_VACT_DATE { get; set; }
        /// <summary>
        /// 입금마감시간
        /// </summary>
        [StringLength(6)]
        public string P_VACT_TIME { get; set; }
        /// <summary>
        /// 계좌주명
        /// </summary>
        public string P_VACT_NAME { get; set; }
        /// <summary>
        /// 은행코드
        /// </summary>
        [StringLength(2)]
        public string P_VACT_BANK_CODE { get; set; }
        #endregion

        #region 신용카드
        /// <summary>
        /// 발급사 코드
        /// </summary>
        [StringLength(2)]
        public string P_CARD_ISSUER_CODE { get; set; }
        /// <summary>
        /// 가맹점번호
        /// </summary>
        public string P_CARD_MEMBER_NUM { get; set; }
        /// <summary>
        /// 매입사 코드
        /// </summary>
        public string P_CARD_PURCHASE_CODE { get; set; }
        /// <summary>
        /// 부분취소 가능여부 (부분취소가능 : 1 , 부분취소불가능 :0)
        /// </summary>
        public string P_CARD_PRTC_CODE { get; set; }
        /// <summary>
        /// 무이자 할부여부 (0 : 일반, 1 : 무이자)
        /// </summary>
        public string P_CARD_INTEREST { get; set; }
        /// <summary>
        /// 체크카드 여부 (0 : 신용카드, 1 : 체크카드, 2 : 기프트카드)
        /// </summary>
        public string P_CARD_CHECKFLAG { get; set; }
        /// <summary>
        /// 메시지 2 (신용카드 할부 개월 수)
        /// </summary>
        [StringLength(500)]
        public string P_RMESG2 { get; set; }
        /// <summary>
        /// 카드코드
        /// </summary>
        public string P_FN_CD1 { get; set; }
        /// <summary>
        /// 승인번호 (신용카드거래에서만 사용합니다)
        /// </summary>
        [StringLength(30)]
        public string P_AUTH_NO { get; set; }
        /// <summary>
        /// VP 카드코드
        /// </summary>
        public string P_ISP_CARDCODE { get; set; }
        /// <summary>
        /// 결제카드한글명 (BC카드)
        /// </summary>
        public string P_FN_NM { get; set; }
        #endregion

        #region 신용카드 U 포인트
        /// <summary>
        /// 카드번호
        /// </summary>
        public string P_CARD_NUM { get; set; }
        #endregion

        #region 계좌이체
        /// <summary>
        /// 은행코드
        /// </summary>
        //public string P_FN_CD1 { get; set; }
        /// <summary>
        /// 결제은행한글명
        /// </summary>
        //public string P_FN_NM { get; set; }
        #endregion

        #region 휴대폰
        /// <summary>
        /// 휴대폰 통신사
        /// </summary>
        [StringLength(3)]
        public string P_HPP_CORP { get; set; }
        /// <summary>
        /// 결제 휴대폰 번호
        /// </summary>
        public string P_HPP_NUM { get; set; }
        #endregion

        #region 전자지갑
        /// <summary>
        /// 전자지갑 종류 (YPAY : 옐로페이, KWPY : 뱅크월렛)
        /// </summary>
        public string P_EWALLET_TYPE { get; set; }
        #endregion

        #region 앱연동 결제구분
        /// <summary>
        /// 앱연동여부 (P : 페이핀, K : 국민앱카드, C: 페이코, B: 삼성페이, L: LPAY, O: 카카오페이, G: SSGPAY)
        /// </summary>
        public string P_SRC_CODE { get; set; }
        #endregion

        #region 현금 영수증
        /// <summary>
        /// 처리상태 (220000 : 정상, 그 외 : 오류)
        /// </summary>
        public string P_CSHR_CODE { get; set; }
        /// <summary>
        /// 처리 메시지
        /// </summary>
        public string P_CSHR_MSG { get; set; }
        /// <summary>
        /// 현금영수증 총 금액 (총금액 = 공급가액+세금+봉사료)
        /// </summary>
        public string P_CSHR_AMT { get; set; }
        /// <summary>
        /// 공급가액
        /// </summary>
        public string P_CSHR_SUP_AMT { get; set; }
        /// <summary>
        /// 세금
        /// </summary>
        public string P_CSHR_TAX { get; set; }
        /// <summary>
        /// 봉사료
        /// </summary>
        public string P_CSHR_SRVC_AMT { get; set; }
        /// <summary>
        /// 용도구분 (0:소득공제용, 1:지출증빙용)
        /// </summary>
        public string P_CSHR_TYPE { get; set; }
        /// <summary>
        /// 발행시간
        /// </summary>
        public string P_CSHR_DT { get; set; }
        /// <summary>
        /// 발행번호 (가상계좌의 경우, 입금 완료 시, 생성되어 모바일 내 채번시에는 전달되지 않습니다.)
        /// </summary>
        public string P_CSHR_AUTH_NO { get; set; }
        #endregion

        #region 추가 사항 (웹표준 모듈 및 모바일 모듈에서 동일하게 사용하기 위해)
        /// <summary>
        /// 결제수단
        /// </summary>
        public string payMethod { get; set; }
        /// <summary>
        /// 승인일자 (YYYYMMDD)
        /// </summary>
        [StringLength(8)]
        public string applDate { get; set; }
        /// <summary>
        /// 승인시간 (hh24miss)
        /// </summary>
        [StringLength(6)]
        public string applTime { get; set; }
        #endregion
    }
     #endregion
}

MSSQL - Cursor vs Temp Table

#테이블 변수사용의 예 use pubs go declare @tmptable table (     nid int identity(1,1) not null,     title varchar (80) not null ) -- 테이블 변수 선언 inse...