System.Data.Entity.Core.EntityCommandExecutionException不由查询

时间:2016-07-14 19:50:07

标签: c# sql-server entity-framework

我的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   在等于运算符中是不兼容的。

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

如何设置查询格式以摆脱此异常?

1 个答案:

答案 0 :(得分:0)

  

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

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

类型text也已过时(source),Microsoft希望现在每个人都使用textvarchar(max)来获取ntext。将数据库中的sql类型转换为nvarchar(max)将解决问题,并且是最好的方法。

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

重新创建错误

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查询数据库表,也可以使用Management Studio中的设计器。