【问题标题】:SqlDataReader doesn't read when column empty当列为空时,SqlDataReader 不读取
【发布时间】:2015-08-14 04:44:05
【问题描述】:

我对以下代码有疑问:

public void checkTypes(String sqlTable, String sqlColumn)
{
    using (SqlConnection connection = new       SqlConnection(conStr.Text))
    {
        String query = "SELECT " + sqlColumn + " FROM " + sqlTable;

        SqlCommand command = new SqlCommand(query, connection);

        connection.Open();
        SqlDataReader read = command.ExecuteReader();

        while (read.Read())
        {
            for (int i = 0; i < read.FieldCount; i++)
            {
                Type dataType = read.GetFieldType(i);

                if (dataType == typeof(int))
                {
                    // Do for integers (INT, SMALLINT, BIGINT)
                    typeOf = "Integer";
                    read.Close();
                    connection.Close();
                    return;
                }
                else if (dataType == typeof(double))
                {
                     //and so on...
                }
            }
        }
    }
}

现在...我只想检查列的类型,但问题是创建表时它没有条目,然后根本没有输入 while 循环。如何在不编写全新代码的情况下稍微修改它?我不想插入伪值。谢谢!希望有人可以帮助我。

编辑:

好的,所以我再解释一下: 用户可以在不同的文本框中输入列名。现在我想从每个框中获取列名并检查数据类型是否与该列应具有的数据类型匹配。

【问题讨论】:

  • 您使用的是什么数据库?如果是 SqlServer,您可以从系统表 INFORMATION_SCHEMA.COLUMNS 中获取此信息;其他数据库可能有类似的系统表可以使用
  • 你到底想做什么?打折剩余的else..if 语句,一旦找到int,您就会从该方法返回。您不能使用 SqlDataReader 执行此操作,因为如果您没有当前行,FieldCount 属性将返回 -1。如果您只想处理数据类型,则可以查询INFORMATION_SCHEMA.COLUMNS 表。

标签: c# sql-server types datareader


【解决方案1】:

Akhil 击败了我,但我会将其扩展到

SELECT COLUMN_NAME, DATA_TYPE
FROM information_schema.columns
WHERE table_name = 'tableName' AND column_name = 'columnName'

因为你已经有了列名和表名

【讨论】:

  • 是的,我已经有了表名和列名。我如何在我的构造中使用它?或者更好的说法。连接字符串和其他信息放在哪里?
  • 您将在运行选择查询之前运行此查询。你可以把它放在你的 using 语句中。您必须将结果存储在某个地方,并在时机成熟时参考它们。
  • 没问题。很高兴我能帮上忙。
【解决方案2】:

考虑到你只需要检查列的数据类型,如果你想单独获取SQL数据库中的列数据类型,你可以使用查询

SELECT COLUMN_NAME, DATA_TYPE 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'yourTableName'

希望这会有所帮助。但这不会有助于同时检索数据和列数据类型。

【讨论】:

  • 我必须检查列名是否具有正确的数据类型。
  • 如果您不关心该列中的数据,请使用上述方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-11
  • 1970-01-01
  • 2013-02-13
相关资源
最近更新 更多