【问题标题】:c# parameter values to string?c#参数值到字符串?
【发布时间】:2012-09-12 14:12:46
【问题描述】:

好的,我确定我不是唯一一个对此感到疑惑的人 =)

简而言之,是否可以使用VisualStudio进行转换:

string a1, string a2, string a3, string a4, string a5, string  a6

变成一个类似的字符串:

"'value1', 'value2', 'value3', 'value4', 'value5', value6'"

(不用担心确切的格式,我可以自己处理)?

背景: 我经常有调用接受大量参数的存储过程的函数,有时(调试)我需要构建“exec dbo.storedprocname param1,param2 ....”字符串并直接在服务器上运行它。目前我必须手动构建字符串,我希望有一种简单的方法可以在 VisualStudio 的即时窗口中打印出来

编辑(应大众需求): 我正在使用 Linq2SQL(是的,我知道它已经过时了)并且里面有 100 多个 SP。当我需要调试一个函数时,我会在其中一个函数中设置一个中断,以查看它将传递给数据库的内容。所以这将是 RUNTIME。当它到达断点时:

public static void MethodCreatedByLINQ2Sql(string param1, string param2, string param3, ...)
{
    context.mystoredprocedure(param1, param2, param3...); //<---breakpoint
}

我想以某种方式(无需指定每个参数)打印出一个分隔字符串,我可以剪切并粘贴到 SSMS2008(试图节省时间)以构建这样的字符串

exec dbo.mystoredprocedure [['value1', 'value2', 'value3'......]] <--- pasted value from VisualStudio

不,我不想做 SQLInjections 或类似的事情。我只是想节省时间 - 其中一些 SP 有 20 多个参数。

【问题讨论】:

  • 你听说过List&lt;string&gt;吗?
  • 您不应该将 SQL 查询构建为字符串。您应该使用参数化查询。使用exec 特别危险,应尽可能避免。
  • 确定你的方法最终会构建要执行的 SQL 字符串吗?
  • 如果您只是希望将实际的原始查询发送到 SQL 服务器,那么将探查器附加到 SQL 实例可能会产生更好的结果。无论代码中发生了什么,它都会准确地显示 SQL 实例接收到的内容。
  • 你是指设计时还是运行时?

标签: c# visual-studio


【解决方案1】:

这就是你所追求的吗?

String paramStr = String.Format("'{0}', '{1}', '{2}', '{3}', '{4}'", a1, a2, a3,a4,a5);

我应该指出,将这样的字符串发送到数据库会导致SQL Injection

选项 2:

要打印到中间窗口,你可以使用这个技巧:

  1. 创建断点
  2. 右击红点 -> “当击中时”。
  3. 在新屏幕中选择“打印消息”复选框
  4. 在文本框中键入上面的 String.Format,但每边都有一个花括号:

{ String.Format(.....) }

有关您可以在该消息中打印的参数的更多信息:http://msdn.microsoft.com/en-us/library/232dxah7.aspx

【讨论】:

  • 抱歉废话,但这正是我想要避免的。我希望有一些我可以运行的命令(也许使用反射器??)如果我在任何给定函数上放置一个断点,我可以打印出当前传递给该函数的值的分隔列表(在 string.format你提供的会很酷)。
  • 您可以执行以下操作:创建断点,右键单击红点->“当命中”。在新屏幕中选择“打印消息”复选框,然后在文本中键入上面的 String.Format,但每边都有一个花括号:{ String.Format(.....) } 如果这是你想要的让我知道,我会更新答案。这将打印到中间屏幕...
  • 首先,“当被击中..”选项非常酷——我不知道它存在,所以我玩了一下。问题 #1 是我仍然必须输入参数列表(或从函数中复制参数列表,粘贴它,删除数据类型......)。问题 #2 这个选项不在 VS2010 Express (cry) 中。不过,这可能是最接近的解决方案。
  • 这不是我想要的,但它现在可以工作。谢谢老兄。
【解决方案2】:

我认为最好的方法是在您的方法中使用params 使其更简单:

public static void MethodCreatedByLINQ2Sql(params string[] list)
{
    //And then very simply use String.Join()
    string s = String.Join(",", list);
}

【讨论】:

    【解决方案3】:

    您可以在调试时在 Visual Studio 的即时窗口中运行代码。

    【讨论】:

    • 对 - 我希望在即时窗口中我可以生成传递给函数的分隔字符串;不知道怎么做。
    • 你怎么能做到这一点?你说在即时窗口中运行代码是什么意思?
    • 好吧,我发现了这个 SO 帖子 (stackoverflow.com/questions/4949503) 并使用类似“myFunction.Method.GetParameters()”的东西 - 它会列出你的函数和数据类型列表。在同一篇文章中,有人建议“myFunction.Method.GetParameters()[index].Name”,但这对我不起作用。也许那里有什么东西?
    • 我认为只有在访问托管堆栈时才能获取参数值我认为只有利用 SOS 等优势调试器扩展才有可能
    【解决方案4】:

    String.Join() 允许您连接任意数量的字符串,如下所示:

    string completeString = String.Join(", ", a1, a2, a3, ... ,aN);
    

    这个重载(它有 5 个不同的)是.Join(string separator, params object[] values)

    当然,正如已经指出的那样,应该避免这种情况,尤其是当您必须使用EXEC 时。参数化查询是非常可取的(但完全是另一个主题,而且您可以轻松找到许多围绕 SO 本身的示例)。

    【讨论】:

    • 我会发出一个通知,最好的重载直到 .NET 4 才出现。
    • 通过使用分隔符,您还可以添加将每个值括起来的单引号。
    • @ChaosPandion 有趣,我不知道。
    【解决方案5】:

    在字符串数组中有 a1、a2:

    var a = new string[] { a1, a2, a3... };
    

    然后以这种方式将它们的值转换为字符串:

    var v = string.Join("','", a);
    

    无论如何,我建议对您的存储过程使用 Parameter。上面的技巧对于生成 sql 查询并不干净,因为它可能导致 SQL 注入。

    【讨论】:

      【解决方案6】:

      如果您运行 SQL Profiler,它将向您显示 EXEC 语句以及您需要的所有信息。您将不得不尝试使用 Profiler 中的哪些选项最适合您,但通常如果您使用 TSQL_SPs 模板,它应该会为您提供所需的信息。

      当然,对此的限制是,在进行存储过程调用之前,您不会得到字符串,因此如果您在代码中设置断点,则必须在调用 SQL Server 之后。

      【讨论】:

        猜你喜欢
        • 2012-11-04
        • 1970-01-01
        • 2011-12-08
        • 2012-11-26
        • 1970-01-01
        • 2012-07-30
        • 2020-08-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多