0

나는이 저장 프로 시저가 있습니다SQL 서버의 if..else는 Windows 응용 프로그램에 표시되지 않습니다

exec sp_Defect_B '2013-05-20 00:00:00','2013-05-25 23:59:59' 

다른 것은 주어진 코드에 따라 실행하기 IF..ELSE 있습니다

alter proc [dbo].[p_Defect_B] (@dtFrom datetime, @dtTo datetime)    
as    
begin 
DECLARE @Total TABLE 
(
    [No] int, TSampel float 
) 
-- Total 
insert into @Total 
select 1 as [No], SUM(H.Total) as TSampel from TrxDBHHDr HH 
left join TrxDBHdr H on HH.DBNO=H.DBNO 
left join ProductType PT on H.ACd=PT.ACd and PT.GCd=1 
where HH.Deleted=0 and HH.DBDate between @dtFrom and @dtTo 

DECLARE @Defect TABLE 
(
    DefectCd varchar(15),Name varchar(50), Defect float 
) 
-- Defect 
insert into @Defect 
select D.DefectCd,DB.Name,sum(coalesce(D.Qty,0)) as Defect from TrxDBHHDr HH 
left join TrxDBDtl D on HH.DBNO=D.DBNO 
left join ProductType PT on D.acd=PT.ACd and PT.GCd=1 
left join DefectBK DB on DB.DefectCd=D.DefectCd 
where HH.Deleted=0 and HH.DBDate between @dtFrom and @dtTo 
group by D.DefectCd,DB.Name 

DECLARE @SubTotal TABLE 
(
    Name varchar(50), Defect float, TSampel float, PDefect float 
) 
insert into @SubTotal 
select D.Name,D.Defect,T.TSampel,D.Defect*100/T.TSampel as PDefect from @Defect D 
left join @Total T on T.[No]=1 
order by PDefect desc 

DECLARE @TotalD TABLE 
(
    [No] int,Defect float 
) 

insert into @TotalD 
select 1, Sum(D.Defect) as Defect from @Defect D 

insert into @SubTotal 
select 'Total Defect', D.Defect, T.TSampel, D.Defect*100/T.TSampel as PDefect from @TotalD D 
left join @Total T on T.[No]=1 

select * from @SubTotal 
end 

I을 SSMS에서 코드를 실행하면 완벽하게 작동합니다. 그러나 C# Windows 응용 프로그램에서이 코드를 사용하려고하면 아무런 가치가 없습니다 ... 어떻게 가능합니까? 내가 놓친 게 있니?

내가 임시 테이블, 테이블 변수를 사용하여 시도, 그들은 여전히 ​​테이블 값을 반환하지 않았습니다 만이 저장 프로 시저가 테이블 값을 반환하지 않았다

는 ... ...

이는 C#입니다 코드 :

sql= "exec p_Defect_B '2013-05-20 00:00:00','2013-05-25 23:59:59'"; 

RunQuery qu_data = new RunQuery(); 
DataTable data = new DataTable(); 
data = qu_data.OpenAdoQuery(sql,"IP") 

이 SQL 서버 내 연결 C#을 내 프로그램의 일부입니다

myCon = new OleDbConnection(strCon); 
DataTable myData = new DataTable(); 

myCon.Open(); 

OleDbDataAdapter myOleAdapter = new OleDbDataAdapter(); 
myOleAdapter.SelectCommand = new OleDbCommand(sql,myCon); 
myOleAdapter.Fill(myData); 
myCon.Close(); 
  • 모든 테이블은 SMSS에서 값을 반환합니다.
  • 모든 테이블 변수는 SMSS의 결과를 보여줍니다.
  • 결과가 ADOAdapter를 사용하는 C# Windows 응용 프로그램에 표시되지 않았습니다.
  • 임시 테이블과 테이블 변수를 사용해 보았는데 작동하지 않았습니다.
  • IF..ELSE을 사용하지 않으려 고 시도했지만 작동하지 않았습니다.
+0

를 - 그것은 SQL 서버의 시스템 절차에 예약합니다. –

+0

sp_Defect_B를 p_Defect_B로 변경했지만 여전히 프로 시저에서 테이블 값을 catch하지 않았습니다. –

+1

더 나은 세트 기반 접근 방식이 확실한가요? –

답변

2

당신은 정말 SqlConnection 다음 SQL Server에 연결 사용해야합니다 - 당신은 표준 SqlCommand를 사용하여 저장 프로 시저를 실행한다 - EXEC.... 코드를 사용하지 마십시오.

이 코드보십시오 : 당신은`sp_` 접두사를 사용하지 않아야합니다

// setup connection and command 
using (SqlConnection conn = new SqlConnection(-your-connection-string-here-)) 
using (SqlCommand cmd = new SqlCommand("dbo.p_Defect_B", conn)) 
{ 
    // define command as stored procedure 
    cmd.CommandType = CommandType.StoredProcedure; 

    // define and set parameter values 
    cmd.Parameters.Add("@dtFrom", SqlDbType.DateTime).Value = new DateTime(2013, 5, 20); 
    cmd.Parameters.Add("@dtFrom", SqlDbType.DateTime).Value = new DateTime(2013, 5, 25, 23, 59, 59); 

    // execute your query 
    conn.Open(); 

    // get a data reader to read the values from the result set 
    using (SqlDataReader rdr = cmd.ExecuteReader()) 
    { 
     // iterate over the result set 
     while (rdr.Read()) 
     { 
      // fetch the values - depends on your result set - YOU NEED TO ADAPT THIS! 
      var value1 = rdr.GetInt(0); 
      var value2 = rdr.GetString(1); 
      ...... 
     } 

     rdr.Close(); 
    } 

    conn.Close(); 
}