https://developer.salesforce.com/docs/atlas.ja-jp.salesforce_app_limits_cheatsheet.meta/salesforce_app_limits_cheatsheet/salesforce_app_limits_platform_apexgov.htm

 

Apex ガバナ制限 | Salesforce Developer の制限および割り当てクイックリファレンス | Salesforce Developers

Apex の制限については「実行ガバナと制限」を参照してください。 Apex はマルチテナント環境で実行するため、Apex ランタイムエンジンは、回避 Apex コードまたはプロセスが共有リソースを独

developer.salesforce.com

 

Apex ガバナ制限

Apex の制限については「実行ガバナと制限」を参照してください。

Apex はマルチテナント環境で実行するため、Apex ランタイムエンジンは、回避 Apex コードまたはプロセスが共有リソースを独占しないよう制限事項を強制します。

トランザクション単位の Apex 制限

これらの制限は、各 Apex トランザクションに対して効力を持ちます。Apex 一括処理の場合、これらの制限は execute メソッドでレコードのバッチの実行ごとにリセットされます。

次の表では、同期 Apex と非同期 Apex (Apex 一括処理と future メソッド) が異なる場合、それぞれの制限を記載しています。制限が同じ場合、表には、同期および非同期 Apex の両方に適用される 1 つの制限のみが記載されます。

説明同期 Apex の制限非同期 Apex の制限
発行される SOQL クエリの合計数1 100 200
SOQL クエリによって取得されるレコードの合計数 50,000
Database.getQueryLocator によって取得されるレコードの合計数 10,000
発行される SOSL クエリの合計数 20
1 つの SOSL クエリによって取得されるレコードの合計数 2,000
発行される DML ステートメントの合計数2 150
DML ステートメントの結果として処理されるレコードの合計数、Approval.process、または database.emptyRecycleBin 10,000
insertupdate、または delete ステートメントによって繰り返しトリガする Apex 呼び出しのスタックの深さの合計数 3 16
トランザクション内のコールアウト (HTTP 要求または Web サービスコール) の合計数 100
トランザクション内のすべてのコールアウト (HTTP 要求または Web サービスコール) のタイムアウトの最大累積値 120 秒
Apex 呼び出し 1 回につき許可される future アノテーションを持つメソッドの最大数 50 batch および future のコンテキストの場合 0、queueable コンテキストの場合 1
System.enqueueJob によってキューに追加される Apex ジョブの最大数 50 1
許可される sendEmail メソッドの合計数 10
ヒープの合計サイズ 4 6 MB 12 MB
Salesforce サーバの最大 CPU 時間5 10,000 ミリ秒 60,000 ミリ秒
Apex トランザクションごとの最大実行時間 10 分
Apex トランザクションごとに許容される転送通知メソッドコールの最大数 10
各転送通知メソッドコールで送信できる転送通知の最大数 2,000
直ちに公開するように設定されているプラットフォームイベントに対する EventBus.publish コールの最大数 150
1 親子リレーションのサブクエリを使用する SOQL クエリでは、各親子リレーションは追加クエリとみなされます。これらのクエリタイプは、最上位クエリ数の 3 倍に制限されています。サブクエリの制限は、Limits.getLimitAggregateQueries() が返す値に対応します。これらのリレーションクエリの行数は、全体のコード実行の行数に加算されます。この制限はカスタムメタデータ型には適用されません。1 つの Apex トランザクション内で、カスタムメタデータレコードの SOQL クエリは無制限です。静的 SOQL ステートメントの他、次のメソッドへのコールは、要求内で発行された SOQL ステートメント数に対して不利となります。
  • Database.countQuery
  • Database.getQueryLocator
  • Database.query
2 次のメソッドへのコールは、要求内で発行された DML ステートメント数に対して不利となります。
  • Approval.process
  • Database.convertLead
  • Database.emptyRecycleBin
  • Database.rollback
  • Database.setSavePoint
  • delete  Database.delete
  • insert  Database.insert
  • merge  Database.merge
  • undelete  Database.undelete
  • update  Database.update
  • upsert  Database.upsert
  • コミット後に公開するように設定されたプラットフォームイベントに対する EventBus.publish
  • System.runAs

