2010-01-15 6 views
1

저장 프로 시저를 여러 번 호출해야하는데, 나는 informix를 사용하고 있습니다. 동일한 연결을 가진 프로 시저를 여러 번 호출하는 것이 저장 프로 시저에 대한 여러 호출로 문자열을 생성하고 쿼리로 실행하는 것과 동일한 지 알고 싶습니다. .net에서 여러 저장 프로 시저를 호출하는 방법?

코드의 예입니다

IfxCommand cmd = new IfxCommand("storeData", myconn); 
cmd.CommandType = CommandType.StoredProcedure; 
for (int i = 0; i < lbim; i++) 
{ 

    cmd.Parameters.Add("id", IBM.Data.Informix.IfxType.VarChar, 255).Value = info.id; 
    cmd.Parameters.Add("descripcionDescuentoImpuesto", IBM.Data.Informix.IfxType.VarChar, 255).Value = info.data[i].value; 
    try 
    { 
    IfxDataReader myreader = cmd.ExecuteReader(); 
    if (myreader.Read()) 
    { 
     Boolean aux = (Boolean)myreader[0]; 
     myreturn = aux; 
    } 
    myreader.Close(); 
    } 
    catch (IfxException ex) 
    { 
    } 
    cmd.Parameters.Clear(); 
} 

문제는 각 저장 프로 시저가 true 또는 false를 반환하는 것입니다.

감사

+0

예외를 무시하는 것은 다소 모호해야합니다. 그렇습니까? –

+0

informix는 무엇입니까? –

답변

2

성능상의 이유로 가장 좋은 방법은 before loop 명령을 준비하는 것입니다. 루프 내부에서 매개 변수 값을 설정하고 판독기를 실행할 수 있습니다. 2 가지로 코드를 향상시킬 수도 있습니다 :

  • 공장 사용; 이런 식으로 OdbcDriver와 IfxDriver 사이에서 쉽게 전환 할 수 있습니다.
  • 오류 처리 : finally 섹션에서 독자를 닫거나 예외가 발생하면 리소스를 확보 할 수있는 "usings"절을 사용해야합니다. 나는 더 복잡한 시나리오에서 마침내 섹션이 매우 복잡해지기 때문에 사용을 선호합니다.

    DbProviderFactory dbfactory; 
    dbfactory = DbProviderFactories.GetFactory("IBM.Data.Informix"); 
    using (myconn = dbfactory.CreateConnection()) 
    { 
        myconn.ConnectionString = " ... "; 
        myconn.Open(); 
        DbCommand cmd = dbfactory.CreateCommand(); 
        cmd.Connection = myconn; 
        cmd.CommandText = "storeData"; 
        cmd.CommandType = CommandType.StoredProcedure; 
        cmd.Parameters.Clear(); 
    
        DbParameter parameter = dbfactory.CreateParameter(); 
        parameter.ParameterName = "id"; 
        parameter.DbType = DbType.String; 
        parameter.Size = 255; // probably not necessary 
        cmd.Parameters.Add(parameter); 
    
        parameter = dbfactory.CreateParameter(); 
        parameter.ParameterName = "descripcionDescuentoImpuesto"; 
        parameter.DbType = DbType.String; 
        parameter.Size = 255; 
        cmd.Parameters.Add(parameter); 
    
        cmd.Prepare(); 
        for (int i = 0; i < lbim; i++) 
        { 
         cmd.Parameters[0].Value = info.id; 
         cmd.Parameters[1].Value = info.data[i].value; 
         using (DbDataReader myreader = cmd.ExecuteReader()) { 
          if (myreader.Read()) 
          { 
           Boolean aux = (Boolean)myreader[0]; 
           myreturn = aux; 
          } 
         } 
        } 
    } 
    

    코드는 더 이상 지금하지만 난 장점이 지배적 있다고 생각 :

이 변화는 다음 코드 줄 것입니다. 더 나은 접근법은 Spring.NET을 사용하는 것입니다 - 저는 코드의 절반 크기 인 드라이버 독립형 (공장 접근 방식과 유사하게) 예외가 발생할 경우 자원을 자동으로 처분합니다. 또한 차라리

myreturn = (bool)cmd.ExecuteScalar();

대신 데이터 판독기 사용합니다. 다음으로 명령 유형 텍스트 대신 "execute procedure storeData (?,?)"를 사용하고 있습니다. 이것은 오랜 시간 전에 내가 가진 몇 가지 시나리오에서 Informix 버그 때문입니다. 이 문제는 이미 수정되었으므로 아마도 더 이상 필요하지 않을 수 있습니다.

1

는 각 호출에 대해 새로운 IfxCommand 객체를 생성, 그래서 그냥 for 루프에 코드의 일부를 이동해야합니다. 실제로 이것은 어떤 공급자를 사용하든 관계 없습니다.

+1

무엇이 더 나아질까요? – sergiogx

+1

그게 왜 도움이 될까요? 필자는 .Add 연산의 정확한 의미를 알지 못합니다 (동일한 매개 변수 이름에 대한 이전 설정을 덮어 쓰면 모두 괜찮습니다; 그렇지 않으면 문제가 발생할 수 있음). 그러나 일반적인 SQL 프로그래밍에서는 명령문을 한 번 준비하고 여러 매개 변수 집합을 사용하여 여러 번 실행하는 것이 좋습니다. –

+2

실제로이 문서를 작성한 후 실제로 설명서를 확인했으며 Command 개체의 DataReaders가 닫혀있는 한 실제로 명령 개체를 다시 사용할 수있는 것으로 보입니다. –

관련 문제