2016-07-14 51 views
1

处理我有一个方法,我DataController.cs内:System.Data.Entity.Core.EntityCommandExecutionException不能由用户代码查询

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:数据类型的文本和varchar 是等于运算符不兼容。

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

如何格式化我的查询以摆脱此异常?

回答

0

电子邮件是在SQL数据库

在你的发言你是比较Email属性作为参数包含在其中是文本列Email属性类型的文本。电子邮件属性可能被参数化为varchar类型,并且sql语句失败,因为生成的语句可能为@email = Email,其中@email的类型为varchar,电子邮件为text

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中的设计器。

+0

我改变它为'varchar(max)'类型,但由于Equals方法,代码仍然不起作用。你能告诉我如何改变我的查询,以便它的工作? – NoReceipt4Panda

相关问题