【问题标题】:Linq to SQL and SQL Server Compact Error: "There was an error parsing the query."Linq to SQL 和 SQL Server Compact 错误:“解析查询时出错。”
【发布时间】:2010-03-08 03:32:44
【问题描述】:

我创建了一个 SQL Server 紧凑型数据库 (MyDatabase.sdf),并在其中填充了一些数据。然后我运行 SQLMetal.exe 并生成了一个 linq to sql 类 (MyDatabase.mdf)

现在我尝试通过相对简单的选择从表中选择所有记录,但出现错误:

"解析查询时出错。[Token line number = 3,Token line offset = 67,Token in error = MAX]"

这是我的选择代码:

public IEnumerable<Item> ListItems()
{
    MyDatabase db_m = new MyDatabase("c:\mydatabase.sdf");
    return this.db_m.TestTable.Select(test => new Item()
        {
            ID = test.ID,
            Name = test.Name,
            RequestData = test.RequestData != null ? test.RequestData.ToString() : null,   
            Url = new System.Uri(test.Uri)
        }.AsEnumerable();
}

我听说 Linq to SQL 可以与 Sql Compact 一起使用,我还需要做一些其他配置吗?

【问题讨论】:

  • 您的代码被剪裁了 - 无法判断您要做什么。你能用完整的代码编辑吗?
  • @Rob Conery - 我添加了丢失的代码,但我认为这不是问题的一部分,因为我认为代码并不是得到的查询的一部分生成。
  • 哦,等一下,我看到了问题……检查 test.Request != null 是否在查询中创建了一个 case 语句。我没有意识到它是如何工作的!
  • 如何将该测试移出查询?

标签: linq-to-sql sql-server-ce


【解决方案1】:

可能是一个错误的 NVARCHAR(MAX) 吗?我想我以前在 sql compact edition 上看到过这样的错误,我记得这与 sql compact edition 不支持 NVARCHAR(MAX) 数据类型有关。这也可能是您在异常中看到“token in error = MAX”消息的原因?

【讨论】:

  • 你说的太对了! test.RequestData.ToString() 导致一个 convert(nvarchar(MAX), RequestData) 被插入到 SQL 中。
  • 在 SQL CE 数据库中你会用什么替换 nvarchar(max)?
【解决方案2】:

为什么需要对 RequestData 进行转换?你的班级是什么样的?你可以这样设置吗?

    RequestData = test.RequestData  

【讨论】:

  • 我的类使用字符串来保存请求数据,而数据库使用图像。我正在将 linq 二进制数据转换为字符串。不知道如何将转换逻辑移出 linq 代码,因为我不希望我的班级知道任何 linq 数据类型。我最终将数据库中的数据类型更改为 ntext 而不是 image。
【解决方案3】:

我还尝试了在用于 Linq-to-sql 的 Winforms 应用程序中将 SQLMetal 用于 SQL Server 精简版的方法 . 在遇到一些问题后,我跳过了 Linq-to-SQL 方法并采用了 Linq-To-Entities 方法。我正在这样做的查询的语法与 99% 相同;-)

此外,使用 edmx 设计器时,可以轻松更新、删除和添加表格。(在设计器中使用拖放或右键单击等效项。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多