首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 敬请高手们指点一下迷津:使用临时表时,就不能使用参数,使用参数,就不能产生临时表? [已结贴,结贴人:layerr]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • layerr
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 揭帖率:
    发表于:2008-08-08 16:00:01 楼主
    今天在写一个.net分页程序时,遇到个怪事情,发现使用了参数时,就不能生成临时表。
    实验代码如下:

            string connString = @"Data Source=localhost\SQLEXPRESS;Initial Catalog=NorthWind;User ID=sa;Password=123456";
            SqlConnection conn = new SqlConnection(connString);
            conn.Open();
            SqlTransaction trans = conn.BeginTransaction();
            SqlCommand command = new SqlCommand();
            command.Connection = conn;
            command.Transaction = trans;


            command.CommandText = "select * into #tmpTable from Orders where EmployeeID = @ID";
            command.Parameters.AddWithValue("@ID",3);

            int r = command.ExecuteNonQuery();

            command.CommandText = "select * from #tmpTable";
            SqlDataReader reader = command.ExecuteReader();
            DataTable dt = new DataTable();
            dt.Load(reader);
            reader.Close();
            trans.Commit();
            conn.Close();

            this.Gridview1.DataSource = dt;
            this.Gridview1.DataBind();

    在执行command.CommandText = "select * from #tmpTable";这句时要报错,内容是“找不到#tmpTable”
    如果将红色两句改为:

            command.CommandText = "select * into #tmpTable from Orders where EmployeeID = 3";
            command.Parameters.AddWithValue("@ID",3);

    仍然报错。
    改为

            command.CommandText = "select * into #tmpTable from Orders where EmployeeID = 3";
            //command.Parameters.AddWithValue("@ID",3);

    错误才消除,敬请高手们指点一下迷津。
    50  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yrwx001
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-08 16:09:541楼 得分:0
    //你這樣寫
      int ID;
      ID = 3;
      command.CommandText = "select * into #tmpTable from Orders where EmployeeID = "+ID;
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Smile_Wong
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-08 16:10:242楼 得分:0
    当然会报错啦,select * from #tmpTable 这句是查询临时表,你都没有建立这个临时表
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • qianjin036a
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-08 16:13:303楼 得分:0
    引用 1 楼 yrwx001 的回复:
    //你這樣寫
      int ID;
      ID = 3;
      command.CommandText = "select * into #tmpTable from Orders where EmployeeID = "+ID;


    兄弟,这是参数查询...
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • qianjin036a
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-08 16:18:374楼 得分:0
    呵呵,不对,这不是写的存储过程,似乎不能用parameters对象传数据吧?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fcuandy
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-08 16:55:105楼 得分:50
    不是怪事,我告诉你原因吧。

    对于临时表的生命周期的问题,你先看我这个贴子的第(4)点。
    http://topic.csdn.net/u/20080726/23/45568f53-069f-472e-80b0-1361a72109de.html


    看完后,你知道了局部(或者说本地)临时表的生命周期之后, 再接下来看后面的。


    在ado.net中,command以参数方式执行语句时,实际上在数据库端转换为 sp_executesql来执行。

    那么也就是说,当你应用参数后实际上在sql端执行的是以下两步操作:


    exec sp_executesql N'select * into #tmp where ....',N'@id int input',@id
    select * from #tmp

    那么看了我的贴子,你明白了,在执行完动态语句后,#tmp已经不存在了,这里之所以报错,就是这个原因


    而不以传参方式执行的话,你的cs代码转换到数据库端 实际上执行的是

    select * into #tmp where ...
    select * from #tmp ..

    不是动态语句,二者在一个会话中,所以不报错。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • only_endure
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-08 16:58:566楼 得分:0
    临时表的生命周期问题
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved