C# 从参数化动态查询获取参数类型

C# 从参数化动态查询获取参数类型,c#,sql,sql-server,C#,Sql,Sql Server,我正在编写一个界面,以提供有关查询的最终用户输入。 管理员定义查询,例如: SELECT col1, col2, col3, col4 + col5 AS sumcol FROM mytable WHERE col10 = @parm1 AND somethingelse > @parm2 现在我可以用C#解析该查询,得到所有返回的列名 using (myReader = cmd.ExecuteReader(CommandBehavior.KeyInfo)) { //Retrie

我正在编写一个界面,以提供有关查询的最终用户输入。 管理员定义查询,例如:

SELECT col1, col2, col3, col4 + col5 AS sumcol
FROM mytable
WHERE col10 = @parm1 AND somethingelse > @parm2
现在我可以用C#解析该查询,得到所有返回的列名

using (myReader = cmd.ExecuteReader(CommandBehavior.KeyInfo))
{
    //Retrieve column schema into a DataTable.
    schemaTable = myReader.GetSchemaTable();

    //For each field in the table...
    foreach (DataRow field in schemaTable.Rows)
    {
        // Display one-liner of important fields
        Console.WriteLine("{0} - Base Table: [{1}]  Data Type: [{2}]", 
            field[schemaTable.Columns["ColumnName"].ToString()].ToString(),
            field[schemaTable.Columns["BaseTableName"].ToString()].ToString(),
            field[schemaTable.Columns["DataType"].ToString()].ToString()
            );
    }
但是我还想得到参数@parm1和@parm2所期望的数据类型。我可以解析字符串ok以获得参数名,但我想在执行查询以获得结果之前,向最终用户显示这两个参数的输入框,并检查它们的类型是否正确。我不必检查特定的列名,例如,它总是colx=@parm1,然后我可以检查colx的类型,并假设@parm1是相同的类型,但子句可能经常比这更复杂。 我无法控制管理员创建的查询,但我想尝试让最终用户尽可能避免错误,提示他们为参数输入正确的类型,因为我无法确定管理员是否会给参数指定合理的名称,以指示查询所需的内容。当我将查询传递给SqlServer以获取返回列类型时,是否有方法让它也可以告诉我参数类型可能是什么?
我希望这是有意义的。

如果您使用的是SQL Server 2012及更高版本,则可以使用存储过程猜测参数类型

例如,在Northwind示例数据库上执行以下查询:

EXEC sp_describe_undeclared_parameters 
        N'SELECT * FROM Customers WHERE CustomerID = @CustomerID'
给出以下结果:

+-------------------+-------------+--------------------------+----------------------------+----------------------+---------------------+-----------------+------------------------+------------------------------+----------------------------+--------------------------+----------------------------------------+-----------------------------+-----------------------------------+---------------------------------+-------------------------------+---------------------------+-----------------------------+------------------------------------+--------------------+---------------------+-----------------------+-----------------------+----------------------+
| parameter_ordinal |    name     | suggested_system_type_id | suggested_system_type_name | suggested_max_length | suggested_precision | suggested_scale | suggested_user_type_id | suggested_user_type_database | suggested_user_type_schema | suggested_user_type_name | suggested_assembly_qualified_type_name | suggested_xml_collection_id | suggested_xml_collection_database | suggested_xml_collection_schema | suggested_xml_collection_name | suggested_is_xml_document | suggested_is_case_sensitive | suggested_is_fixed_length_clr_type | suggested_is_input | suggested_is_output | formal_parameter_name | suggested_tds_type_id | suggested_tds_length |
+-------------------+-------------+--------------------------+----------------------------+----------------------+---------------------+-----------------+------------------------+------------------------------+----------------------------+--------------------------+----------------------------------------+-----------------------------+-----------------------------------+---------------------------------+-------------------------------+---------------------------+-----------------------------+------------------------------------+--------------------+---------------------+-----------------------+-----------------------+----------------------+
|                 1 | @CustomerID |                      239 | nchar(5)                   |                   10 |                   0 |               0 | NULL                   | NULL                         | NULL                       | NULL                     | NULL                                   | NULL                        | NULL                              | NULL                            | NULL                          |                         0 |                           0 |                                  0 |                  1 |                   0 | NULL                  |                   239 |                   10 |
+-------------------+-------------+--------------------------+----------------------------+----------------------+---------------------+-----------------+------------------------+------------------------------+----------------------------+--------------------------+----------------------------------------+-----------------------------+-----------------------------------+---------------------------------+-------------------------------+---------------------------+-----------------------------+------------------------------------+--------------------+---------------------+-----------------------+-----------------------+----------------------+

如果您使用的是SQL Server 2012及更高版本,则可以使用存储过程猜测参数类型

例如,在Northwind示例数据库上执行以下查询:

EXEC sp_describe_undeclared_parameters 
        N'SELECT * FROM Customers WHERE CustomerID = @CustomerID'
给出以下结果:

+-------------------+-------------+--------------------------+----------------------------+----------------------+---------------------+-----------------+------------------------+------------------------------+----------------------------+--------------------------+----------------------------------------+-----------------------------+-----------------------------------+---------------------------------+-------------------------------+---------------------------+-----------------------------+------------------------------------+--------------------+---------------------+-----------------------+-----------------------+----------------------+
| parameter_ordinal |    name     | suggested_system_type_id | suggested_system_type_name | suggested_max_length | suggested_precision | suggested_scale | suggested_user_type_id | suggested_user_type_database | suggested_user_type_schema | suggested_user_type_name | suggested_assembly_qualified_type_name | suggested_xml_collection_id | suggested_xml_collection_database | suggested_xml_collection_schema | suggested_xml_collection_name | suggested_is_xml_document | suggested_is_case_sensitive | suggested_is_fixed_length_clr_type | suggested_is_input | suggested_is_output | formal_parameter_name | suggested_tds_type_id | suggested_tds_length |
+-------------------+-------------+--------------------------+----------------------------+----------------------+---------------------+-----------------+------------------------+------------------------------+----------------------------+--------------------------+----------------------------------------+-----------------------------+-----------------------------------+---------------------------------+-------------------------------+---------------------------+-----------------------------+------------------------------------+--------------------+---------------------+-----------------------+-----------------------+----------------------+
|                 1 | @CustomerID |                      239 | nchar(5)                   |                   10 |                   0 |               0 | NULL                   | NULL                         | NULL                       | NULL                     | NULL                                   | NULL                        | NULL                              | NULL                            | NULL                          |                         0 |                           0 |                                  0 |                  1 |                   0 | NULL                  |                   239 |                   10 |
+-------------------+-------------+--------------------------+----------------------------+----------------------+---------------------+-----------------+------------------------+------------------------------+----------------------------+--------------------------+----------------------------------------+-----------------------------+-----------------------------------+---------------------------------+-------------------------------+---------------------------+-----------------------------+------------------------------------+--------------------+---------------------+-----------------------+-----------------------+----------------------+

啊,那看起来很有趣。谢谢,我会试一试的。啊,那看起来很有趣。谢谢,我试试看。