无法将 DataGridView 与 DataTable/DataReader 绑定

Unable to bind DataGridView with DataTable/DataReader

我无法将 DataGridViewado.net 中的 DataTable/DataReader 绑定。另外,我无法在 DataGridView 中显示数据 DataReader 数据。

DataGridView 没有显示任何记录。

如何从业务层DataTable到UI层?

我的代码:

private void GetSMSSender() {
    try
    {
        string sqlcmd = "sp_getSmsSenders";
        SqlHelper sqlEvents = new SqlHelper();
        GridView1.DataSource = sqlEvents.ExecuteReader(sqlcmd);
        GridView1.DataBind();
     }
}

public DataTable ExecuteReader(string sqlcmd) {
    DataTable table;
    try
    {
        con = new SqlConnection(objCon.getConnectionString());
        cmd = new SqlCommand(sqlcmd);
        cmd.CommandType = CommandType.Text;
        cmd.Connection = con;
        con.Open();
        dr = cmd.ExecuteReader();
        con.Close();
        table = new DataTable();
        table.Load(dr);
        return table;
     }
}

调试 code.my dr 结果如下。请看 http://postimg.org/image/6p2wh185f/

仔细查看后,您的代码中存在两个问题:

第一个问题:

看起来你想调用一个存储过程。但是,您已将 CommandType 设置为文本。意思是 ADO.NET 期望执行普通查询而不是执行存储过程。有两种方法可以解决这个问题。

第一种(也是首选方法)是将 CommandType 设置为 CommandType.StoredProcedure,如下面的代码所示:

con = new SqlConnection(objCon.getConnectionString());
cmd = new SqlCommand(sqlcmd);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = con;
con.Open();
dr = cmd.ExecuteReader();
table = new DataTable();
table.Load(dr);
con.Close();
return table;   

另一种方法是向 SQL 服务器发送文本查询,告诉它执行存储过程(在这种情况下,您将 CommandType 设置为 CommandType.Text):

string sqlcmd = "EXEC sp_GetSmsSenders";

第二题:

您提前关闭了连接。 SqlDataReader 需要打开连接,而它确实很神奇。要解决这个问题,只需将 con.Close() 行向下移动两行,就在 table.Load(dr) 行下方,如下所示:

con.Open();
dr = cmd.ExecuteReader();
table = new DataTable();
table.Load(dr);
con.Close();

我已经重现了您面临的问题并修改了代码以使用 SqlDataAdapter 而不是 SqlDataReader。这解决了问题:

private DataTable ExecuteReader(string sqlcmd)
{
    DataTable table = new DataTable();
    using (SqlConnection con = new SqlConnection(objCon.getConnectionString()))
    {
        using (SqlDataAdapter da = new SqlDataAdapter(sqlcmd, con))
        {
            con.Open();
            da.Fill(table);
        }
    }
    return table;

}

试试这个方法:

      public static DataSet ToDateSet(IDataReader reader)
        {
            var ds = new DataSet();

            do
            {

                var schema = reader.GetSchemaTable();
                var dt = new DataTable(schema.TableName);

                for (var columnIndex = 0; columnIndex < reader.FieldCount; columnIndex++)
                {
                    dt.Columns.Add(new DataColumn(schema.Rows[columnIndex][0].ToString(), (Type)schema.Rows[columnIndex][2]));
                }

                while (reader.Read())
                {
                    var values = new object[reader.FieldCount];

                    reader.GetValues(values);

                    dt.Rows.Add(values);
                }

                ds.Tables.Add(dt);

            } while (reader.NextResult());

            return ds;
        }

public IDataReader ExecuteReader(string connectionString,string cmdText,CommandType cmdType) { 

      var  con = new SqlConnection(connectionString);
      var  cmd = new SqlCommand(conn,sqlcmd);

        cmd.CommandType = cmdType; 
        con.Open();

     return cmd.ExecuteReader();    
}

private void DoSMSSender() { 
var reader=ExecuteReader(objCon.getConnectionString(),"EXEC sp_GetSmsSenders",CommandType.StoredProcedure);
var ds=ToDateSet(reader);

        GridView1.DataSource = ds.Tables[0];

}

您的问题是连接类型和命令类型。 我简单写到这里!