문제

매개 변수를 SQLCommand로 전달하는 가장 좋은 방법은 무엇입니까? 넌 할 수있어:

cmd.Parameters.Add("@Name", SqlDbType.VarChar, 20).Value = "Bob";

또는

cmd.Parameters.Add("@Name", SqlDbType.VarChar).Value = "Bob";

또는

cmd.Parameters.Add("@Name").Value = "Bob";

첫 번째는 성능 면적이거나 오류 점검이 "어떻게"더 나은 "것 같습니다. 그러나 나는 더 확실하게 알고 싶습니다.

도움이 되었습니까?

해결책

당신은 또한 사용할 수 있습니다 AddWithValue(), 그러나 잘못된 암시 적 유형 변환의 가능성을 알고 있어야합니다.

cmd.Parameters.AddWithValue("@Name", "Bob");

다른 팁

거기에서 무슨 일이 일어나고 있습니까?

여러 오버로드에 대한 매개 변수 목록을 인용합니다 Add. 이들은 SqlParameter 수업. 그들은 본질적으로 당신이 호출 한 편의 메소드와 동일한 서명을 가지고있는 모든 생성자를 사용하여 매개 변수 객체를 구성하고 SqlParameterCollection.Add(SqlParameter) 이와 같이:

SqlParameter foo = new SqlParameter(parameterName, dbType, size);
this.Add(foo);

AddWithValue 비슷하지만 편리함이 더욱 필요하며 가치를 설정합니다. 그러나 실제로 프레임 워크 결함을 해결하기 위해 도입되었습니다. MSDN,

과부하 Add 그것은 현을 취하고 객체가 SqlParameterCollection.Add 과부하가 걸립니다 String 그리고 a SqlDbType정수를 문자열로 전달하는 열거 값은 매개 변수 값 또는 해당하는 것으로 해석 될 수 있습니다. SqlDbType 값. 사용 AddWithValue이름과 값을 지정하여 매개 변수를 추가하려고 할 때마다.

생성자 과부하 SqlParameter 클래스는 인스턴스 속성을 설정하기위한 단순한 편의성입니다. 그들은 성능에 약간의 영향을 미치면서 코드를 단축시킵니다. 생성자는 세터 방법을 우회하고 개인 구성원에게 직접 작동 할 수 있습니다. 차이가 있다면별로 큰 것은 아닙니다.

어떻게해야합니까?

다음을 참고하십시오 (MSDN에서)

양방향 및 출력 매개 변수 및 리턴 값의 경우 값을 설정해야합니다. Size. 입력 매개 변수에는 필요하지 않으며 명시 적으로 설정하지 않으면 매개 변수화 된 문을 실행할 때 지정된 매개 변수의 실제 크기에서 값이 추론됩니다.

기본 유형은 입력입니다. 그러나 크기를 이와 같이 추론하고 루프에서 매개 변수 객체를 재활용하면 (성능에 관심이 있다고 말 했음) 크기는 첫 번째 값으로 설정되며 더 긴 값은 더 길어질 것입니다. 잘린. 분명히 이것은 문자열과 같은 가변 길이 값에 대해서만 중요합니다.

루프에서 동일한 논리 매개 변수를 반복적으로 전달하는 경우 루프 외부에서 SQLPARAMETER 객체를 작성하고 적절하게 크기를 만드는 것이 좋습니다. Varchar의 과도한 크기는 무해하므로 정확한 최대 값을 얻는 Pita라면 열이 기대하는 것보다 더 크게 설정하십시오. 각 반복마다 새 객체를 만들기보다는 객체를 재활용하기 때문에 루프 기간 동안 메모리 소비가 가능합니다. 하락 대형 크기로 조금 흥분하더라도.

