无法将DataGridView与DataTable / DataReader绑定

时间:2015-08-29 08:29:39

标签: c# asp.net gridview ado.net

我无法将DataGridViewDataTable / DataReader绑定在ado.net。此外,我无法在DataReader中显示数据DataGridView数据。

DataGridView未显示任何记录。

如何从业务层到UI层获取DataTable

我的代码:

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/

3 个答案:

答案 0 :(得分:2)

仔细观察后,代码中存在两个问题:

第一个问题:

看起来您想要调用存储过程。但是,您已将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();

答案 1 :(得分:0)

我已经复制了您遇到的问题,并修改了代码以使用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;

}

答案 2 :(得分:0)

尝试这种方法:

      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];

}

你的问题是连接问题&amp;命令类型。 我在这里简单写了!