3 insertupdate、または delete ステートメントによってトリガを実行しない繰り返し Apex 処理は、1 つのスタックを使用する 1 つの呼び出し内に存在します。それに対し、トリガを実行した繰り返し Apex では、新しい Apex 呼び出しでトリガが発生します。この新しい呼び出しは、コードを実行した呼び出しとは独立しています。Apex の新しい呼び出しの実行は、1 つの呼び出しでの繰り返しコールよりも手間のかかる操作です。したがって、これらの種類の繰り返しコールのスタックの深さには、より厳しいトリガ制限があります。

4 メールサービスのヒープサイズは 36 MB です。

5 CPU 時間は、1 つの Apex トランザクションで発生する Salesforce アプリケーションサーバ上でのすべての実行に対して計算されます。CPU 時間は、Apex コードや、このコードからコールされるすべてのプロセス (パッケージコードやワークフローなど) の実行に対して計算されます。CPU 時間は、1 つのトランザクション専用であり、他のトランザクションからは独立しています。アプリケーションサーバの CPU 時間を消費しない操作は、CPU 時間には含まれません。たとえば、実行時間のうち DML、SOQL、および SOSL 用のデータベースに費やされた時間や、Apex コールアウトの待ち時間は含まれません。DML 操作にかかるアプリケーションサーバの CPU 時間は、Apex CPU の制限に含まれますが、大きな影響はないと考えられます。

 

メモ

  • 制限は、各 testMethod に対して個別に適用されます。
  • 実行中にコードのコード実行制限を決定するには、Limits メソッドを使用します。たとえば、プログラムによってすでにコールされた DML ステートメント数を決定するには、getDMLStatements メソッドを使用できます。または、コードに使用できる DML ステートメントの合計数を決定するには、getLimitDMLStatements メソッドを使用できます。

トランザクション単位の認定管理パッケージの制限

認定管理パッケージ (AppExchange のセキュリティレビューに合格した管理パッケージ) には、ほとんどのトランザクション単位の制限に対して独自の制限セットが設けられます。AppExchange から組織にインストールされ、固有の名前空間を持つ認定管理パッケージを開発するのは、Salesforce ISV パートナーです。

1 つのトランザクションで呼び出せる認定名前空間の数は無制限です。ただし、各名前空間で実行できる操作の数は、トランザクションあたりの制限を超えることはできません。トランザクション内の全名前空間で実行できる累積操作数にも制限があります。この累積制限は、名前空間あたりの制限の 11 倍です。たとえば、SOQL クエリの名前空間あたりの制限が 100 だとすると、1 つのトランザクションで実行できる SOQL クエリは最大 1,100 個です。この場合、累積制限は名前空間あたりの制限 100 の 11 倍です。これらのクエリは、いずれかの名前空間のクエリが 100 を超えない限り、無制限の数の名前空間で実行できます。累積制限は、すべての名前空間で共有される制限 (最大 CPU 時間の制限など) に影響しません。

 

メモ

これらのクロス名前空間制限は、認定管理パッケージの名前空間にのみ適用されます。認定されていないパッケージの名前空間には、別個に独自のガバナ制限がありません。使用するリソースは、組織のカスタムコードで使用されるのと同じガバナ制限に対して引き続き不利となります。

次の表では、累積クロス名前空間制限について説明します。

説明累積クロス名前空間制限
発行される SOQL クエリの合計数 1,100
Database.getQueryLocator によって取得されるレコードの合計数 110,000
発行される SOSL クエリの合計数 220
発行される DML ステートメントの合計数 1,650
トランザクション内のコールアウト (HTTP 要求または Web サービスコール) の合計数 1,100
許可される sendEmail メソッドの合計数 110

Lightning Platform フォームの Apex 制限

次の表の制限は、Apex トランザクションに固有ではなく、Lightning プラットフォームによって適用されます。

