【问题标题】:C# SqlCommand returns 0C# SqlCommand 返回 0
【发布时间】:2018-04-12 07:51:13
【问题描述】:

我创建了一个使用以下命令执行的 SQL 查询,它返回正确数量的条目,但这些条目都包含 0:

如果我在 Management Studio 中运行相同的 SQL 命令,它可以正常工作。

我也尝试过使用 Linq 语句,它也可以正常工作:

希望大家帮我解决问题。

【问题讨论】:

  • 我会开始使用参数化 SQL,而不是直接将filter 包含到查询字符串中。这可能是也可能不是所需的全部 - 很难用相对较少的架构或类型信息来判断。
  • 请不要使用图片,而是使用邮政编码。
  • 请阅读"Why not upload images of code on SO when asking a question?"edit接受的回答你的问题。
  • 你能把直接sql查询中返回的数据放大显示吗,count=0里面一定有东西,否则不会返回..
  • 图像不仅难以阅读,而且 imgur 被我的工作场所屏蔽,所以我什至看不到它们。

标签: c# sql sql-server ssms


【解决方案1】:

您不应该投射到 List<T> - ToList() 会这样做。基本上,简化:

var data = dbContext.Database.SqlQuery<Tuple<DateTime, string, string>>(...).ToList();

可能也适用于值元组:

var data = dbContext.Database.SqlQuery<(DateTime, string, string)>(...).ToList();

这也将允许您在概念上命名它们:

var data = dbContext.Database.SqlQuery<(DateTime Datum, string Text, string Bemerkung)>
       (...).ToList();

注意:连接filter 几乎可以肯定是一个SQL 注入漏洞;如果看起来你应该在那里使用 SQL 参数。


@Evk 指出,EF 可能不支持元组的按列绑定。如果是这种情况,那么您最好的选择是创建一个与列定义匹配的 POCO:

class Foo // rename me to something meaningful
{
    // note: there may be custom attributes you can use
    // to make these names less ugly, i.e.
    // [Column("TEXT")] on a property called Text
    public DateTime RMA_DATUM {get;set;}
    public string TEXT {get;set;}
    public string BEMERKUNG {get;set;}
}

并使用SqlQuery&lt;Foo&gt;

【讨论】:

  • 我怀疑这会奏效。 Tuple 没有默认构造函数。 ValueTuple 确实如此,但无论如何它都有名称为 Item1 等的属性,而 OP select 语句返回的列具有不同的名称。
  • @Evk 我不是 100% 确定 EF 的功能,但肯定 一些 ORMs/micro-ORMs 检测元组/值元组,并实现列-明智的成员绑定。如果 EF 这样做,那么确实:这将是有问题的
  • 好吧,它没有。
猜你喜欢
  • 1970-01-01
  • 2012-02-23
  • 1970-01-01
  • 2013-08-19
  • 2016-10-30
  • 2012-08-13
  • 2013-08-23
  • 2012-08-25
  • 1970-01-01
相关资源
最近更新 更多