datareader 不读取数据
datareader doesn't read data
我有点问题,但我无法弄清楚问题所在。所以我有一个 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()
,根据 MSDN:
Advances the SqlDataReader to the next record.
您在 WeergevenRolPerUser
中执行一次,它将读取您期望被 return 编辑的数据,然后在 lstUsers_SelectedIndexChanged
中再次执行,正如您所发现的,不会阅读任何内容,因为没有要前进的下一条记录。
如果我是你,我会将 WeergevenRolPerUser
更改为 return 一个 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;
}
}
我有点问题,但我无法弄清楚问题所在。所以我有一个 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()
,根据 MSDN:
Advances the SqlDataReader to the next record.
您在 WeergevenRolPerUser
中执行一次,它将读取您期望被 return 编辑的数据,然后在 lstUsers_SelectedIndexChanged
中再次执行,正如您所发现的,不会阅读任何内容,因为没有要前进的下一条记录。
如果我是你,我会将 WeergevenRolPerUser
更改为 return 一个 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;
}
}