【问题标题】:Query from C# code outputting differently from SQL Server query从 C# 代码查询输出不同于 SQL Server 查询
【发布时间】:2018-07-16 19:42:36
【问题描述】:

合作:

  • ASP.Net 网络表单应用程序
  • C# 代码不是 vb.net
  • 带有硬编码测试数据的 SQL Server

注意:此问题不会导致任何错误或导致代码中断,但它的输出与预期不同。

我正在尝试使用文件隐藏代码填充 Gridview,用户可以在单击按钮时更新该文件。

要填充的代码:

protected void PopulateReport()
{
    // create connection  and add commands
    SqlConnection con = new SqlConnection(GetConnectionString());
    con.Open();

    if(RP_SelectEmp.Text == "ALL")
    {
         string query1 = "SELECT RequestID, empName, RequestType, RequestDesc, RequestStartDate FROM TOR WHERE (RequestStartDate > @StartDate)" +
                                    " AND (RequestEndDate < @EndDate) AND (granted = @State)";

         SqlCommand cmd = new SqlCommand(query1, con);

         // needed conversions
         DateTime startD = Convert.ToDateTime(RP_FromDateSelect.Text);
         DateTime endD = Convert.ToDateTime(RP_EndDateSelect.Text);
         Boolean state = Convert.ToBoolean("True");

         // needed parameters
         cmd.Parameters.AddWithValue("@State", state);
         cmd.Parameters.AddWithValue("@StartDate", startD);
         cmd.Parameters.AddWithValue("@EndDate", endD);

         // import into gridview
         using (SqlDataReader reader = cmd.ExecuteReader())
         {
             if (reader.Read())
             {
                 GridView1.DataSource = reader;
                 GridView1.DataBind();
             }
             else
             {
                 RP_ErroField.Text = "failed to bind data (reader not read) check C# code";
             }
         }

         con.Close();
    }
}

这编译并且不返回错误但输出:

数据库表包含所有正确的数据类型和列名:

我尝试过的:

  1. 创建一个静态数据源并从上面的代码中传递相同的选择字符串(这将返回硬编码事件,与图片中看到的字段中的完全相同的输入) - 这告诉我查询是没错AddingDataSource,InputingData,Correct event Grabbed

  2. 我尝试更改代码中的转换,DateTime.ParseConvert.ToDateTime 有相同的结果。 bool 和 Boolean 也可以这样说

  3. 我已经分别尝试了每个where子句,并得到相同的无数据显示结果。

  4. 我已经调试了这个 if 语句 2 小时,所有变量数据都在做它应该做的事情(去 if、转换、设置值、运行阅读器和数据绑定)

我不知道还能尝试什么。我需要有关解决此问题的行动计划的帮助;也许我遗漏了什么,或者我的方法是错误的/过时的。

【问题讨论】:

  • 从 WHERE 子句中一次删除一个参数,直到数据重新出现。这将告诉您哪个参数未通过查询(可能是“状态”参数)。
  • granted在数据库中的数据类型是什么?运行查询时,整个 query1 的值是多少?
  • 忘了说:按钮点击只包含 PopulateReport();对于那些会问的人
  • @RobertHarvey 嗨罗伯特,感谢您的回复,但我已经尝试过了,日期时间和布尔值似乎都会导致同样的问题。
  • @JacobH 嗨,雅各布。可以在正确的事件抓取列表中看到 query1 运行的值

标签: c# asp.net sql-server gridview output


【解决方案1】:

这实际上只是一个调试练习。

首先,请仔细检查您没有简单地向后命名两个日期选择器控件!这种情况经常发生。

下一步:转到 SSMS,并获取您现有的查询:

SELECT RequestID, empName, RequestType, RequestDesc, RequestStartDate
FROM TOR 
WHERE (RequestStartDate > @StartDate)
AND (RequestEndDate < @EndDate) AND (granted = @State)

现在;我们知道您已经使用Convert.ToDateTime 来解析日期,这很好。您可能想要检查它正在解析的文化,您期望它解析到(是 2018 年 2 月 1 日?还是 1 月 2 日?),以及何时重新 100% 确定 startDendD实际日期 是什么,使用明确的格式将这些添加到您的查询中(只是为了帮助我们调试);对state 做同样的事情;例如:

DECLARE @StartDate datetime = '01 Jan 2018';
DECLARE @EndDate datetime = '03 Jan 2018';
DECLARE @State bit = 1;

是吗?

DECLARE @StartDate datetime = '01 Jan 2018';
DECLARE @EndDate datetime = '01 March 2018';
DECLARE @State bit = 1;

所以现在我们已经欺骗了参数并且您有完全相同的查询:运行它。 99% 的时间,这样做会告诉你查询出了什么问题。我期望 SSMS 中的查询现在的行为与您的应用程序中的查询一样。所以;现在去修吧!

【讨论】:

  • 这是一个很好的答案,我已经尝试过你的建议,但这对问题没有帮助。从直接 SQL 查询事件已正常运行并返回正确的数据。通过数据源以及您建议的此测试运行时,查询证明是成功的。问题在于,当我从文件后面的代码中尝试此测试时,在未经授权的情况下运行时,没有任何显示,好像数据被抓取但未呈现,当我使用 bool 运行时,没有数据被抓取。渲染是另一个问题,但这个问题似乎是传递一个值来匹配来自 c# 代码的位有什么建议吗?
  • 你的评论让我检查了一些小事。多亏了这一点以及 Sean Lange 分享的关于 AddWithValue 的文章,我才能够将正确的数据放入表中。一旦我不再收到“没有要显示的数据”消息,我就知道我正在获取数据,但我在渲染上遗漏了一些东西,果然我忘记在 gridview 属性上将 AutoGenerateColumns 切换为 true。
猜你喜欢
  • 2016-12-24
  • 1970-01-01
  • 2011-09-18
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 2017-01-21
  • 2013-03-12
相关资源
最近更新 更多