数据表总是变空

时间:2017-11-10 05:21:13

标签: c# sql-server rdlc

我正在尝试使用rdlc在mvc web应用程序中显示报告。我创建了数据集和数据表。但现在报告查看器总是不断重新加载。当我试图找出问题时,我发现了这个问题。

这里是C#代码

private DataTable GetData(DateTime sdate, DateTime edate,string user,string sp_name)
            {
                DataTable oDataTable = new DataTable();
                string ConStr = System.Configuration.ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
                using (SqlConnection con = new SqlConnection(ConStr))
                {
                    SqlCommand cmd = new SqlCommand("GetBalanceSheet_CurrentUser", con);
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.Add("@SDate", SqlDbType.DateTime).Value = sdate;
                    cmd.Parameters.Add("@EDate", SqlDbType.DateTime).Value = edate;
                    cmd.Parameters.Add("@Uid", SqlDbType.VarChar).Value = user;

                    SqlDataAdapter oSqlDataAdapter = new SqlDataAdapter(cmd);
                    oSqlDataAdapter.Fill(oDataTable);
                }
                return oDataTable;

            }

这里是Sql存储过程

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- GetBalanceSheet_CurrentUser '2017-09-12' ,'2017-11-12' ,'ab0eb318-de5f-4f13-a80b-7a95f678ad8a'

ALTER PROCEDURE [dbo].[GetBalanceSheet_CurrentUser]
    @SDate DateTime,@EDate DateTime,@Uid VarChar(MAX)
AS

IF OBJECT_ID ('tempdb..#TEMP1') IS NOT NULL
DROP TABLE #TEMP1
IF OBJECT_ID ('tempdb..#TEMP2') IS NOT NULL
DROP TABLE #TEMP2

DECLARE @UserId VarChar(MAX)
SELECT @UserId = @Uid

SELECT ROW_NUMBER() OVER(ORDER BY Date) RNo,Description,Date,Amount,ForUser,CreatedUser,Status,ApprovedBy
    INTO #TEMP1
    FROM (

            SELECT PEDM.ProjectExpenditureDescription AS Description , PEDM.ExpendedDate As Date,PEDM.ProjectExpenditureCost As Amount, ANU1.UserName As ForUser,ANU1.UserName As CreatedUser,PEDM.ApprovedStatus As Status,ANU2.UserName As ApprovedBy 
            FROM ProjectExpenditureDetailsModel PEDM
            JOIN AspNetUsers ANU1
            ON ANU1.Id = PEDM.CreatedUser
            JOIN AspNetUsers ANU2
            ON ANU2.Id = PEDM.ApprovedBy
            WHERE PEDM.IsActive = 1
            AND PEDM.IsDelete = 0
            AND PEDM.Rejected = 0
            AND PEDM.CreatedUser = @UserId
            UNION ALL
            SELECT OMDM.ObtainedMoneyDescription As Description,OMDM.ObtainedDate As Date,(OMDm.ObtainedMoneyAmount *-1) As Amount, ANU3.UserName As ForUser,ANU4.UserName As CreatedUser,OMDM.ApprovedStatus,ANU5.UserName As ApprovedBy
            FROM ObtainedMoneyDetailsModel OMDM
            JOIN AspNetUsers ANU3
            ON ANU3.Id = OMDM.ForUser
            JOIN AspNetUsers ANU4
            ON ANU4.Id = OMDM.CreatedUser
            JOIN AspNetUsers ANU5
            ON ANU5.Id = OMDM.ApprovedBy
            WHERE OMDM.IsActive = 1
            AND OMDM.IsDelete = 0
            AND OMDM.Rejected = 0
            AND OMDM.ForUser = @UserId
        )A
ORDER BY Date

SELECT RNo,Description,Convert (varchar(20),Date,103) AS ConvertedDate,Date,Amount,SUM(Amount) OVER (ORDER BY RNo) AS Balance,ForUser,CreatedUser,Status,ApprovedBy
INTO #TEMP2
FROM #TEMP1

SELECT RNo,Description,ConvertedDate,Date,Amount,Balance,ForUser,CreatedUser,Status,ApprovedBy
FROM #TEMP2
WHERE Date Between @SDate AND @EDate

当我执行程序时,sql profiler表示它成功命中。但是当我将结果返回到数据表时,它总是变空。

1 个答案:

答案 0 :(得分:0)

  

我使用相同的参数手动执行了sp。它显示10   记录。但是当我通过我的c#代码调用它的命中但是sql数据   适配器总是空的,如{}

您是否在同一帐户下手动执行sp?

您的过程使用datetime参数,但您传入的此参数的文字是语言相关

相反,您应该使用语言无关的格式yyyymmdd(不带任何分隔符)

传递它们

现在,您的登录语言与应用程序的默认登录名不同,这会导致日期文字的解释不同。

这是一个向您展示问题的示例。首先按原样执行,然后发表评论set language us_english并取消注释set language British;

declare @t table (dt datetime);
insert into @t values ('20171001'), ('20171101'); -- added 1st oct + 1st nov

--set language British; 
set language us_english;

declare @SDate datetime ='2017-09-12',  @EDate datetime = '2017-11-12';

select *
from @t
WHERE dt Between @SDate AND @EDate;