説明制限
24 時間あたりの非同期 Apex メソッド実行 (Apex 一括処理、future メソッド、キュー可能 Apex、およびスケジュール済み Apex) の最大数1 250,000 か、組織内のユーザライセンス数 × 200 の大きい方の値
組織ごとの、5 秒を超える長時間のトランザクションに対する同期同時トランザクション数 2 10
同時にスケジュールされる Apex クラスの最大数 100.Developer Edition 組織の制限は 5 です。
Apex Flex キューに入っている Holding 状況の Apex 一括処理ジョブの最大数 100
同時にキューに入っているか有効な Apex 一括処理ジョブの最大数3 5
Apex 一括処理ジョブの start メソッドの最大同時実行数4 1
1 つのテストの実行で送信可能な一括処理ジョブの最大数 5
24 時間あたりのキュー可能なテストクラスの最大数 (Developer Edition 以外の本番組織)5 500 または組織のテストクラス数の 10 倍の大きい方
24 時間あたりのキュー可能なテストクラスの最大数 (Sandbox 組織および Developer Edition 組織)5 500 または組織のテストクラス数の 20 倍の大きい方
ユーザごとに同時に開くクエリカーソルの最大数6 50
Apex 一括処理の start メソッドでユーザごとに同時に開くクエリカーソルの最大数 15
Apex 一括処理の execute および finish メソッドでユーザごとに同時に開くクエリカーソルの最大数 5

1 Apex 一括処理の場合、メソッド実行には、start、execute、および finish メソッドの実行が含まれます。これは組織全体の制限で、他のすべての非同期 Apex (Apex 一括処理、キュー可能 Apex、スケジュール済み Apex、および future メソッド) と共有されます。使用可能な非同期 Apex 実行の数を確認するには、REST API limits リソースに対して要求を実行します。『REST API 開発者ガイド』の「組織の制限をリストする」を参照してください。この制限に反映されるライセンスの種類は、Salesforce フルユーザライセンス、Salesforce Platform ユーザライセンス、アプリケーションサブスクリプションのユーザライセンス、Chatter Only ユーザ、Identity ユーザ、Company Community ユーザです。

2 10 個の長時間のトランザクションが実行されている間に追加のトランザクションが開始されると、追加のトランザクションは拒否されます。この制限を計算する場合、HTTP コールアウトの処理時間は含まれません。

3 一括処理ジョブが送信されると、処理用にシステムキューに移動されるまで、Flex キューに保持されます。

4 キュー内のまだ開始されていない一括処理ジョブは、開始されるまで保持されます。複数のジョブが実行されている場合は、この制限により一括処理ジョブが失敗することはありません。Apex の一括処理ジョブの execute メソッドは、依然として並行して実行されます。

5 この制限は、テストの非同期実行に適用されます。このテストグループには、開発者コンソールを含め、Salesforce ユーザインターフェースから開始するテストが含まれます。

6 たとえば、開いているカーソルが 50 個あるとします。同じユーザとしてログインしているクライアントアプリケーションで新しいカーソルを開こうとすると、50 個のうち最も古いカーソルが解放されます。異なる Lightning Platform 機能のカーソル制限は個別に追跡されます。たとえば、50 個の Apex クエリカーソル、Apex 一括処理の start メソッドに 15 個のカーソル、Apex 一括処理の execute および finish メソッドにそれぞれ 5 個のカーソル、および 5 個の Visualforce カーソルを同時に開くことができます。

静的 Apex の制限

説明制限
トランザクション内のコールアウト (HTTP 要求または Web サービスコール) のデフォルトのタイムアウト値 10 秒
コールアウト要求または応答 (HTTP 要求または Web サービスコール) の最大サイズ 1 同期 Apex の場合は 6 MB、非同期 Apex の場合は 12 MB
SOQL クエリの最大実行時間。この時間を超えると、Salesforce によってトランザクションがキャンセルされます。 120 秒
Apex リリース内のクラスとトリガの最大コードユニット数 7500
Apex トリガのバッチサイズ2 200
ループリストのバッチサイズ用 200
Database.QueryLocator の 1 回の Apex 一括処理のクエリで返される最大レコード数 5000 万

1 HTTP 要求のサイズおよび応答のサイズは、ヒープサイズの合計に含まれます。

2 プラットフォームイベントと変更データキャプチャイベントの Apex トリガバッチサイズは 2,000 です。

サイズ固有の Apex 制限

説明制限
クラスの最大文字数 100 万
トリガの最大文字数 100 万
組織内のすべての Apex コードで使用されるコードの最大量1 6 MB
メソッドのサイズ制限(制限を超える大規模なメソッドはコードの実行中に例外が発生する場合があります。) コンパイル形式で 65,535 バイトコード命令

