sql-server – 从.NET可以获得由SqlCommand对象生成的完整SQL字
从.NET环境中,我可以访问由 SqlCommand对象生成的完整SQL字符串吗? 注意:在调试模式下,完整的SQL字符串显示在VisualStudio中的Intellisense悬停中. 如果必须,我愿意使用反射技术.我相信这里有人知道一种方法来实现它. 更新1: 更新2: 根据下面的答案(和引用)表明在准备或执行过程中没有内部生成完整的SQL字符串,我做了一些使用.NET Reflector.即使是内部连接类似乎也会传递对象而不是将它们归结为字符串,例如: 内部抽象void AddPreparedCommand(SqlCommand cmd); 总的来说,感谢每个人的细节水平,以证明可以做什么,并展示实际发生的事情.非常感激.我喜欢彻底的解释;他们增加了保证,并为答案提供了信任. 解决方法一个简单的循环用它们的值替换所有参数名称将为您提供类似于最终结果的东西,但是有几个问题.>由于SQL实际上从未使用参数值进行重建,因此不需要考虑换行和引号等内容 有了这些参数,并考虑了以相同字符开头的参数名称,如@NAME和@NAME_FULL,我们可以将所有参数名称替换为该参数所在的值: string query = cmd.CommandText; foreach (SqlParameter p in cmd.Parameters.OrderByDescending(p => p.ParameterName.Length)) { query = query.Replace(p.ParameterName,p.Value.ToString()); } 但是,还有一个问题,那就是如果参数是一个字符串,那么SQL最初看起来像这样: SELECT * FROM yourtable WHERE table_code = @CODE 将如下所示: SELECT * FROM yourtable WHERE table_code = SOME CODE WITH SPACES 这显然不是合法的SQL,所以我们也需要考虑一些参数类型: DbType[] quotedParameterTypes = new DbType[] { DbType.AnsiString,DbType.Date,DbType.DateTime,DbType.Guid,DbType.String,DbType.AnsiStringFixedLength,DbType.StringFixedLength }; string query = cmd.CommandText; var arrParams = new SqlParameter[cmd.Parameters.Count]; cmd.Parameters.CopyTo(arrParams,0); foreach (SqlParameter p in arrParams.OrderByDescending(p => p.ParameterName.Length)) { string value = p.Value.ToString(); if (quotedParameterTypes.Contains(p.DbType)) value = "'" + value + "'"; query = query.Replace(p.ParameterName,value); } (编辑:淮安站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |