【问题标题】:I am not geting all data我没有得到所有数据
【发布时间】:2018-12-19 09:52:21
【问题描述】:

我正在尝试使用这样的存储过程从我的数据库中获取一些数据

[getAllRecordsForSalaryCalculation]
    @year NCHAR(10),
    @Bruger NCHAR(20)
AS
BEGIN
    IF (@year = 2018)
    BEGIN
        SELECT SUM(Overtid1) AS overtid1Before 
        FROM timer 
        WHERE DateForQuery >= CONVERT(DATETIME, '2018-12-01') 
          AND DateForQuery <= CONVERT(DATETIME, '2019-04-30') 
          AND Bruger LIKE '%@Bruger%'

        SELECT SUM(Overtid1) AS overtid1after 
        FROM timer 
        WHERE DateForQuery >= CONVERT(DATETIME, '2019-05-01') 
          AND DateForQuery <= CONVERT(DATETIME, '2019-11-30') 
          AND Bruger LIKE '%@Bruger%'

        SELECT SUM(Overtid2) AS overtid2Before 
        FROM timer 
        WHERE DateForQuery >= CONVERT(DATETIME, '2018-12-01') 
          AND DateForQuery <= CONVERT(DATETIME, '2019-04-30') 
          AND Bruger LIKE '%@Bruger%'

        SELECT SUM(Overtid2) AS overtid2after 
        FROM timer 
        WHERE DateForQuery >= CONVERT(DATETIME, '2019-05-01') 
          AND DateForQuery <= CONVERT(DATETIME, '2019-11-30') 
          AND Bruger LIKE '%@Bruger%'

        SELECT SUM(Vagt) AS vagtBefore 
        FROM timer 
        WHERE DateForQuery >= CONVERT(DATETIME, '2018-12-01') 
          AND DateForQuery <= CONVERT(DATETIME, '2019-04-30') 
          AND Bruger LIKE '%@Bruger%'

        SELECT SUM(Vagt) AS vagtafter 
        FROM timer 
        WHERE DateForQuery >= CONVERT(DATETIME, '2019-05-01') 
          AND DateForQuery <= CONVERT(DATETIME, '2019-11-30') 
          AND Bruger LIKE '%@Bruger%'
    END
END

我的代码是这样的

con.Open();

SqlDataAdapter da = new SqlDataAdapter("getAllRecordsForSalaryCalculation", con);
da.SelectCommand.CommandType = CommandType.StoredProcedure;

da.SelectCommand.Parameters.AddWithValue("@year", year);
da.SelectCommand.Parameters.AddWithValue("@Bruger", bruger);

da.Fill(ds);
con.Close();

但我只得到第一个选择并且它是空的。那里有数据,当我将它作为查询运行时它可以工作。我不确定我在哪里做错了。有人可以帮忙吗?

【问题讨论】:

  • 您的 LIKE 子句定义错误,请参阅此问题:stackoverflow.com/questions/14237755/…。请改用Bruger LIKE '%' + @Bruger + '%'
  • 显然它在作为查询运行时不起作用,因为'%@Bruger%' 不会像您认为的那样做。还有很多不使用AddWithvalue 的理由。 NCHAR 也是 Year 的错误数据类型
  • 以及关于不使用addwithvalue的讨论
  • 您的过程生成 6 个结果集,每个结果集 1 行(可能),而不是 1 个结果集 6 行(具有不同的列名)。你明白其中的区别吗?此外,这些信息的消费者如何知道每一行的“含义”?你强迫消费者根据位置来假设一些东西。这不是一个好的设计 - 重新开始。

标签: c# sql-server


【解决方案1】:

我的程序建议:

CREATE PROC [getAllRecordsForSalaryCalculation] (@year INT, @Bruger NVARCHAR(20)) AS
BEGIN
    SET DATEFORMAT YMD
    IF (@year = 2018)
    BEGIN
        WITH tm AS (
            SELECT Overtid1 AS Ov1, Overtid2 AS Ov2, Vagt AS Vag, DateForQuery AS Dt
            FROM timer
            WHERE Bruger LIKE '%' + @Bruger + '%'
                AND DateForQuery BETWEEN '2018-12-01' AND '2019-11-30'
        )
        SELECT
             overtid1Before =(SELECT SUM(Ov1) FROM tm WHERE Dt BETWEEN '2018-12-01' AND '2019-04-30')
            ,overtid1After  =(SELECT SUM(Ov1) FROM tm WHERE Dt BETWEEN '2019-05-01' AND '2019-11-30')
            ,overtid2Before =(SELECT SUM(Ov2) FROM tm WHERE Dt BETWEEN '2018-12-01' AND '2019-04-30')
            ,overtid2After  =(SELECT SUM(Ov2) FROM tm WHERE Dt BETWEEN '2019-05-01' AND '2019-11-30')
            ,vagtBefore     =(SELECT SUM(Vag) FROM tm WHERE Dt BETWEEN '2018-12-01' AND '2019-04-30')
            ,vagtAfter      =(SELECT SUM(Vag) FROM tm WHERE Dt BETWEEN '2019-05-01' AND '2019-11-30')
    END
