【问题标题】:Incorrect syntax near 'WITHOUT_ARRAY_WRAPPER'. C#“WITHOUT_ARRAY_WRAPPER”附近的语法不正确。 C#
【发布时间】:2017-02-27 12:49:38
【问题描述】:

我有一个这样的 sql 查询

SELECT * FROM vm.tablename WHERE DeviceId = 3 FOR JSON PATH,WITHOUT_ARRAY_WRAPPER;

我正在尝试像这样从 c# 应用程序执行这个 sql 查询

  using (var dataContext = new DataContext(_connectionString)){
    var query = new StringBuilder("SELECT * FROM vm.tablename");
            query.Append(" WHERE DeviceId = ");    
            query.Append(deviceId);
            query.Append("FOR JSON PATH,WITHOUT_ARRAY_WRAPPER");
             Debug.WriteLine(query);
    List<string> = dataContext.ExecuteQuery<string>(query.ToString()).ToList();
    }

我在 ExecuteQuery 行上遇到异常:'WITHOUT_ARRAY_WRAPPER'附近的语法不正确。'。 在输出窗口中,我得到这样的查询:'SELECT * FROM vm.tablename WHERE DeviceId = 3 FOR JSON PATH, WITHOUT_ARRAY_WRAPPER' 当我在 sql server mgmt studio 中运行它时它工作正常但是,当我运行 c# 代码时它会给出异常.

【问题讨论】:

  • 你在什么数据库上运行?
  • 确保您使用的是 SQL Server 2016,因为这是该版本(或更高版本)中提供的新功能。
  • 您在deviceIdFOR 的值之间缺少一个空格
  • @PatrickHofman SQL 服务器 2016
  • 现在也是学习参数化 SQL 的好时机......

标签: c# sql .net sql-server-2016


【解决方案1】:

您收到错误是因为:

new StringBuilder("SELECT * FROM vm.tablename");
            query.Append(" WHERE DeviceId = ");    
            query.Append(deviceId);
            query.Append("FOR JSON PATH,WITHOUT_ARRAY_WRAPPER");

结果:

SELECT * FROM vm.tablename WHERE DeviceId = :deviceIDFOR JSON PATH,WITHOUT_ARRAY_WRAPPER

在最后一行的“FOR”之前添加一个空格。我建议使用接受字符串并解析间距和“。”的方法制作一个自定义 QueryBuilder 类。对你来说,它为你省去了很多动态 SQL 的麻烦。

【讨论】:

  • 我已经这样做了,我的查询看起来像这样“SELECT * FROM vm.tablename WHERE DeviceId = 3 FOR JSON PATH, WITHOUT_ARRAY_WRAPPER”.. 仍然存在错误
  • 数据库返回错误还是SqlDataReader/Adapter本身返回错误?
  • 如果您不小心使用了错误的重载来构造其中任何一个对象,就会发生这种情况。请将您的 DataReader/Adapter 声明和初始化代码添加到您的原始帖子中。
猜你喜欢
  • 1970-01-01
  • 2015-12-12
  • 2013-12-16
  • 1970-01-01
  • 1970-01-01
  • 2018-08-14
  • 2011-03-11
  • 2014-02-16
  • 2017-01-11
相关资源
最近更新 更多