SQL Server IF..ELSE 不在 Windows 应用程序中显示

Posted

技术标签:

【中文标题】SQL Server IF..ELSE 不在 Windows 应用程序中显示【英文标题】:SQL Server IF..ELSE do not show at Windows Application 【发布时间】:2013-06-14 06:12:28 【问题描述】:

我有这个存储过程:

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

我在 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 中显示结果。 使用 ADOAdapter 的 C# Windows 应用程序未显示结果。 我尝试使用临时表和表变量,但不起作用。 我试过不使用IF..ELSE,没用。

【问题讨论】:

您应该避免使用 sp_ 前缀 - 它是为 SQL Server 的系统过程保留的。 我将 sp_Defect_B 更改为 p_Defect_B,但仍然没有从过程中捕获表值。 肯定有更好的基于集合的方法吗? 嗯,另一个问题是,当我们没有您的数据库时,您向我们倾销了 代码 - 我们无法调试您的问题。您需要自己进行一些调试并缩小问题范围。 你能告诉我一些其他方法来获得这种方法吗?我想获得具有许多变量的搜索集,这些变量会给出不同类型的结果。我试图缩小范围:1.只有这个存储过程不返回表值,2.我在其他存储过程中使用了临时表和临时变量,它工作正常。 3.这是第一次使用IF..ELSE语句。 4. 这也是第一次创建具有不同列名的结果。 (1 个存储过程创建 3 种类型的列结果)。 5. 在 SMSS 中运行良好,但在 C# Windows 应用程序中无法运行。 【参考方案1】:

您应该真正使用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();

【讨论】:

以上是关于SQL Server IF..ELSE 不在 Windows 应用程序中显示的主要内容,如果未能解决你的问题,请参考以下文章

[SQL server] IF ELSE 和 CASE WHEN 的用法

SQL Server判断语句(IF ELSE/CASE WHEN )

SQL Server判断语句(IF ELSE/CASE WHEN )

sql server 使用 where 和 if else 条件

安装 BCP 而不在客户端计算机上安装 SQL Server?

ms sql server中where子句中的if else条件