临时表应该持续整个会话,所以当参数添加到命令对象时,我看不到什么重要.
失败:
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# – 使用带有参数的命令时临时表的“无效对象名称”全部内容,希望文章能够帮你解决c# – 使用带有参数的命令时临时表的“无效对象名称”所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)