我计划将我的数据组织在SQL Server中,作为我自己的一小部分,在我的代码中为每个数据创建元数据类。
对于我正在对对象进行硬编码的测试,下一步是使用SQL Server查询生成每个对象的属性。
现在我在C#中处理我的代码的存储过程部分 我想知道如何以某种方式使用SQL Server查询执行的命令的结果类型?
例如,在这里,我们知道它甚至通过阅读其名称来做什么......
[dbo].[GtallDrLFilesCount]
但是另一个可以选择其他类型的返回,例如行集字符串等'
使用上面的存储过程将返回一个int:
if(@AllDrives=1) Begin
Select
* From [dbo].[HddFolderFiles]
End
但是下一个(上面)选择所有内容而不是RowsCount
我打算访问SQL Server并查询它的对象,因为我不打算设置返回参数(OUT),是否有更优雅的方法来实现它,而不是解析{{1存储过程的文件?
如果文字包含.sql
(这是一个行集),则需要SELECT *
如果text包含DataTable
(这是int),则准备int类型变量。
我认为在我没有为我的存储过程分配一个out参数的情况下,SQL Server能否以某种方式告诉返回类型,即使它没有Select COUNT(*)
参数可以让它变得容易吗?
答案 0 :(得分:1)
我认为您必须执行SProc来获取它的列,但是您可以使用set fmtonly
当你使用c#时,即使是返回单个值的sprocs(例如 - int)也会返回一个表...所以你只需要看一下读者的列来获取你想要的数据。
所以:
set fmtonly on
exec [dbo].[MyStoredProc] 0
set fmtonly off
将返回您可以在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].[GtallDrLFilesCount]
将返回单个列表(int类型的列)。
显然 - 使用SQL命令(不是字符串)。下一个技巧是将SQL类型转换为本机c#类型(对于某些数据类型很容易,对其他数据类型也很棘手......看看ADOCommand的ReturnProviderSpecificTypes
选项)。
希望有所帮助!
答案 1 :(得分:1)
从SQL Server 2012+
开始,您可以使用sys.dm_exec_describe_first_result_set
来阅读有关结果集的元数据:
此动态管理函数将Transact-SQL语句作为 参数并描述第一个结果集的元数据 言。
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);
的 SqlFiddleDemo
强>
此方法限制了更多信息阅读Remarks section