【问题标题】:Yet not grasping "output variables" concept both on T-SQL and C# [closed]然而在 T-SQL 和 C# 上都没有掌握“输出变量”的概念 [关闭]
【发布时间】:2013-08-17 15:32:16
【问题描述】:

T-SQL/Sql Server Manager 和 C# 中的输出参数是怎么回事?? 2 在与程序集等一起使用时如何组合?

嗯,我看到人们把 T-SQL 存储过程的输出参数放在里面......

这是什么意思?看起来很简单,但他们设法让它变得乏味和复杂。

IE:

我做了一个带有选择和输出参数的存储过程。

有什么大不了的?无论如何我执行它并查看结果。

程序集或从 C# 代码调用它是怎么回事?我执行它,我仍然可以在不需要输出参数的情况下将所有内容保存在数据表或流阅读器中......

有什么好的解释吗??

C#也是如此

out 参数修改有什么作用?

IE:像这样的函数 FindCity(string zipcode, out string cityname)

据我了解,只是我可以在不声明城市名的情况下对其进行评估,它会以字符串形式出现(至少我认为)

什么??? 这是为什么?谁能赐教?

谢谢

【问题讨论】:

  • 如果你查看 MSDN,它会说“当你想要一个方法返回多个值时,声明一个 out 方法很有用。”
  • 这意味着什么? Select 语句已经返回多个值,在 C# 中你甚至可以返回 10000 个返回值......
  • 可以有N个不同类型的out参数,但只能从特定类型的方法返回值。检查可能对您有帮助的答案。
  • 不清楚您指的是 SQL 还是 C#。从猜测中我可以想到第二个,但这没有任何意义。即使没有 out 参数,您仍然必须在单一类型的 SINGLE 对象中返回所需的所有值。
  • OUT 参数有时用作多个记录集的替代方案。例如,假设您要检索客户的订单。有一个标题,其中包含收货方、收单方、...以及订单的行项目。您可以select 标头,然后select 行项目,但由于标头始终是单数,您可以将值作为out 参数返回,并将行项目作为唯一的记录集返回。其他时候,它们用于提高效率。无需返回始终包含一行的记录集的开销,只需将值作为 out 参数返回。

标签: c# sql-server tsql parameters output


【解决方案1】:

虽然确实如此,但在 SQL 中,您可以只使用“选择”将值作为单元格返回,但这并不总是很方便。特别是,对于(比如说)将从其他 tsql 调用的存储过程 - 从 SQL 调用 so 时处理结果集非常棘手;对比:

exec someInsertProc 123, 'ABC', out @id

同样的模式对于非进程 SQL 也很有用,只是为了方便和明确,并使 api 形式化。


在 c# 中,您只能获得一个返回值 - 无法与“选择”相媲美。现在,您可以返回一个复杂对象以具有多个值的属性,但有时使用“out”更方便 - 例如:

int i;
if(int.TryParse(s, out i)) {

。总计 += 我; }

请注意,“out”和“ref”相对不常见 - 并且经常被人们误解。但它们在某些情况下非常有用。

【讨论】:

  • 那里没有任何东西。 Sql 解释对我来说没有任何意义 C#:好吧,如果你想返回一些数据集,只需将 return 语句与数据表、字符串或对象数组或任何你需要的东西放在一起。然而out参数修饰符没有解释
  • @user2212907 在c#中你只能return一件事;有时你想要的不止一件事——例如,TryParse 返回“是否解析”和“解析的值”——但更奇特的事情是可能的。返回一个对象数组不是很容易发现 - 它没有定义返回的内容。 “出去”确实。在 TSQL 中非常相似 - 选择一个值不那么容易被发现,也不那么容易使用(尤其是从 TSQL 本身)
  • 哦……这真的很清楚!现在我从正确的角度来看它!只是作为奖励询问:您有任何链接,或者您可以举例说明您在哪里实际使用它?再次感谢!
  • @user 不要手动 - 但同样,想想任何 TryParse(数字)、TryGetValue(字典)等 api
  • 好的,感谢您的帮助!
【解决方案2】:

SQL:用作向调用者输出结果的附加方式。假设您想查看记录列表和一些聚合或一些相关的单一数据。而不是在结果集中为其创建列,您可以将其写入输出变量。

C#:保证在函数调用退出之前填充 out 参数(否则您的代码将无法编译)。它也是一种将多个对象返回给调用者的方法。看看int.TryParse

【讨论】:

  • 谢谢,但这对我没有帮助.... SQL:什么?我不明白你在说什么。顺便说一句,创建列有什么问题?我并没有真正了解整个事情...... C#:所以只是为了确保在退出之前填充这些参数?顺便说一句,我不明白 tryparse 对我有什么帮助
猜你喜欢
  • 1970-01-01
  • 2011-08-11
  • 2018-01-14
  • 2013-09-02
  • 2014-09-09
  • 2011-06-24
  • 1970-01-01
  • 2018-12-27
  • 2020-07-21
相关资源
最近更新 更多