진실은 수천 개의 전화를 처리하지 않으면 아무도 큰 차이를 만들지 않을 것입니다. AddWithValue 크기 문제를 측정하는 새로운 객체를 만듭니다. 짧고 달콤하고 이해하기 쉽습니다. 당신이 수천을 통과하면 내 접근 방식을 사용하십시오. 그렇지 않으면 사용하십시오 AddWithValue 코드를 간단하고 유지하기 쉽게 유지합니다.


2008 년은 오래 전이었습니다

내가 이것을 쓴 이후 몇 년 동안 세상은 바뀌 었습니다. 새로운 종류의 날짜가 있으며, 최근 날짜와 관련된 문제로 인해 확대의 의미에 대해 생각하게 만들 때까지 내 마음을 넘어 가지 않은 문제도 있습니다.

용어에 익숙하지 않은 사람들의 경우 넓어지고 좁아지는 것은 데이터 유형 변환의 품질입니다. int를 더블에 할당하면 더블이 "더 넓기"때문에 정밀도 손실이 없습니다. 항상이 작업을 수행하는 것이 안전하므로 변환은 자동입니다. 그렇기 때문에 int를 더블에 할당 할 수는 있지만 명시적인 캐스트를 수행 해야하는 다른 방법으로 가야합니다. int에서 Double은 잠재적 인 정밀도 손실과의 좁은 전환입니다.

이것은 현에 적용될 수 있습니다. Nvarchar는 Varchar보다 넓기 때문에 Varchar를 Nvarchar에 할당 할 수 있지만 다른 방법으로는 캐스트가 필요합니다. Varchar가 Nvarchar로 암시 적으로 넓어지기 때문에 비교가 작동합니다. 그러나 이것은 인덱스 사용을 방해 할 것입니다!

C# 문자열은 유니 코드이므로 AddWithValue는 nvarchar 매개 변수를 생성합니다. 다른 쪽 끝에서, Varchar 컬럼 값은 비교를 위해 Nvarchar로 확대된다. 쿼리 실행을 중지하지는 않지만 인덱스가 사용되는 것을 방지합니다. 이것은 나쁘다.

그것에 대해 무엇을 할 수 있습니까? 두 가지 가능한 해결책이 있습니다.

  • 매개 변수를 명시 적으로 입력하십시오. 이것은 더 이상 AddWithValue가 없음을 의미합니다
  • 모든 문자열 열 유형을 nvarchar로 변경하십시오.

버킹 바르 차는 아마도 가장 좋은 아이디어 일 것입니다. 예측 가능한 결과로 간단한 변화이며 현지화 이야기를 향상시킵니다. 그러나 이것을 옵션으로 사용하지 않을 수 있습니다.

요즘 나는 직접적인 ado.net을 많이하지 않습니다. LINQ2SQL은 이제 내 선택 무기이며,이 업데이트를 작성하는 행위로 인해이 문제를 어떻게 처리하는지 궁금해했습니다. 나는 갑자기 바르 차르의 데이터베이스를 제거하려는 욕망이 있습니다.

확실히 #1이라고 말하고 싶습니다. 그러나 Microsoft는 엔터프라이즈 라이브러리의 데이터 액세스 애플리케이션 블록에서이를 수행합니다.

http://msdn.microsoft.com/en-us/library/dd203144.aspx

나는 당신의 옵션 1을 사용 했었습니다.

cmd.parameters.add ( "@name", sqldbtype.varchar, 20) .value = "bob";

잘 작동했지만 .addwithValue를 사용하기 시작했으며 간단합니다. 수천 개의 용도로 수천 개의 용도로 문제가 발생하지 않았습니다. 나는 거의 항상 내 수업을 개인 변수를 통과하기 때문에 암시 적 유형 변환에 대해 걱정할 필요가 없습니다.

응용 프로그램에 따라 다릅니다. 저장된 Proc 매개 변수의 길이를 변경하면 DKE를 변경하지 않아도되기 때문에 실제로 2를 좋아합니다. 그래도 그건 나야. 성과 처벌이 있는지 모르겠습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top