1 この制限は、第一世代 (1GP) または第二世代 (2GP) 管理パッケージの Apex コードには適用されません。これらのパッケージタイプのコードは、組織のコードとは異なる独自の名前空間に属しています。この制限は、@isTest アノテーションで定義されたクラスに含まれるコードにも適用されません。

2 制限を超える大規模なメソッドはコードの実行中に例外が発生する場合があります。

転送通知の制限

1 時間 (たとえば、4:00 ~ 4:59 UTC) あたりに組織が送信できるプッシュ通知は、iOS で最大 20,000 件、Android で最大 10,000 件です。配信可能な通知のみがこの制限に含まれます。たとえば、通知が会社の 1,000 名の従業員に送信されるが、100 名の従業員はまだモバイルアプリケーションをインストールしていない場合を考えます。モバイルアプリケーションをインストールしている 900 名の従業員に送信された通知のみがこの制限に反映されます。

[プッシュ通知をテスト] ページで生成された各テストプッシュ通知の受信者は 1 名に制限されています。テストプッシュ通知は、組織の 1 時間のプッシュ通知制限に反映されます。

組織の 1 時間あたりのプッシュ通知制限に達した場合でも、REST API を介したアプリケーション内表示と取得用の追加の通知は作成されます。

'Programming > Apex' 카테고리의 다른 글

[Apex] Queueable 비동기 실행  (0) 2022.05.22

#Web서버란

HTTP를 통해 웹브라우저에서 요청하는 정적 웹페이지(HTML)를 응답해주는 서비스 프로그램(소프트웨어)

HTTP란 HyperTextTransferProtocol의 약자로 www상에서 사용하는 프로토콜(메세지를 주고 받는 체계)이다

 

#HTTP

 

developer.mozilla.org/ko/docs/Web/HTTP/Overview#http_%EA%B8%B0%EB%B0%98_%EC%8B%9C%EC%8A%A4%ED%85%9C%EC%9D%98_%EA%B5%AC%EC%84%B1%EC%9A%94%EC%86%8C

 

#Web서버와 클라이언트(사용자) 간에 주고 받는 방식

Web서버와 클라이언트(사용자) 간에 주고 받는 방식은 기본적으로 HTTP라는 프로토콜을 사용한다

클라이언트에서 웹서버에 요청하는 것을Request(요청) 이라고 하며

웹서버에서 클라이언트에 응답하는 것을 Response(응답) 이라고 한다

 

기본적으로 web서버와 클라이언트 간에 주고 받는 방식은  Request(요청)Response(응답) 2가지로 성립된다 

 

 Request(요청)

Response(응답)

 

#HTTP 메서드에는 GET, POST가 있으며 서버가 요청을 수행하기 위해 해야할 행동을 표시한다

 

#GET (서버로부터 정보를 검색하기 위해 설계된 메서드)
Body에 전송할 데이터를 담지않고
쿼리스트링(주소줄 뒤에 ?변수 &변수 &변수 방식)으로 이어붙여서 값을 전달한다

(처음엔 ?로 시작하고 두번째 변수부터는 &으로 시작한다)

Ex) www.example-url.com/resources?변수명1=변수값&변수명2=변수값

길이제한이 있기 때문에 많은 양을 전달하기에는 부적합하며
주소에 정보가 노출되기 때문에 보안에 취약 

 

#POST(리소스를 등록/갱신 하기위해 설계된 메서드)
전송할 데이터를 Body에 담아서 전송(form태그 등)

길이제한 없음
주소줄에 정보가 보이지 않아 get보다 안전하기만
주소줄에 보이지 않을뿐 통신을 도청 가능하기 때문에 암호화 권장

 

비동기 식에도 사용법은 동일하게 적용된다

 

#그 외

브라우저의 북마크를 등록할경우 URL을 열때 GET방식으로 열린다

POST방식의 경우 결과를 Body에 담기 때문에 검색결과를 북마크 할 수 없다 

 

 

ASP에는 3가지 페이지 이동 메서드가 존재한다

 

#server.Execute("파일명.ASP", 개체명) 

특정페이지를 함수처럼 사용하고
다시 원래 페이지로 돌아옴

 

#server.transfer("파일명.ASP")  : 주소(URL)는 그대로, 결과만 반환

JSP의 forward와 비슷하다

 

1. 주소값을 가지고 같은 서버내에서 asp페이지에 이동을 하고 결과를 클라이언트에게 보냄

