C# datareader不';不读取数据

C# datareader不';不读取数据,c#,sqldatareader,C#,Sqldatareader,我有点问题,但我想不出问题所在。因此,我有一个DataReader,从数据库中读取数据。但是问题是,尽管我的数据库中有一个匹配的行,DataReader仍然没有行返回 我的数据库连接: static private String _connectionString = @"Data Source=(localdb)\v11.0;Initial Catalog=dboVids;User id=g;password=g;Connect Timeout=15;Encrypt=False";

我有点问题,但我想不出问题所在。因此,我有一个
DataReader
,从数据库中读取数据。但是问题是,尽管我的数据库中有一个匹配的行,
DataReader
仍然没有行返回

我的数据库连接:

static private String _connectionString = @"Data Source=(localdb)\v11.0;Initial Catalog=dboVids;User id=g;password=g;Connect Timeout=15;Encrypt=False";  
        static private SqlConnection _connection;

        static Connection()
        {
            try
            {
                _connection = new SqlConnection(_connectionString);
                Open();
            }
            catch (Exception ex)
            {
                switch (ex.HResult)
                {
                    default:
                        throw;
                }
            }
        }
我的方法:

static public SqlDataReader WeergevenRolPerUser(string userName)
            {
                try
                {
                    Open();
                    SqlCommand command = new SqlCommand("select * from [dbo].[fnShowDatabaseRole]('@UserName')", _connection);
                    command.Parameters.AddWithValue("@UserName", userName);
                    SqlDataReader myReader = command.ExecuteReader();
                    myReader.Read();
                    return myReader;
                }
                catch (Exception ex)
                {
                    switch (ex.HResult)
                    {
                        default:
                            throw;
                    }
                }
            }
Open()
方法:

private static void Open()
        {
            try
            {
                if (_connection.State != ConnectionState.Open)
                    _connection.Open();
            }
            catch (Exception ex)
            {
                switch (ex.HResult)
                {
                    default:
                        throw;
                }
            }
        }
这里是我调用
DataReader
的地方:

 private void lstUsers_SelectedIndexChanged(object sender, EventArgs e)
        {
            SqlDataReader reader = null;
            try
            {
                if (_username != "" && lstUsers.SelectedValue != null)
                {
                    string user = lstUsers.SelectedValue.ToString();
                    reader = Database.Users.WeergevenRolPerUser(user);

                    if (reader.Read())
                    {
                        MessageBox.Show("unreachable");
                        var rol = reader.GetString(0);
                        if (rol == "gebruiker")
                        {
                            rdbUser.Checked = true;

                        }
                    }
                }
            }
            catch (Exception ex)
            {
                switch (ex.HResult)
                {
                    default:
                        throw;
                }
            }
            finally
            {
                if (reader != null) reader.Close();
            }


        }

我猜您对reader对象调用了两次
.Read()
,如下所示:

将SqlDataReader前进到下一条记录

WeergevenRolPerUser
中执行此操作一次,它将读取您希望返回的数据,而在
lstUsers\u SelectedIndexChanged
中执行此操作一次,您发现它不会读取任何内容,因为没有下一条记录要前进

如果我是你,我会更改
WeergevenRolPerUser
以返回
User
对象

static public User WeergevenRolPerUser(string userName)
{
    try
    {
        using(var connection = new SqlConnection(/* connection string */))
        {
            connection.Open();

            using(var command = new SqlCommand("select * from [dbo].[fnShowDatabaseRole]('@UserName')", connection))
            {
                 command.Parameters.AddWithValue("@UserName", userName);

                 using(var myReader = command.ExecuteReader())
                 {
                     while(myReader.Read())
                     {
                         return new User
                                {
                                     Username = myReader.GetString(/* column index */),
                                     Role = myReader.GetString(/* column index */)
                                }
                     }
                 }

                 myReader.Close();
             }
         }
    catch (SqlException ex)
    {
        throw;
    }
}

没有足够的信息。通常,您会使用探查器观察sql命令命中数据库,这样您就可以确切地知道实际查询是什么(而不是您假设的),然后在数据库上执行它,以查看实际返回的内容。这通常足以告诉您90%的时间发生了什么,当您在数据库中执行查询时,查询是否返回结果?您可以在不引发任何异常的情况下调试应用程序吗?您还应该使用using块。当前您没有关闭连接。使用共享的
连接
对象通常不是一个好主意-共享连接字符串,但为每个需要的
命令
创建新的
连接
对象(并确保在使用后使用
处置
将它们包装在
中),避免共享连接,即使是读者。不要让您的数据层代码与UI代码混合,这是非常糟糕的做法。使您的代码难以阅读和理解。更不用说让连接打开的时间超过需要、同步事件和管理状态的复杂性了。无数的事情会出错!我真的不明白你们分享关系是什么意思。那你建议我做什么呢。我完全是编程新手。你能给我举个例子说明正确的方法应该是什么吗?似乎完全有道理。我还想指出,OP将列表视图事件与数据库代码混合在一起,并使数据库连接的打开时间超过需要的时间,这是非常糟糕的做法什么异常?请记住,您将创建一个名为
User
的新类,该类具有所需的属性,并且您需要为列提供正确的索引和所需的数据。“executereader需要一个打开且可用的连接。连接的当前状态为closed“啊,我的糟糕,我缺少
connection.open()
在将其传递给
SqlCommand
之前。愚蠢的问题是,我需要将connection.Open()放在哪里?如果我把它放在应用程序中,它会给我带来很多错误