温馨提示:本文翻译自stackoverflow.com,查看原文请点击:c# - ExecuteNonQuery is not working to create TempTable SQL Server
ado.net c# sql-server

c# - ExecuteNonQuery无法创建临时表SQL Server

发布于 2020-03-27 11:39:17

临时表未在数据库中创建。我验证了凭据有权创建临时表。复制并粘贴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();

            }

        }

查看更多

查看更多

提问者
Ben V
被浏览
131
2019-07-03 23:00

我正在使用相同的凭据签入SSMS,在代码完成后收到“无效的对象名称'#TempTable'”错误

这是因为SSMS使用的是不同的连接,而temp-tables #Fooper-connection无法#Foo从任何其他连接访问临时表。

听起来您想要一个全局临时表。这很简单,只要将其命名为##Foo代替#Foo全局临时表在所有连接上共享。