(덕분에 redirect보다 속도가 빠름, 그러나 서버에서 처리되고 클라이언트는 기록이 없기 때문에 뒤로가기 불가)

 

2. 그렇기 때문에 URL변화 없음, 쿼리문자열과 폼에 존재하는 변수도 유지됨

request, response가 유지됨(객체 재사용 가능)

(get방식 사용불가, 변수 넘기기 불가, get방식은 전송후 URL이 변하기 때문에)

 

3. 같은서버 내에서 처리하기 때문에 외부 페이지에 이동할 수 없고, 서버 내의 asp페이지 내에서만 이동 가능

server.transfer는 JSP로 forward랑 비슷하다 보면 된다

 

동작방식

1.브라우저에서 서버에 요청(request)

2.서버가 응답(response), 요청된 주소를 따라 "같은서버 내에서 해당 주소로 이동" 후 결과를 브라우저에 반환

3.브라우저는 결과를 표시함

 

#response.redirect("파일명.ASP", FALSE) : 주소(URL)와 결과를 반환

 

1. 서버에서 주소값을 클라이언트로 보내서 클라이언트가 받은 주소로 페이지를 찾아감

(transfer에 비해 작업이 늘기 때문에 속도는 떨어짐)

 

2. 클라이언트 쪽에서 이동하기 때문에 같은서버 내의 페이지 뿐만아니라

외부 서버 페이지에 이동도 가능(클라이언트에 기록이 있기 때문에 뒤로가기 가능)


3. URL이 변화 있기 때문에 유저가 갱신된 URL을 볼 수 있다.

request, response객체가 새롭게 생성 됨(객체 재사용 불가)

post, get방식 사용가능, get변수 넘기기 가능

 

동작방식

1.브라우저에서 서버에 요청(request)

2.서버가 응답(response), 다른페이지로 이동하라고 주소를 브라우저에 보냄

3.브라우저는 받은 주소로 이동

4.브라우저는 결과를 표시함

 

 

#가장 많이 사용되는 transfer(forward)와 redirect의 차이를 요약

transfer(forward)는 서버가 주소로 이동해서 얻은 결과를 브라우저에 반환(URL 그대로, 객체(변수) 그대로)

redirect는 서버가 주소를 브라우저에 주면 브라우저가 이동해서 결과를 얻음(URL바뀜, 객체(변수) 새로 생성됨)

 

transfer(forward)는 객체가 유지되기 때문에 DB에 변화가 없는 검색, 리스트와 같은 SELECT처리에 적합하고

redirect는 객체가 새로 생성되기 때문에 글쓰기, 수정, 삭제와 같은 INSERT, UPDATE, DELETE처리에 적합하다

 

transfer(forward)는 객체가 유지되기 때문에 새로고침을 하면 글쓰기가 2번 등록되거나 함

'Programming > C#' 카테고리의 다른 글

