C# 确定SQL Server查询(存储过程)结果类型

C# 确定SQL Server查询(存储过程)结果类型,c#,sql-server,stored-procedures,orm,code-generation,C#,Sql Server,Stored Procedures,Orm,Code Generation,我计划将SQL Server中的数据组织为我自己的小型orm,在代码中的每个orm上创建元数据类 对于我正在硬编码对象的测试,下一步是使用SQL Server查询这些对象来生成每个对象的属性 现在我用C语言处理代码中的存储过程部分, 我想知道如何使用SQL Server查询执行的命令的结果类型 例如,在这里,我们知道它在做什么,甚至通过读它的名字 [dbo].[GtallDrLFilesCount] 但另一个可以选择其他类型的返回,如行集字符串等' 使用上述存储过程将返回一个int: if(@

我计划将SQL Server中的数据组织为我自己的小型orm,在代码中的每个orm上创建元数据类

对于我正在硬编码对象的测试,下一步是使用SQL Server查询这些对象来生成每个对象的属性

现在我用C语言处理代码中的存储过程部分, 我想知道如何使用SQL Server查询执行的命令的结果类型

例如,在这里,我们知道它在做什么,甚至通过读它的名字

[dbo].[GtallDrLFilesCount]
但另一个可以选择其他类型的返回,如行集字符串等'

使用上述存储过程将返回一个int:

if(@AllDrives=1) Begin 
        Select 
          * From [dbo].[HddFolderFiles]
End
但是上面的下一步选择的是所有内容,而不是RowsCount

我计划访问SQL Server并查询它的对象,由于我不打算设置return参数,有没有更优雅的方法来实现它,而不是解析存储过程的.SQL文件

例如,如果文本包含SELECT*这是一个行集,请使用DataTable将其替换 如果文本包含Select COUNT*这是int prepare int类型变量


我想,如果我没有为存储过程分配out参数,SQL Server是否可以以某种方式告诉返回类型,即使它没有out参数,这样做也很容易?

我想您必须执行存储过程才能获取它的列,但您可以使用set fmtonly执行存储过程,而不必实际重新存储数据

即使是返回单个值如-int的存储过程,在使用c。。。因此,您只需查看阅读器的列即可获得所需的数据

因此:

将返回一个可在c中检查的记录集

var adoCon = new System.Data.SqlClient.SqlConnection(_sConnectStr);
var adoCmd = new System.Data.SqlClient.SqlCommand("your SQL (above)", adoCon);

var Rows = adoCmd.ExecuteReader();
DataTable dtSchema = Rows.GetSchemaTable();
现在,您可以在dtSchema中漫游以获取列。这不是纯SQL,而是一种c+SQL方法。[dbo].[GTAllDrlFileScont]将返回int类型的单列表列

显然-使用SQL命令而不是字符串。下一个技巧是将SQL类型转换为本机c类型,对于某些数据类型来说很容易,而对于其他数据类型则很难。。。看一看ADOCommand的ReturnProviderSpecificTypes选项

希望有帮助

您可以使用SQL Server 2012+读取有关resultset的元数据:

此动态管理函数将Transact-SQL语句作为 参数,并描述的第一个结果集的元数据 声明


此方法对读取更多信息有限制

我建议您将尽可能多的存储过程更改为存储函数。然后,返回类型被指定为定义的一部分。@marc_s嘿,marc,找到了回答的时间,在我正在编写的这些“实验”中有一个教训/附加值,……所有这些都是我希望找到更快和/或更定制/更好的方法,但主要是为了我的经验。我发现尝试处理.net中许多有趣的内置模块以及一些精选作者和API类别的扩展非常有教育意义。我在向最好的人学习的过程中学习了很多技术。@marc_s looking@your record,我想我永远都不会接触到你的XP,但我会比你努力学习和教育自己的所有课程和课程更快地接近你,再加上你在职业生涯中参与的项目的经验,我的方法是省去你的努力:我自己去做,这是一种我愿意走的捷径,与你所牺牲的相比,在你的时代,这并不像现在那么容易。。堆栈溢出已经存在,还有一些额外的改进资源,想象一下,如果像你这样的人现在就开始他的职业生涯。@marc_s,如果那些ORM没有一次又一次地重新发明轮子->infinity,那么它们就不会很多了,只有一个了,不是吗?是的,肯定会有帮助,所以在sql for Sproc中,与SchemaOnly类似,它只在C命令类型中执行,但没有数据内容,因此通过sqldatareader读取它以查看列数据类型将是一个很好的ide!我认为这是一个正确的答案,但在我做出决定之前,我会给它更多的时间去理解:谢谢!现在我不知道从15分钟前开始我将采取哪种方法@lad2025添加了他的答案,我将很快尝试这两种方法,非常感谢你们两个!!这是非常棒的,因为我保存了一段代码供以后在服务器表对象上实现另一种更复杂的方法来获得相同的结果查询sys表对象及其结构,表对象和存储过程返回类型的代码都可以使用该代码,现在,我所需要的是下一步(不包括在这个问题中)的参数和每个存储过程对象上的rest releavant meta,例如存储过程名称,以及与table和cols一样的参数。我发现存储过程元数据查询也在您上面发布的链接周围:
var adoCon = new System.Data.SqlClient.SqlConnection(_sConnectStr);
var adoCmd = new System.Data.SqlClient.SqlCommand("your SQL (above)", adoCon);

var Rows = adoCmd.ExecuteReader();
DataTable dtSchema = Rows.GetSchemaTable();
SELECT *
FROM sys.dm_exec_describe_first_result_set(
   N'EXEC [dbo].[MyProcedure]', NULL, 0);

SELECT *
FROM sys.dm_exec_describe_first_result_set(
   N'SELECT * FROM [dbo].[tab]', NULL, 0);