【问题标题】:Why my sql query works on mssql and doesn't work on visual studio?为什么我的 sql 查询适用于 mssql 而不适用于 Visual Studio?
【发布时间】:2019-09-18 10:47:21
【问题描述】:

我的 sql 查询是:

选择 islemtipi, sum(AlcT), sum(BrcT), sum(KdvTop), sum(iskonto) from carih where FirmaKodu ='001' 和 islemtipi = 'Satış Faturası' 或 islemtipi ='Alış Faturası' 或 islemtipi = 'Tahsilat' 或 islemtipi = 'Ödeme' and (Tarih>= '2019-01-01' and Tarih

在 MSSQL 上完美运行。但是当我在 Visual Studio 上尝试相同的查询时,它只给了我 2 列结果,它们是 TahsilatÖdeme 列。我无法解决问题。也许问题在于我的查询包含土耳其语言字符,但 Ödeme 包含土耳其字符 Ö

我的 c# 代码也是

using (SistemEntities db = new SistemEntities())
                {
string sorgu = "Select islemtipi, sum(AlcT), sum(BrcT), sum(KdvTop), sum(iskonto) from carih Where FirmaKodu ='001'
    and islemtipi = 'Satış Faturası' or islemtipi ='Alış Faturası' or islemtipi = 'Tahsilat'
    or islemtipi = 'Ödeme' and (Tarih>= '2019-01-01'  and Tarih <='2019-12-31')
    group by islemtipi";
                    List<ENT_carih> rapor = db.Database.SqlQuery<ENT_carih>(sorgu).ToList();

                    return rapor;
                }

它只给了我 2 列结果,它们是 TahsilatÖdeme 列。

【问题讨论】:

  • 不要使用SELECT *,指定你的列,这样对你更好,速度更快。
  • 也许您在 VS 中针对错误的实例/数据库运行了查询。
  • 可能与字符有关,Ö 可能没问题 - 因为它也用于德语?正如@CaldeiraG 所说,尝试指定列以查看是否有效。
  • 发布您在 Visual Studio 中使用的代码可能会有所帮助
  • 好的,我指定了我的列,但我仍然有同样的问题 select islemtipi, sum(AlcT), sum(BrcT), sum(KdvTop), sum(iskonto) from carih where FirmaKodu ='001' and islemtipi = 'Satış Faturası' 或 islemtipi ='Alış Faturası' 或 islemtipi = 'Tahsilat' 或 islemtipi = 'Ödeme' and (Tarih>= '2019-01-01' and Tarih

标签: c# sql-server asp.net-mvc


【解决方案1】:

代码对非英语字符串使用 ASCII 而不是 Unicode 文字。解决方案是 not 添加 N 前缀。最好的选择是使用参数化查询。

这看起来像 EF 6.2 代码。 Database.SqlQuery 接受参数。代码至少应更改为:

var query= @"Select islemtipi, sum(AlcT), sum(BrcT), sum(KdvTop), sum(iskonto) 
             from carih Where FirmaKodu =@code
             and islemtipi = @item1 or islemtipi =@item2 or islemtipi = @item3
    or islemtipi = @item4 and (Tarih>= @from  and Tarih <=@to)
    group by islemtipi";
var rapor = db.Database.SqlQuery<ENT_carih>(query,
                new SqlParameter("@code","001"),
                new SqlParameter("@item1","Satış Faturası"),
                ...
                new SqlParameter("@from",fromDate.Date),
                new SqlParameter("@to",toDate.Date),
            ).ToList();

EF 将由此生成正确的参数化查询,并将字符串作为 Unicode (nvarchar) 参数传递。数字、日期等也将作为强类型参数传递。如果fromto 参数需要是date 而不是datetime,可以使用one of the constructors that accept a data type 创建一个date 类型参数:

new SqlParameter("@from",SqlDbType.Date) { Value=fromDate.Date}

虽然查询不是很复杂,但可以使用 LINQ 编写。假设 Carih 是一个 DbSet,可以这样写:

var results = db.Carih.Where(c=>c.FirmaKodu=someCode && c.islemtipi=someItem &&....)
                .GroupBy(c=>c.islemtipi)
                .Select(grp=>new { islemtipi=grp.Key,
                                   AlcT=grp.Sum(c=>c.AlcT),
                                   ...
                                 });

顺便说一句,原来的查询有点奇怪。它按FirmaKodu AND islemtipi=.. 或其他选项之一过滤。我怀疑正确的条件是:

Where FirmaKodu ='001'
     and islemtipi IN ('Satış Faturası',...)
     and (Tarih>= '2019-01-01'  and Tarih <='2019-12-31')

要在 LINQ 中生成 IN 子句,需要将所有项目放入容器中并使用 container.Contains(someField)

var items=new[]{"...","..."};
var results = db.Carih.Where(c=>c.FirmaKodu=someCode
                                && items.Contains(c.islemtipi) 
                                && c.Tarih>=fromDate.Date
                                && c.Tarih<=toDate.Date)
                .GroupBy(c=>c.islemtipi)
                .Select(grp=>new { islemtipi=grp.Key,
                                   AlcT=grp.Sum(c=>c.AlcT),
                                   ...
                                 });

【讨论】:

    【解决方案2】:

    我通过输入“Alış Faturası”而不是“Alýþ Faturasý”和“Satış Faturası”而不是“Satýþ Faturasý”解决了这个问题

    【讨论】:

      猜你喜欢
      • 2013-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-30
      • 2020-04-13
      • 1970-01-01
      • 2020-05-02
      • 1970-01-01
      相关资源
      最近更新 更多