ExecuteSqlCommand 返回“无效的对象名称”错误

Posted

技术标签:

【中文标题】ExecuteSqlCommand 返回“无效的对象名称”错误【英文标题】:ExecuteSqlCommand returns 'invalid object name' error 【发布时间】:2018-04-21 13:39:13 【问题描述】:

我正在尝试在 Entity Framework Core 中执行原始 SQL 代码,但它返回以下错误:

System.Data.SqlClient.SqlException: '无效的对象名称'#MyTempTable'。'

我尝试运行以下命令,均失败:

dbContext.Database.ExecuteSqlCommand(@"INSERT INTO #MyTempTable (BatchId, RowId) VALUES (1,1)");
dbContext.Database.ExecuteSqlCommand(@"INSERT INTO dbo.#MyTempTable (BatchId, RowId) VALUES (1,1)");

如果我直接从 SSMS 运行这两个命令,它们都可以正常工作。

我做错了什么?

【问题讨论】:

【参考方案1】:

语句 INSERT INTO 要求目标表存在。 在您的代码上下文中,这是错误的,您会收到错误消息。 当创建临时表的连接关闭时会删除临时表,因此 EF 完全有可能关闭了您创建临时表的点和您尝试使用它的点之间的连接。

如果没有更多上下文来理解代码流,您可以将查询编写为

select 1 as BatchID, 1 as RowID INTO #MyTempTable 

INSERT INTO vs SELECT INTO

MSDN 上还有this document 提示可以手动打开和关闭EF dbContext 下的连接

【讨论】:

这是解决方案,保持连接打开。当我试图理解这个问题时,我对临时表的有限理解是问题:我在 SSMS 中用不同的用户创建了一个同名的临时表,并认为它们会被共享,但它们是按用户管理的。谢谢

以上是关于ExecuteSqlCommand 返回“无效的对象名称”错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 EF 的 DbContext.ExecuteSqlCommand() 的事务期间出现异常

如何使用表变量设置 ExecuteSqlCommand

如何执行 EF Database.ExecuteSQLCommand 异步?

ExecuteSqlCommand 与 SqlQuery 有啥区别?进行数据库访问时?

csharp ExecuteSqlCommand

如何将参数传递给 DbContext.Database.ExecuteSqlCommand 方法?