0

У меня есть эта хранимая процедура:SQL Server 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") 

Это часть моей программы моего подключения C# для SQL Server

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.
  • Результат не отображается в приложении C# Windows с использованием ADOAdapter.
  • Я попытался использовать Temp Table и Table Variable, не работал.
  • Я пробовал не использовать IF..ELSE, не работал.
+0

Вы должны избегать использования 'sp_' префикс - это зарезервирован для системных процедур SQL Server. –

+0

Я изменил sp_Defect_B на p_Defect_B и все еще не поймал значение таблицы из процедуры. –

+1

уверен, что есть лучший подход на основе набора? –

ответ

2

Вы действительно должны использовать SqlConnection затем подключение к SQL Server - и вы должны выполнить хранимую процедуру с использованием стандартного SqlCommand - не используйте EXEC.... код.

Попробуйте этот код:

// 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(); 
}