无法将 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 都具有相同的名称,因此请按照上面的第一个代码片段消除歧义。