[C#] 확장 메서드  (0) 2020.12.23
[C#] MSSQL 연결 후 SQL 실행  (0) 2020.12.23
[C#] 접근제한자  (0) 2020.12.18
[C#] namespace란  (0) 2020.12.18
[C#] abstract, interface, virtual  (0) 2020.12.18

#확장 메서드란

기존에 있던 클래스에 메서드를 추가하는 것이다

새로운 클래스를 만들어서 메서드를 추가해도 되지만

string과 같이 기존에 존재하는 클래스의 이름을 활용하기 위함이다

 

예를들면 string클래스에는 Length, Split, Trim, Toint32과 같은 메서드가 존재한다

하지만 공백제거와 숫자로 변환하는 Trim과 Toint32를 동시에 처리해주는 메서드는 존재하지 않는다

 

라이브러리 클래스를 만들어서 기능메서드를 호출하는 방법과는 조금 다른데 아래에서 설명

 

#확장 메서드를 만드는 방법에는 규칙이 있다

public static 클래스 안에서 public static 메서드로 선언해야한다

    //string에 메서드를 추가
    public static class StringExtensions
    {
        public static int ToNumber(this string str)
        {
            str.Trim();
            return Convert.ToInt32(str);
        }
    }

 

ToNumber(this string str)에서 this는 확장할 클래스를 뜻하며 

this string은 string 클래스를 확장하겠다는 의미이다

그리고 공백제거 후 int형으로 변환해서 반환하고 있다

 

다른 클래스에서 공백제거 후 int변환을 사용한다면

클래스 객체 생성후 메서드에 접근해야하지만

확장메서드를 사용하면 아래와 같이 string에서 바로 접근이 가능하다

string str = "12     3";
str.ToNumber();//결과 : 123

 

 

'Programming > C#' 카테고리의 다른 글

[C#] Web서버란  (0) 2021.01.01
[C#] MSSQL 연결 후 SQL 실행  (0) 2020.12.23
[C#] 접근제한자  (0) 2020.12.18
[C#] namespace란  (0) 2020.12.18
[C#] abstract, interface, virtual  (0) 2020.12.18

1. App.config에서 아래 코드를 작성

 

  <connectionStrings>
    <add name="객체이름" 
         connectionString="
         Data Source =사용할 서버 이름;
         Initial Catalog=사용할 서버 안에 있는 DB이름;
         User ID=DB에 로그인할 ID; //sql server인증
         Password=DB에 로그인할 비밀번호" //sql server인증
         Integrated Security=true;/> //윈도우 인증의 경우 위 UserId와 Password는 필요없음
  </connectionStrings>

 

필자의 경우 윈도우 인증이기 때문에 아래처럼 작성했다

  <connectionStrings>
    <add name="TestDB" --객체 명
         connectionString="
         Data Source =PLONE; --서버 이름
         Initial Catalog=MYDB; --DB이름
         Integrated Security=true;"/> --윈도우 인증
  </connectionStrings>

 

2. 클래스파일로 돌아와서 최상단에 아래 코드를 using

using System.Data.SqlClient;
using System.Configuration;

 

3.SELECT문 : SELECT 결과를 Bean에 집어넣은 다음 리스트에 추가 후 반환

        public List<BoardBean> selectBoard()
        {
            //DB접속 문자열 취득
            string connectionString = ConfigurationManager.ConnectionStrings["TestDB"].ConnectionString;//App.config에서 작성한 DB정보
            List<BoardBean> list = new List<BoardBean>();

            using (SqlConnection connection = new SqlConnection(connectionString))
            using (SqlCommand command = connection.CreateCommand()) //커맨드 생성
            {
                try
                {
                    //DB에 접속
                    connection.Open();
                    
                    //SQL 준비
                    command.CommandText = @"SELECT * 
                                        FROM examsite 
                                        WHERE boardId = @boardID";//커맨드 입력
                    //파라메터 정의
                    command.Parameters.AddWithValue("@boardId", "free");

                    using (SqlDataReader reader = command.ExecuteReader())//다중 레코드를 반환하는 쿼리
                    {
                        while (reader.Read() == true)//다음 레코드를 읽음, 레코드가 존재하지 않을때까지 반복
                        {
                            BoardBean bean = new BoardBean();//빈 생성
                            bean.BoardNum = Convert.ToInt32(reader["boardNum"]);//빈에 정보 입력
                            bean.BoardId = reader["boardId"] as string;
                            list.Add(bean);//리스트에 추가
                        }
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine("Error : " + e);
                    throw;
                }
            }

            return list;
        }

 

command.CommandText = @"SELECT 의 @의 의미는 

개행을 하더라도 ""+""을 하지않아도 된다

string str = "SELECT *" +
             "FROM TABLE";
             
string str = @"SELECT *
               FROM TABLE";

 

 

4. INSERT, DELETE, UPDATE : 3개의 알고리즘은 동일하다

        public int insertBoard()
        {
            //DB접속 문자열 취득
            string connectionString = ConfigurationManager.ConnectionStrings["TestDB"].ConnectionString;//App.config에서 작성한 DB정보
            int resultCount = 0;

            using (SqlConnection connection = new SqlConnection(connectionString))
            using (SqlCommand command = connection.CreateCommand()) //커맨드 생성
            {
                try
                {
                    //DB에 접속
                    connection.Open();
                    
                    //SQL 준비
                    command.CommandText = @"INSERT INTO EXAMSITE(
                                        boardNum,
                                        boardId)
                                        VALUES(
                                        @boardNum,
                                        @boardId)";//커맨드 입력
                    //파라메터 정의
                    command.Parameters.AddWithValue("@boardNum", 10);
                    command.Parameters.AddWithValue("@boardId", "free");

                    //SQL 실행,실행된 행의 수를 반환
                    resultCount = command.ExecuteNonQuery();
                }
                catch (Exception e)
                {
                    Console.WriteLine("Error : " + e);
                    throw;
                }
            }

            return resultCount;
        }

 

 

또한 Command.CommandText를 사용하지 않고 아래처럼 사용가능하다

다만 이 방법은 SQL과 변수 설정이 떨어져 있어서 가독성이 나빠진다

        public int deleteBoard()
        {
            //DB접속 문자열 취득
            string connectionString = ConfigurationManager.ConnectionStrings["TestDB"].ConnectionString;//App.config에서 작성한 DB정보
            int resultCount = 0;

            //SQL 준비
            string sql = @"DELETE FROM EXAMSITE
                           WHERE boardNum = @boardNum";

            using (SqlConnection connection = new SqlConnection(connectionString))
            {

                try
                {
                    //DB에 접속
                    connection.Open();
                    SqlCommand command = new SqlCommand(sql, connection);

                    //파라메터 정의
                    command.Parameters.AddWithValue("@boardNum", 10);

                    //SQL 실행,실행된 행의 수를 반환
                    resultCount = command.ExecuteNonQuery();
                }
                catch (Exception e)
                {
                    Console.WriteLine("Error : " + e);
                    throw;
                }
            }

            return resultCount;
        }

 

 

5. 2개 이상의 SQL을 작업하는 경우 : 트랜잭션 사용

        public void TranTest()
        {
            //DB접속 문자열 취득
            string connectionString = ConfigurationManager.ConnectionStrings["TestDB"].ConnectionString;//App.config에서 작성한 DB정보

            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                try
                {
                    //DB에 접속
                    connection.Open();

                    using (SqlTransaction transaction = connection.BeginTransaction())
                    using (SqlCommand command = new SqlCommand() { Connection = connection, Transaction = transaction })
                    {
                        //SQL 준비
                        command.CommandText = @"INSERT INTO EXAMSITE(
                                        boardNum,
                                        boardId)
                                        VALUES(
                                        @boardNum,
                                        @boardId)";//커맨드 입력
                                                   //파라메터 정의
                        command.Parameters.AddWithValue("@boardNum", 10);
                        command.Parameters.AddWithValue("@boardId", "free");

                        //SQL 실행,실행된 행의 수를 반환
                        command.ExecuteNonQuery();

                        //SQL 준비
                        command.CommandText = @"INSERT INTO EXAMSITE(
                                        boardNum,
                                        boardId)
                                        VALUES(
                                        @boardNum,
                                        @boardId)";//커맨드 입력
                                                   //파라메터 정의
                        command.Parameters.AddWithValue("@boardNum", 11);
                        command.Parameters.AddWithValue("@boardId", "free");

                        //SQL 실행,실행된 행의 수를 반환
                        command.ExecuteNonQuery();
                    }

                }
                catch (Exception e)
                {
                    Console.WriteLine("Error : " + e);
                    throw;
                }
            }
        }

'Programming > C#' 카테고리의 다른 글

[C#] Web서버란  (0) 2021.01.01
[C#] 확장 메서드  (0) 2020.12.23
[C#] 접근제한자  (0) 2020.12.18
[C#] namespace란  (0) 2020.12.18
[C#] abstract, interface, virtual  (0) 2020.12.18

접근제한자는 클래스, 함수 가장 앞에 선언되며

JAVA은 접근제한자가 4개 존재한다

명시하지 않으면 default이 기본이다

 

  • public : 제약없이 어느곳에서 접근가능
  • private : 선언한 해당 클래스 내에서만 접근가능(클래스에 선언 불가)
  • protected : 선언한 클래스 및 상속받은 자식 클래스에서만 접근가능(클래스에 선언 불가)
  • default : 동일 패키지 내에서만 접근가능(아무것도 명시하지 않으면 default이 기본)

 

'Programming > JAVA' 카테고리의 다른 글

[SPRING] ResultMap  (0) 2020.12.11
[JAVA] 빈 문자열, NULL 다루기  (0) 2020.11.19
[JAVA] 문자열 비교  (0) 2020.11.19
[JAVA] 대소문자 변환  (0) 2020.11.19
[SPRING] Spring 구조 및 DTO, VO 개념  (0) 2020.10.07

+ Recent posts