问题是这样的: 
在程序中写的sql语句是带参数的,如: 
string s="update aaa set id=@id,name=@name,sex=@sex"; 
然后通过SqlCommand来对各个参数进行赋值等操作,可是,我想看看执行的时候这个sql语句是什么样的,也就是说想拿到查询分析器中去执行一下,该怎么看啊?带参数的设断点的话,看到的这个sql语句也是="update aaa set id=@id,name=@name,sex=@sex"; 
这也没办法执行啊,还有就是,不知道这个SqlCommand.Parameters.Add(参数) 这句话如果将值加到sql语句中会变成什么样子啊? 
这个语句是通过SqlCommand来加变量的,而普通的是就在sql中拼接,直接拼接的就可以知道sql执行的什么样,可是这种带参数的,怎么知道sql语句最终是什么样啊? 我的意思就是: 
在程序中加了断点之后,跟踪sql语句时, 
如果id,name,sex三个变量在程序中付了值都知道,那么: 
我知道这个语句在执行时,是什么样子(可以拿到查询分析器中去执行): 
string s="update aaa set id='"+id+"',name='"+name+"',sex='"+sex"'"; 
而不知道这个语句在执行时,是什么样子? 
string s="update aaa set id=@id,name=@name,sex=@sex"; 
这三个参数:@id,@name,@sex是通过SqlCommand加入到sql中的,在查看sql语句的时候,sql始终是="update aaa set id='"+id+"',name='"+name+"',sex='"+sex"'"; 
请大家执教,该怎么能看到这种带参书的sql语句啊?

解决方案 »

  1.   

    tt,还是看不到,转回net再问问吧。
      

  2.   

    后面的是绑定变量的sql,需要看绑定变量的信息
      

  3.   

    请大家执教,该怎么能看到这种带参书的sql语句啊?打开事件探查器跟踪就可以了。
      

  4.   


    个人认为,通过SqlCommand.Parameters.Add这种方式加入的参数,最后还是生成这样的SQL语句:
    string s="update aaa set id='"+id+"',name='"+name+"',sex='"+sex"'"; 
    去执行的,只不过这样比纯粹的SQL拼接多了一个步骤:类型匹配。。
    因为用sqlParameters这种方式加参数时,都要指定参数的类型(长度),这样在一定的程序上也可以防止一部分的SQL注入。
      

  5.   


    如果楼主是要跟踪,看执行的语句是什么样子的。可以用事件探查器。最后生成的语句应该都是类似:
    exec sp_executesql 'update aaa set id=@id,name=@name',N''等等
      

  6.   

    我也想知道
    不光.net看不到,delphi也看不到
    不知道Java能不能看到
      

  7.   

    在sql端是使用sp_executesql来执行的。
    所以,不可能拼成 sql字串。自己可以打开即时窗口,查看每个parameters值。
      

  8.   

    如果只是为了看到sql执行的dml语句原型应该怎样的话,可以自己写一段代码实现。cmd.CommandText = "SELECT * FROM tb WHERE id=@id and name=@name";
            cmd.Parameters.Add("@id", SqlDbType.Int, 4);
            cmd.Parameters.Add("@name", SqlDbType.VarChar, 1);
            cmd.Parameters[0].Value = 1;
            cmd.Parameters[1].Value = "a";
            string sql=cmd.CommandText;
            foreach (SqlParameter sp in cmd.Parameters)
            {
                if (sp.Direction == ParameterDirection.Input || sp.Direction == ParameterDirection.InputOutput)
                {
                    sql=sql.Replace(sp.ParameterName.ToString(), sp.Value.ToString());
                }
            }
    这样,语句存在了sql这个字串变量中。
      

  9.   

    cmd.CommandText = "SELECT * FROM tb WHERE id=@id and name=@name";
            cmd.Parameters.Add("@id", SqlDbType.Int, 4);
            cmd.Parameters.Add("@name", SqlDbType.VarChar, 1);
            cmd.Parameters[0].Value = 1;
            cmd.Parameters[1].Value = "1";
            string sql=cmd.CommandText;
            foreach (SqlParameter sp in cmd.Parameters)
            {
                if (sp.Direction == ParameterDirection.Input || sp.Direction == ParameterDirection.InputOutput)
                {
                    sql=sql.Replace(sp.ParameterName.ToString(), sp.Value.ToString());
                }
            }
      

  10.   

    update aaa set id=@id,name=@name,sex=@sex
    在 ado中要用带参数命令应用?号,不能用@id,@id为sql server的变量,只有ado command中执行的为存储过程,才会有参数.
    可用
      adocmd.commandtext='update aaa set id=?id,name=?name,sex=?sex'
      在adocmd的activeconnection有连接时,
      adocmd.Parameters的参数会自动生成
      要执行update aaa的命令,
      只要在parameters中的参数赋上相应的值
      adocmd.parameters[0].value=要更新的id
    adocmd.parameters[1].value=要更新的name
    adocmd.parameters[2].value=要更新的sex
     再adocmd.execute执行即可
     如要更新其它值,只要给参数赋其它值,再用execute即可带参数执行相比于直接用动态生成执行字符串执行,如果是多次执行,服务器不用每次都编译sql语句,速度会更快.