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 |
+-------------------+-------------+--------------------------+----------------------------+----------------------+---------------------+-----------------+------------------------+------------------------------+----------------------------+--------------------------+----------------------------------------+-----------------------------+-----------------------------------+---------------------------------+-------------------------------+---------------------------+-----------------------------+------------------------------------+--------------------+---------------------+-----------------------+-----------------------+----------------------+
啊,那看起来很有趣。谢谢,我会试一试的。啊,那看起来很有趣。谢谢,我试试看。