Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SqlDataAdapter.FillSchema和条件SQL语句_C#_Sql_Schema_Sqldataadapter - Fatal编程技术网

C# SqlDataAdapter.FillSchema和条件SQL语句

C# SqlDataAdapter.FillSchema和条件SQL语句,c#,sql,schema,sqldataadapter,C#,Sql,Schema,Sqldataadapter,我正在创建一个应用程序,需要检索SQL语句的模式(实际上是返回表的模式):列名集和相应的SQL类型。 基本实施如下: DataTable table = new DataTable(); SqlDataAdapter sda = new SqlDataAdapter(sqlCommand); sda.FillSchema(table, SchemaType.Source); 之后,我解析DataTable的列信息。 在我尝试在SQL中使用条件语句并基于该条件返回具有不同模式的数据之前,一切都正

我正在创建一个应用程序,需要检索SQL语句的模式(实际上是返回表的模式):列名集和相应的SQL类型。 基本实施如下:

DataTable table = new DataTable();
SqlDataAdapter sda = new SqlDataAdapter(sqlCommand);
sda.FillSchema(table, SchemaType.Source);
之后,我解析DataTable的列信息。 在我尝试在SQL中使用条件语句并基于该条件返回具有不同模式的数据之前,一切都正常。例如:

CREATE TABLE TestDataTable(Column1 int, Column2 nvarchar(100))

IF EXISTS(SELECT * FROM TestDataTable)
BEGIN 
  SELECT Column1 FROM TestDataTable WHERE Column1>2 
END
ELSE 
BEGIN 
  SELECT Column2 FROM TestDataTable WHERE Column1>2 
END
结果总是检索到的模式中的Column1,这不取决于IF语句中的条件(当我反转它时,结果仍然相同)。 SELECT子句中还有一个SQL指示符是CASE语句——如果它们根据某些条件返回不同的列,我们会得到更令人惊讶的结果

我尝试了不同的变体和选项,但它们都有自己的局限性:

  • SqlDataAdapter.Fill();-如果statemt计算正确,但无法获取字符串类型长度
  • ExecuteReader(CommandBehavior.SequentialAccess);SqlDataReader.GetSchemaTable();-如果statemt计算正确,但无法获取字符串类型长度
  • ExecuteReader(CommandBehavior.SchemaOnly);SqlDataReader.GetSchemaTable();-无法获取字符串类型的长度。此外,它还返回模式,假设每个条件的计算结果都为True
  • 我找到了关于SqlDataAdapter.FillSchema()方法如何工作的讨论,看起来它非常复杂,并生成了一些元数据请求SQL。所以我很惊讶它即使在动态生成的SQL中也能正确工作,比如

    DECLARE @selectPart1 nvarchar(100)
    SET @selectPart1=N'SELECT Column1'
    DECLARE @selectPart2 nvarchar(100)
    SET @selectPart2=N'FROM TestDataTable'
    DECLARE @selectQuery nvarchar(200)
    SET @selectQuery = @selectPart1 + ' ' + @selectPart2
    
    EXECUTE sp_executesql @selectQuery"
    
    但是如果它成功地计算了SET语句,为什么它不能计算IF条件呢?

    PS:我知道,基于某些条件返回不同数据模式的语句是不寻常的,很难处理,这肯定是一种不好的做法,但我们将得到的SQL是用户提供的,我们至少应该检测到这种不一致的情况

    作为一种解决方法,检测此类情况的方法(向用户显示适当的消息)也是可以接受的。