END

【讨论】:

    【解决方案2】:

    LIKE 子句是错误的。 '%@Bruger%' 改为使用 '%'+ @Bruger+ '%'

    试试这个。

    [getAllRecordsForSalaryCalculation]
        @year NCHAR(10),
        @Bruger NCHAR(20)
    AS
    BEGIN
        IF (@year = 2018)
        BEGIN
            SELECT SUM(Overtid1) AS overtid1Before 
            FROM timer 
            WHERE DateForQuery >= CONVERT(DATETIME, '2018-12-01') 
              AND DateForQuery <= CONVERT(DATETIME, '2019-04-30') 
              AND Bruger LIKE '%'+ @Bruger +'%'
    
            SELECT SUM(Overtid1) AS overtid1after 
            FROM timer 
            WHERE DateForQuery >= CONVERT(DATETIME, '2019-05-01') 
              AND DateForQuery <= CONVERT(DATETIME, '2019-11-30') 
              AND Bruger LIKE '%'+ @Bruger +'%'
    
            SELECT SUM(Overtid2) AS overtid2Before 
            FROM timer 
            WHERE DateForQuery >= CONVERT(DATETIME, '2018-12-01') 
              AND DateForQuery <= CONVERT(DATETIME, '2019-04-30') 
              AND Bruger LIKE '%'+ @Bruger +'%'
    
            SELECT SUM(Overtid2) AS overtid2after 
            FROM timer 
            WHERE DateForQuery >= CONVERT(DATETIME, '2019-05-01') 
              AND DateForQuery <= CONVERT(DATETIME, '2019-11-30') 
              AND Bruger LIKE '%'+ @Bruger +'%'
    
            SELECT SUM(Vagt) AS vagtBefore 
            FROM timer 
            WHERE DateForQuery >= CONVERT(DATETIME, '2018-12-01') 
              AND DateForQuery <= CONVERT(DATETIME, '2019-04-30') 
              AND Bruger LIKE '%'+ @Bruger+ '%'
    
            SELECT SUM(Vagt) AS vagtafter 
            FROM timer 
            WHERE DateForQuery >= CONVERT(DATETIME, '2019-05-01') 
              AND DateForQuery <= CONVERT(DATETIME, '2019-11-30') 
              AND Bruger LIKE '%'+ @Bruger+ '%'
        END
    END
    

    【讨论】:

      【解决方案3】:

      试试这个:

      SELECT 
      (select sum(Overtid1) from timer where DateForQuery >= Convert(datetime,'2018-12-01') and DateForQuery <= Convert(datetime,'2019-04-30') and Bruger like'%@Bruger%') as overtid1Before,
      (select sum(Overtid1) from timer where DateForQuery >= Convert(datetime,'2019-05-01') and DateForQuery <= Convert(datetime,'2019-11-30') and Bruger like'%@Bruger%') as overtid1after,
      (select sum(Overtid2) from timer where DateForQuery >= Convert(datetime,'2018-12-01') and DateForQuery <= Convert(datetime,'2019-04-30') and Bruger like'%@Bruger%') as overtid2Before,
      (select sum(Overtid2) from timer where DateForQuery >= Convert(datetime,'2019-05-01') and DateForQuery <= Convert(datetime,'2019-11-30') and Bruger like'%@Bruger%') as overtid2after,
      (select sum(Vagt) from timer where DateForQuery >= Convert(datetime,'2018-12-01') and DateForQuery <= Convert(datetime,'2019-04-30') and Bruger like'%@Bruger%') as vagtBefore,
      (select sum(Vagt) from timer where DateForQuery >= Convert(datetime,'2019-05-01') and DateForQuery <= Convert(datetime,'2019-11-30') and Bruger like'%@Bruger%') as vagtafter
      ;
      

      【讨论】:

        猜你喜欢
        • 2019-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多