临时表未在数据库中创建。我验证了凭据有权创建临时表。复制并粘贴SQL命令,它可在SSMS中使用。
调试时不会抛出异常。在执行之前,cmd变量具有正确的连接和SQL文本。
我在应用程序的其他部分中使用了相同的连接字符串来成功查询服务器,因此那里没有问题。
我的目标是创建一个临时表,然后通过SqlBulkCopy填充它,然后执行合并更新,然后删除该临时表。
编辑:我的错误是在DestinationTableName中引用了错误的表,但更是如此,我正在使用无法看到临时表的单独连接来检查SSMS中的进度。另外,finally语句是多余的。谢谢大家!
string tmpTable = @"create table #TempTable
(
[Column1] [varchar](50) NOT NULL,
[Column2] [varchar](50) NOT NULL,
[Column3] [varchar](50) NOT NULL
)";
string connString = "Data Source=AzureDBServer;" +
"Initial Catalog=Database;" +
"User id=UserId;" +
"Password=Password;";
using (SqlConnection connection = new SqlConnection(connString))
{
connection.Open();
SqlCommand cmd = new SqlCommand(tmpTable, connection);
cmd.ExecuteNonQuery();
try
{
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
{
bulkCopy.DestinationTableName = "#TempTable";
bulkCopy.WriteToServer(dataTable);
string mergeSql = "<Will eventually have merge statement here>";
cmd.CommandText = mergeSql;
int results = cmd.ExecuteNonQuery();
cmd.CommandText = "DROP TABLE #TempTable";
cmd.ExecuteNonQuery();
}
}
catch (Exception)
{
throw;
}
finally
{
SqlCommand final = new SqlCommand("DROP TABLE #TempTable", connection);
final.ExecuteNonQuery();
}
}
我正在使用相同的凭据签入SSMS,在代码完成后收到“无效的对象名称'#TempTable'”错误
这是因为SSMS使用的是不同的连接,而temp-tables #Foo
是per-connection。您无法#Foo
从任何其他连接访问临时表。
听起来您想要一个全局临时表。这很简单,只要将其命名为##Foo
代替#Foo
。全局临时表在所有连接上共享。
如果我注释掉合并部分并直接转到Drop table命令,则会收到错误“无法删除表...,因为它不存在或您没有权限”。我认为这是因为未创建表。我想念什么?
@BenV:您两次放桌子-一次在您的主体中,然后再次在您的中
finally
。后者将失败。@Jeroen Mostert Ohhh当然,我知道那一定是愚蠢的简单事情。谢谢!