无法将 System.Data.SqlClient.SqlDatReader 隐式转换为 AdoControls.SqlDataReader
Cannot implicitly convert System.Data.SqlClient.SqlDatReader to AdoControls.SqlDataReader
我正在学习 ADO.Net 并且一直在 GridView 上执行 SQL 命令。今天我开始学习 ADO.Net 中的 SqlDataReader,当我尝试执行我的命令并将其传递给 SqlDataReader 对象时,它显示错误
> CS0029:无法将 'System.Data.SqlClient.SqlDataReader' 隐式转换为 'AdoControls.SqlDataReader'
这是我的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Configuration;
using System.Data;
namespace AdoControls
{
public partial class SqlDataReader : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string cs = ConfigurationManager.ConnectionStrings["sample"].ConnectionString;
using(SqlConnection con = new SqlConnection(cs))
{
SqlCommand cmd = new SqlCommand("SELECT * FROM employee", con);
con.Open();
SqlDataReader reader = cmd.ExecuteReader(); //This shows Error
GridView1.DataSource = cmd.ExecuteReader(); //This works Fine!!
}
}
}
}
请指导我,我做错了什么。
谢谢!
问题似乎是您的网页与 SqlDataReader 的名称完全相同。
所以,你必须消除歧义。
像这样说:
void LoadGrid()
{
using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.TEST4))
{
string strSQL = "SELECT * FROM Vhotels ORDER BY HotelName";
using (SqlCommand cmdSQL = new SqlCommand(strSQL, conn))
{
conn.Open();
System.Data.SqlClient.SqlDataReader reader = cmdSQL.ExecuteReader();
GridView1.DataSource = reader;
GridView1.DataBind();
}
}
}
那么,您的网页(class 也具有相同的名称 SqlDataReader - 那么您要访问哪种 class?
假设我的页面被称为 TestPage.aspx
您实际上是在这样做:
public partial class TestWebPage : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
SqlCommand cmd = new SqlCommand();
TestWebPage MyRead = cmd.ExecuteReader();
因此,要么尝试创建一个新网页 - 给它一个与 SqlDataReader 不同的名称,或者如上所述 - 消除你想要的 SqlDataReader 类型与哦恰好有网页的歧义(和 class) 同名.
更多信息供参考:
网格视图(和大多数数据控件)可以接受“reader”。但是,在直接分配 GV 时有两个重要细节需要注意 reader.
首先,如果您打开数据分页。那就是允许网格视图的分页,这样说:
因此,如果 GV 要求(或您想要)对网格使用“数据分页”,则不能使用 reader.
分配网格
因此,您需要为网格分配一个支持“枚举”的对象,然后再分配一个 reader。
因此,您可以说使用此代码:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
LoadData();
}
}
void LoadData()
{
using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.TEST4))
{
string strSQL = "SELECT * FROM tblHotels ORDER BY HotelName";
using (SqlCommand cmdSQL = new SqlCommand(strSQL, conn))
{
conn.Open();
DataTable rstData = new DataTable();
rstData.Load(cmdSQL.ExecuteReader());
GHotels.DataSource = rstData;
}
}
}
下一期:通常在填充网格视图时,我们可能想要进行计算,或者说甚至用颜色格式化列,或者谁知道是什么 - 但通常我们需要某种“标准”或更改事物。所以,对于活跃的酒店,我希望它们是蓝色的,但我不想显示,也不想在网格视图中显示数据库中的活跃列。
好吧,如果您使用“reader”填充网格,那么在行数据绑定过程中,您不能使用也不能使用绑定期间使用的完整数据行。同样,大多数时候 - 不是问题。然而,这非常好,而且经常需要您使用所有数据行来进行税收计算,甚至只是简单的格式化。
但是这些行不在网格视图中。
因此,在行数据绑定事件中,我 100% 完全使用了用于该绑定的整个数据行。但只有当我使用数据 table 或其他支持此功能的对象时(而 reader 不支持)。
请记住,GV 的数据源仅在此绑定过程中持续存在。您不能稍后在代码中使用它来单击按钮 - 您会发现 GV 数据源现在无效 - 它仅在绑定过程中持续存在。
所以,假设我有这个简单的网格:
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="dFalse" DataKeyNames="ID"
CssClass="table" OnRowDataBound="GridView1_RowDataBound">
<Columns>
<asp:BoundField DataField="FirstName" HeaderText="FirstName" />
<asp:BoundField DataField="LastName" HeaderText="LastName" />
<asp:BoundField DataField="HotelName" HeaderText="HotelName" />
<asp:BoundField DataField="City" HeaderText="City" />
<asp:BoundField DataField="Description" HeaderText="Description" />
</Columns>
</asp:GridView>
填充此网格的代码:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
LoadGrid();
}
void LoadGrid()
{
using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.TEST4))
{
string strSQL = "SELECT * FROM VHotels ORDER BY HotelName";
using (SqlCommand cmdSQL = new SqlCommand(strSQL, conn))
{
conn.Open();
DataTable rstData = new DataTable();
rstData.Load(cmdSQL.ExecuteReader());
GridView1.DataSource = rstData;
GridView1.DataBind();
}
}
}
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
// get the data bind row
DataRowView gData = e.Row.DataItem as DataRowView;
if ((bool)gData["Active"])
{
// is active - highlight the hotel color
e.Row.Cells[2].BackColor = System.Drawing.Color.FromName("skyblue");
}
}
}
注意在行数据绑定中关闭 - 我能够使用数据行视图。如果您使用 reader.
,则不能使用它
在上面的示例中,请注意我是如何能够“自由地”使用整个数据行的,尽管 GV 在标记中没有“活动”列。
上面的结果是这样的:
再一次,使用 reader 将不适用于上述情况。
因此,如果您使用并分配 GV a reader。
,则数据分页或在绑定期间使用“数据行”将不可用
但是,对于很多 GV???当然,您可以直接将 reader.
填充到 GV 中
所以,我会更改您的网页的名称 - 创建一个新的测试网页。
或者如上所述,由于您的页面 class 和 SqldataReader 都具有相同的名称,因此请按照上面的第一个代码片段消除歧义。
我正在学习 ADO.Net 并且一直在 GridView 上执行 SQL 命令。今天我开始学习 ADO.Net 中的 SqlDataReader,当我尝试执行我的命令并将其传递给 SqlDataReader 对象时,它显示错误
> CS0029:无法将 'System.Data.SqlClient.SqlDataReader' 隐式转换为 'AdoControls.SqlDataReader'
这是我的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Configuration;
using System.Data;
namespace AdoControls
{
public partial class SqlDataReader : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string cs = ConfigurationManager.ConnectionStrings["sample"].ConnectionString;
using(SqlConnection con = new SqlConnection(cs))
{
SqlCommand cmd = new SqlCommand("SELECT * FROM employee", con);
con.Open();
SqlDataReader reader = cmd.ExecuteReader(); //This shows Error
GridView1.DataSource = cmd.ExecuteReader(); //This works Fine!!
}
}
}
}
请指导我,我做错了什么。
谢谢!
问题似乎是您的网页与 SqlDataReader 的名称完全相同。
所以,你必须消除歧义。
像这样说:
void LoadGrid()
{
using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.TEST4))
{
string strSQL = "SELECT * FROM Vhotels ORDER BY HotelName";
using (SqlCommand cmdSQL = new SqlCommand(strSQL, conn))
{
conn.Open();
System.Data.SqlClient.SqlDataReader reader = cmdSQL.ExecuteReader();
GridView1.DataSource = reader;
GridView1.DataBind();
}
}
}
那么,您的网页(class 也具有相同的名称 SqlDataReader - 那么您要访问哪种 class?
假设我的页面被称为 TestPage.aspx
您实际上是在这样做:
public partial class TestWebPage : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
SqlCommand cmd = new SqlCommand();
TestWebPage MyRead = cmd.ExecuteReader();
因此,要么尝试创建一个新网页 - 给它一个与 SqlDataReader 不同的名称,或者如上所述 - 消除你想要的 SqlDataReader 类型与哦恰好有网页的歧义(和 class) 同名.
更多信息供参考:
网格视图(和大多数数据控件)可以接受“reader”。但是,在直接分配 GV 时有两个重要细节需要注意 reader.
首先,如果您打开数据分页。那就是允许网格视图的分页,这样说:
因此,如果 GV 要求(或您想要)对网格使用“数据分页”,则不能使用 reader.
分配网格因此,您需要为网格分配一个支持“枚举”的对象,然后再分配一个 reader。
因此,您可以说使用此代码:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
LoadData();
}
}
void LoadData()
{
using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.TEST4))
{
string strSQL = "SELECT * FROM tblHotels ORDER BY HotelName";
using (SqlCommand cmdSQL = new SqlCommand(strSQL, conn))
{
conn.Open();
DataTable rstData = new DataTable();
rstData.Load(cmdSQL.ExecuteReader());
GHotels.DataSource = rstData;
}
}
}
下一期:通常在填充网格视图时,我们可能想要进行计算,或者说甚至用颜色格式化列,或者谁知道是什么 - 但通常我们需要某种“标准”或更改事物。所以,对于活跃的酒店,我希望它们是蓝色的,但我不想显示,也不想在网格视图中显示数据库中的活跃列。
好吧,如果您使用“reader”填充网格,那么在行数据绑定过程中,您不能使用也不能使用绑定期间使用的完整数据行。同样,大多数时候 - 不是问题。然而,这非常好,而且经常需要您使用所有数据行来进行税收计算,甚至只是简单的格式化。
但是这些行不在网格视图中。
因此,在行数据绑定事件中,我 100% 完全使用了用于该绑定的整个数据行。但只有当我使用数据 table 或其他支持此功能的对象时(而 reader 不支持)。
请记住,GV 的数据源仅在此绑定过程中持续存在。您不能稍后在代码中使用它来单击按钮 - 您会发现 GV 数据源现在无效 - 它仅在绑定过程中持续存在。
所以,假设我有这个简单的网格:
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="dFalse" DataKeyNames="ID"
CssClass="table" OnRowDataBound="GridView1_RowDataBound">
<Columns>
<asp:BoundField DataField="FirstName" HeaderText="FirstName" />
<asp:BoundField DataField="LastName" HeaderText="LastName" />
<asp:BoundField DataField="HotelName" HeaderText="HotelName" />
<asp:BoundField DataField="City" HeaderText="City" />
<asp:BoundField DataField="Description" HeaderText="Description" />
</Columns>
</asp:GridView>
填充此网格的代码:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
LoadGrid();
}
void LoadGrid()
{
using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.TEST4))
{
string strSQL = "SELECT * FROM VHotels ORDER BY HotelName";
using (SqlCommand cmdSQL = new SqlCommand(strSQL, conn))
{
conn.Open();
DataTable rstData = new DataTable();
rstData.Load(cmdSQL.ExecuteReader());
GridView1.DataSource = rstData;
GridView1.DataBind();
}
}
}
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
// get the data bind row
DataRowView gData = e.Row.DataItem as DataRowView;
if ((bool)gData["Active"])
{
// is active - highlight the hotel color
e.Row.Cells[2].BackColor = System.Drawing.Color.FromName("skyblue");
}
}
}
注意在行数据绑定中关闭 - 我能够使用数据行视图。如果您使用 reader.
,则不能使用它在上面的示例中,请注意我是如何能够“自由地”使用整个数据行的,尽管 GV 在标记中没有“活动”列。
上面的结果是这样的:
再一次,使用 reader 将不适用于上述情况。
因此,如果您使用并分配 GV a reader。
,则数据分页或在绑定期间使用“数据行”将不可用但是,对于很多 GV???当然,您可以直接将 reader.
填充到 GV 中所以,我会更改您的网页的名称 - 创建一个新的测试网页。
或者如上所述,由于您的页面 class 和 SqldataReader 都具有相同的名称,因此请按照上面的第一个代码片段消除歧义。