我无法将DataGridView
与DataTable
/ 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/
答案 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;命令类型。 我在这里简单写了!