无法将 DataGridView 与 DataTable/DataReader 绑定
Unable to bind DataGridView with DataTable/DataReader
我无法将 DataGridView
与 ado.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];
}
您的问题是连接类型和命令类型。
我简单写到这里!
我无法将 DataGridView
与 ado.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];
}
您的问题是连接类型和命令类型。 我简单写到这里!