【问题标题】:System.Data.Entity.Core.EntityCommandExecutionException Not handled by user code in querySystem.Data.Entity.Core.EntityCommandExecutionException 查询中的用户代码未处理
【发布时间】:2016-07-15 04:29:15
【问题描述】:

我的DataController.cs 中有一个方法:

public JsonResult MoveInLogin(LoginData d)
{
    using (MoveInDBEntities dm = new MoveInDBEntities())
    {
        var user = dm.MoveIns.Where(a => a.CID.Equals(d.CID) && a.Email.Equals(d.Email)).FirstOrDefault();
        return new JsonResult { Data = user, JsonRequestBehavior = JsonRequestBehavior.AllowGet };
    }
}

在声明用户的第 4 行,是触发此异常的位置:

类型异常 'System.Data.Entity.Core.EntityCommandExecutionException' 发生在 EntityFramework.SqlServer.dll 但未在用户代码中处理

当我进一步查看时,我注意到异常详细信息是:

System.Data.SqlClient.SqlException:数据类型 text 和 varchar 在等于运算符中不兼容。

在 SQL 数据库中,我的列名 CID 的类型为 varchar(10),电子邮件的类型为 text

如何格式化我的查询以消除此异常?

【问题讨论】:

    标签: c# sql-server entity-framework


    【解决方案1】:

    电子邮件是 SQL 数据库中的文本类型

    在您的声明中,您将作为参数的电子邮件属性与包含在文本列中的电子邮件属性进行比较。 Email 属性可能被参数化为varchar 类型,而sql 语句失败,因为生成的语句可能是@email = Email,其中@email 的类型为varchar,而Email 的类型为text

    text 类型也已过时 (source),Microsoft 更喜欢现在每个人都使用 varchar(max)nvarchar(max) 作为 ntext。将数据库中的 sql 类型转换为 varchar(max) 将解决问题,这将是最好的方法。

    您应该查看您的类型映射,因为您可能能够指定电子邮件实际上是类型 Text,但即使这样也可能会失败,因为我不相信可以比较或搜索 sql 类型 text(也许我是错了)。


    重新创建错误

    create table #MoveIns (
    CID varchar(10) not null,
    Email text not null)
    
    insert into #MoveIns (CID, Email) values('1','email 1')
    , ('2','email 2')
    
    declare @cid varchar(10) = '1', @email varchar(2000) ='email 1'
    
    /*Next line has error: The data types varchar and text are incompatible in the equal to operator.*/
    select * from #MoveIns where @cid = CID AND @email = Email
    
    drop table #MoveIns
    

    修复错误

    create table #MoveIns (
    CID varchar(10) not null,
    Email text not null)
    
    insert into #MoveIns (CID, Email) values('1','email 1')
    , ('2','email 2')
    
    /*This statement is what you want*/
    alter table #MoveIns alter column Email VARCHAR(MAX) NOT NULL
    GO
    
    /*Test*/
    declare @cid varchar(10) = '1', @email varchar(2000) ='email 1'
    
    /*The data types varchar and text are incompatible in the equal to operator.*/
    select * from #MoveIns where @cid = CID AND @email = Email
    

    如果您仍然有错误,请确保没有其他类型为 text 的列。您可以使用 sp_columns 或使用 Management Studio 中的设计器查询您的数据库表。

    【讨论】:

    • 我将其更改为输入varchar(max),但由于 Equals 方法,代码仍然无法正常工作。您能告诉我如何更改我的查询以使其正常工作吗?
    猜你喜欢
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-28
    • 2014-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多