问题是这样的:
在程序中写的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语句啊?
在程序中写的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语句啊?
个人认为,通过SqlCommand.Parameters.Add这种方式加入的参数,最后还是生成这样的SQL语句:
string s="update aaa set id='"+id+"',name='"+name+"',sex='"+sex"'";
去执行的,只不过这样比纯粹的SQL拼接多了一个步骤:类型匹配。。
因为用sqlParameters这种方式加参数时,都要指定参数的类型(长度),这样在一定的程序上也可以防止一部分的SQL注入。
如果楼主是要跟踪,看执行的语句是什么样子的。可以用事件探查器。最后生成的语句应该都是类似:
exec sp_executesql 'update aaa set id=@id,name=@name',N''等等
不光.net看不到,delphi也看不到
不知道Java能不能看到
所以,不可能拼成 sql字串。自己可以打开即时窗口,查看每个parameters值。
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这个字串变量中。
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());
}
}
在 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语句,速度会更快.