我的内部有一个方法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 };
}
}
在声明用户的第四行,触发此异常的位置:
EntityFramework.SqlServer.dll中发生类型为'System.Data.Entity.Core.EntityCommandExecutionException'的异常,但未在用户代码中处理
当我进一步查看时,我注意到“异常详细信息”是:
System.Data.SqlClient.SqlException:数据类型text和varchar在等于运算符中不兼容。
我的列名CID在SQL数据库中是类型varchar(10)
,电子邮件text
在SQL数据库中是类型。
如何格式化查询以消除此异常?
电子邮件在SQL数据库中为文本类型
在您的语句中,您正在将Email属性作为参数与text列中包含的Email属性进行比较。电子邮件财产很可能被参数化以一个varchar
类型,SQL语句是失败,因为生成的语句可能是@email = Email
其中@email
的类型的varchar
,可以收发电子邮件text
。
类型text
也已过时(源),Microsoft希望每个人现在都使用ntextvarchar(max)
或将其nvarchar(max)
用于ntext。将数据库中的sql类型转换为varchar(max)
可以解决该问题,这将是最好的方法。
您应该查看类型映射,因为您可能可以指定Email实际上是类型,Text
但是即使那样也可能会失败,因为我不认为text
可以比较或搜索sql类型(也许我错了)。
重新产生错误
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中使用或使用设计器来查询数据库表。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句