c# – 使用带有参数的命令时临时表的“无效对象名称”

前端之家收集整理的这篇文章主要介绍了c# – 使用带有参数的命令时临时表的“无效对象名称”前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在创建一个临时表,并使用相同的命令和连接使用两个单独的语句进行填充.但是,如果我创建了在创建之前插入参数的表,我将收到一个“无效的对象名称”.如果我在创建后添加它,它可以正常工作.

临时表应该持续整个会话,所以当参数添加到命令对象时,我看不到什么重要.

失败:

using (sqlConnection conn = new sqlConnection("Data Source=.;Initial Catalog=TEST;Integrated Security=True;"))
        using (sqlCommand cmd = conn.CreateCommand())
        {
            conn.Open();

            cmd.Parameters.Add(new sqlParameter("@ID",1234));

            cmd.CommandText = "CREATE TABLE #Test (ID INT NOT NULL PRIMARY KEY,I INT NOT NULL)";
            cmd.ExecuteNonQuery();

            cmd.CommandText = "INSERT INTO #Test VALUES (@ID,1)";
            cmd.ExecuteNonQuery();

            ..... more code that uses the table

        }

作品:

using (sqlConnection conn = new sqlConnection("Data Source=.;Initial Catalog=TEST;Integrated Security=True;"))
        using (sqlCommand cmd = conn.CreateCommand())
        {
            conn.Open();

            cmd.CommandText = "CREATE TABLE #Test (ID INT NOT NULL PRIMARY KEY,I INT NOT NULL)";
            cmd.ExecuteNonQuery();

            cmd.Parameters.Add(new sqlParameter("@ID",1234));

            cmd.CommandText = "INSERT INTO #Test VALUES (@ID,1)";
            cmd.ExecuteNonQuery();

            ..... more code that uses the table

        }

编辑:

sql Profiler对此做了更多的介绍.

如果命令有任何参数,底层代码将发出一个“exec sp_executesql”.如果参数被清除,底层代码会发出更直接的“CREATE TABLE”. Temp表在sp_executesql之后被清理,这说明了我在这里看到的内容.

对我来说,这将是sqlCommand(或相关)代码中的一个错误,但是由于我现在有一个解释,我可以继续下去.

解决方法

事实上在“exec sp_executesql”语句中的问题.当ADO检测到有sqlCommand中声明的参数时,默认使用“sp_executesql”而不是“exec”.但是在这种情况下,第一个命令是创建一个TEMPORAL表,而且已知的时间表仅在存储过程(sp_executesql)中有效,并在退出时被删除.因此,第二个INSERT语句在第一个示例代码中不再有效.在第二个中,时间表被成功创建,并且insert语句被正常执行.希望它有帮助.

猜你在找的C#相关文章