我的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
。
如何设置查询格式以摆脱此异常?
答案 0 :(得分:0)
电子邮件是SQL数据库中的文本类型
在您的对帐单中,您将Email属性作为参数与包含在文本列中的Email属性进行比较。 Email属性可能被参数化为varchar
类型,并且sql语句失败,因为生成的语句可能是@email = Email
,其中@email
的类型为varchar
,而电子邮件是{{ 1}}。
类型text
也已过时(source),Microsoft希望现在每个人都使用text
或varchar(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中的设计器。