public static List<Book> GetAllBook()
{
List<Book> books = new List<Book>();
string sql = "select * from books";
using (SqlDataReader reader = DBHelper.GetDataReader(sql))
{
while (reader.Read())
{
Book book = new Book();
book.Id = Convert.ToInt32(reader["id"]);
book.Title = reader["Title"].ToString();
book.Author = reader["Author"].ToString();
book.PublishDate = reader["PublishDate"].ToString();
book.ISBN = reader["ISBN"].ToString();
book.WordsCount = Convert.ToInt32(reader["WordsCount"]);
book.UnitPrice = Convert.ToDouble(reader["UnitPrice"]);
book.ContentDescription = reader["ContentDescription"].ToString();
book.AurhorDescription = reader["AurhorDescription"].ToString();
book.EditorComment = reader["EditorComment"].ToString();
book.TOC = reader["toc"].ToString();
book.Clicks = Convert.ToInt32(reader["Clicks"]);
book.Publisher = BookPublisherServer.GetPublisherById(Convert.ToInt32(reader["publisherId"]));
int test = Convert.ToInt32(reader["publisherId"]);
Console.WriteLine(test);
book.Category = BookCategoryService.CetCategorById(test);
books.Add(book);
}
reader.Close();
return books;
}
}
GetPublisherById的方法:
public static Publisher GetPublisherById(int publisherId)
{
string sql = "select * from publishers where id = @id";
using (SqlDataReader reader = DBHelper.GetDataReader(sql, new SqlParameter("@id", publisherId)))
{
if (reader.Read())
{
Publisher publisher = new Publisher();
publisher.Id = Convert.ToInt32(reader["id"]);
publisher.Name = reader["name"].ToString();
reader.Close();
return publisher;
}
else
{
reader.Close();
return null;
}
}
}
GetDataReader的方法:
public static SqlDataReader GetDataReader(string sql)
{
SqlCommand cmd = new SqlCommand(sql, Conn);
SqlDataReader dr = cmd.ExecuteReader();
return dr;
} public static SqlDataReader GetDataReader(string sql, params SqlParameter[] pras)
{
SqlCommand cmd = new SqlCommand(sql, Conn);
cmd.Parameters.AddRange(pras);
SqlDataReader dr = cmd.ExecuteReader();
return dr;
}
SqlConnection我封装了的:
static string str = ConfigurationManager.ConnectionStrings["connstr"].ToString();
static SqlConnection conn;
public static SqlConnection Conn
{
get {
if (conn == null)
{
conn= new SqlConnection(str);
conn.Open();
}
else if (conn.State == System.Data.ConnectionState.Broken)
{
conn.Close();
conn.Open();
}
else if (conn.State == System.Data.ConnectionState.Closed)
{
conn.Open();
}
else if (conn.State == System.Data.ConnectionState.Open)
{
conn.Close();
conn.Open();
}
return DBHelper.conn;
}
}代码运行到:GetAllBook里面的 int test = Convert.ToInt32(reader["publisherId"]);这里就抛出异常了!!
请问怎么解!!
{
List<Book> books = new List<Book>();
string sql = "select * from books";
using (SqlDataReader reader = DBHelper.GetDataReader(sql))
{
while (reader.Read())
{
Book book = new Book();
book.Id = Convert.ToInt32(reader["id"]);
book.Title = reader["Title"].ToString();
book.Author = reader["Author"].ToString();
book.PublishDate = reader["PublishDate"].ToString();
book.ISBN = reader["ISBN"].ToString();
book.WordsCount = Convert.ToInt32(reader["WordsCount"]);
book.UnitPrice = Convert.ToDouble(reader["UnitPrice"]);
book.ContentDescription = reader["ContentDescription"].ToString();
book.AurhorDescription = reader["AurhorDescription"].ToString();
book.EditorComment = reader["EditorComment"].ToString();
book.TOC = reader["toc"].ToString();
book.Clicks = Convert.ToInt32(reader["Clicks"]);
book.Publisher = BookPublisherServer.GetPublisherById(Convert.ToInt32(reader["publisherId"]));
int test = Convert.ToInt32(reader["publisherId"]);
Console.WriteLine(test);
book.Category = BookCategoryService.CetCategorById(test);
books.Add(book);
}
reader.Close();
return books;
}
}
GetPublisherById的方法:
public static Publisher GetPublisherById(int publisherId)
{
string sql = "select * from publishers where id = @id";
using (SqlDataReader reader = DBHelper.GetDataReader(sql, new SqlParameter("@id", publisherId)))
{
if (reader.Read())
{
Publisher publisher = new Publisher();
publisher.Id = Convert.ToInt32(reader["id"]);
publisher.Name = reader["name"].ToString();
reader.Close();
return publisher;
}
else
{
reader.Close();
return null;
}
}
}
GetDataReader的方法:
public static SqlDataReader GetDataReader(string sql)
{
SqlCommand cmd = new SqlCommand(sql, Conn);
SqlDataReader dr = cmd.ExecuteReader();
return dr;
} public static SqlDataReader GetDataReader(string sql, params SqlParameter[] pras)
{
SqlCommand cmd = new SqlCommand(sql, Conn);
cmd.Parameters.AddRange(pras);
SqlDataReader dr = cmd.ExecuteReader();
return dr;
}
SqlConnection我封装了的:
static string str = ConfigurationManager.ConnectionStrings["connstr"].ToString();
static SqlConnection conn;
public static SqlConnection Conn
{
get {
if (conn == null)
{
conn= new SqlConnection(str);
conn.Open();
}
else if (conn.State == System.Data.ConnectionState.Broken)
{
conn.Close();
conn.Open();
}
else if (conn.State == System.Data.ConnectionState.Closed)
{
conn.Open();
}
else if (conn.State == System.Data.ConnectionState.Open)
{
conn.Close();
conn.Open();
}
return DBHelper.conn;
}
}代码运行到:GetAllBook里面的 int test = Convert.ToInt32(reader["publisherId"]);这里就抛出异常了!!
请问怎么解!!
int test = Convert.ToInt32(reader["publisherId"]);
移动到
book.Publisher = BookPublisherServer.GetPublisherById(Convert.ToInt32(reader["publisherId"]));
的上面;
GetPublisherById里面已经关闭了reader
是dbhelper没写好!造成了他们共用一个datareader!!