我想用SQL中的表数据填充gridview。我尝试返回我的SqlDataReader对象并将其用作我的数据源,但是我收到的错误是读者已关闭。我想将其转换为DataSet并返回一个数据集,但我找不到将行数据转换为数据集的简单方法。我还读过DataSets在.NET 3.5 / 4.0中死了,这是真的吗?
这是我的数据层方法。如果我可以返回可用作数据源的东西,那将是非常棒的:
public SqlDataReader GetSites()
{
SqlConnection sqlCon = null;
SqlDataReader rdr = null;
try
{
sqlCon = new SqlConnection(StoredProcedures.conString);
sqlCon.Open();
SqlCommand cmd = new SqlCommand("GetSites", sqlCon);
cmd.CommandType = CommandType.StoredProcedure;
rdr = cmd.ExecuteReader();
return rdr;
}
finally
{
if (sqlCon != null)
{
sqlCon.Close();
}
//if (rdr != null)
//{
// rdr.Close();
//}
}
}
答案 0 :(得分:4)
正如Carlos Munoz所说,你关闭了你的sql连接。您需要打开SQL连接才能让读者阅读。只需注释掉
if (sqlCon != null)
{
sqlCon.Close();
}
你应该没事。
另一种选择是使用我喜欢的SqlDataAdapter。
这是一个例子......
public static DataSet GetDataSet(string sql, DatabaseType database)
{
using ( var connection = new SqlConnection( GetConnectionString(database) ) )
{
using (var adapter = new SqlDataAdapter(sql, connection))
{
var temp = new DataSet();
adapter.Fill(temp);
return temp;
}
}
}
只需将数据网格的数据源设置为返回的数据集表。
DGV.DataSource = DatabaseFunction.GetDataSet(sql, DatabaseType.Outage).Tables[0].DefaultView;
答案 1 :(得分:1)
我建议使用带有类型表适配器的Typed-Dataset。将新的Typed-DataSet添加到项目中,并将表格从visual studio中的服务器资源管理器直接拖放到您的类型化数据集中并进行配置。然后,您可以使用该类型数据集作为datagrid的数据源
答案 2 :(得分:1)
dataAdapter = new SqlDataAdapter(sqlQuery, DatabaseConnectionString);
SqlCommandBuilder builder = new SqlCommandBuilder(dataAdapter);
builder.GetUpdateCommand();
dataSet = new DataSet();
DataAdapter.Fill(dataSet);
dataGridView.DataSource = dataSet.Tables[0];
如果要将dataGridView中所做的更改更新回SqlDatabase,则应使用SqlCommandBuilder!你可以写下:
dataAdapter.Update(dataSet);
如果要使用新东西,可以使用SqlMetal工具生成与您的SqlDatabase对应的对象模型。这将生成具有成员作为表的数据类的类。之后,您使用LINQ查询,该查询用作dataGeidView的数据源。