【问题标题】:SqlDataReader InvalidOperationExceptionSqlDataReader InvalidOperationException
【发布时间】:2014-04-20 20:07:18
【问题描述】:

我有一个具有以下功能的 SqlDB.dll:

         public SqlDataReader getEnumValues(int enumId)
    {
        SqlDataReader reader = null;
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();
            SqlCommand command =
                new SqlCommand(
                    "SELECT * FROM [EnumValue] WHERE enumId LIKE '" + enumId + "';",
                    connection);
            reader = command.ExecuteReader();
            //if(reader.Read())
            //    Debug.WriteLine("Inside sqlDb->getEnumValues command = " + command.CommandText + " reader[name] = " + reader["name"].ToString() + " reader[value] = " + reader["value"].ToString() + " reader[description] = " + reader["description"].ToString());
        }
        //reader.Close();
        return reader;
    }

如您所见,我尝试在返回之前关闭阅读器,并且我读取了里面的数据,没关系。 我正在使用这样的功能:

 using (SqlDataReader getEnumValuesReader = (SqlDataReader)getEnumValues.Invoke(sqlDB, getEnumValuesForEnumParam))
                    {
                        Debug.WriteLine("Success getEnumValues -- ");

                        if (getEnumValuesReader.HasRows)
                        {
                            while (getEnumValuesReader.Read())        //Loop throw all enumValues and add them to current enum
                            {
                                try
                                {
                                    values.Add(new Model.EnumValue(getEnumValuesReader["name"].ToString(), getEnumValuesReader["value"].ToString(), getEnumValuesReader["description"].ToString()));
                                    Debug.WriteLine("Value[0].name = " + values[0].Name);
                                }
                                catch (Exception ex)
                                {
                                    Debug.WriteLine("Error in building new EnumValue: " + ex.Message);
                                }
                            }
                        }

                    }

我遇到了“System.InvalidOperationException”类型的异常

我猜这与正在传递的 Sqldatareader 有关。

【问题讨论】:

  • SQL Injection alert - 您应该将您的 SQL 语句连接在一起 - 使用 参数化查询 来避免 SQL 注入
  • 我完全没有安全问题,它没有任何用户\其他开发者\未来的计划但谢谢你的回答
  • 如果此代码用于网站 - 这些网站中的 任何 都极有可能被 SQL 注入利用。让我知道这些是哪些网站,这样我就可以确保永远不会访问它们中的任何一个......
  • 不,它不适用于 Web,它是我正在构建的 VSPackage 程序。我对 SQL 注入问题很熟悉,但在这种情况下我并不担心。
  • 无论最终产品是什么 - 它只是被接受的最佳实践以避免将您的 SQL 连接在一起。你真的应该使用参数化查询 - 总是,没有例外

标签: c# sql-server exception sqldatareader


【解决方案1】:

SQL 阅读器不能存在于 SQL 连接的上下文之外。您的连接正在您的方法中处理,因此您返回的阅读器无法在调用方法中获取任何数据。

最好的选择是从阅读器而不是阅读器返回值。传递读者不是一个好习惯,这意味着底层连接等是开放的和未部署的。

【讨论】:

  • 谢谢你的回答,我的问题是如何返回所有的值?因为并非所有值都来自同一类型,有些是字符串,有些是 int
  • 您只需要声明一个包含所有类型(字符串、int 等)的类,并从该方法返回一个 List .. 也称为 DTO。数据传输对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多