C# 查询中的用户代码未处理System.Data.Entity.Core.EntityCommandExecutionException
我的C# 查询中的用户代码未处理System.Data.Entity.Core.EntityCommandExecutionException,c#,sql-server,entity-framework,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(
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
如何格式化查询以消除此异常
电子邮件在SQL数据库中为文本类型
在语句中,您将电子邮件属性作为参数与文本列中包含的电子邮件属性进行比较。电子邮件属性可能被参数化为varchar
类型,sql语句失败,因为生成的语句可能是@Email=Email
,其中@Email
类型为varchar
,Email类型为text
类型text
也已过时(),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中的设计器查询数据库表
电子邮件在SQL数据库中为文本类型
在语句中,您将电子邮件属性作为参数与文本列中包含的电子邮件属性进行比较。电子邮件属性可能被参数化为varchar
类型,sql语句失败,因为生成的语句可能是@Email=Email
,其中@Email
类型为varchar
,Email类型为text
类型text
也已过时(),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方法,代码仍然无法工作。您能告诉我如何更改查询以使其工作吗?我将其更改为typevarchar(max)
,但由于使用了Equals方法,代码仍然无法工作。你能告诉我如何改变我的查询,使它工作吗?