在 windows 表单应用程序的 WCF 服务上关闭 reader 时调用 Read 的尝试无效
Invalid attempt to call Read when reader is closed on WCF service with windows froms application
我有这样的代码:
public DataTable GetScriptDetails()
{
DataTable dtScriptDetails = new DataTable();
SqlConnection con = new SqlConnection("Data Source=sample;Initial Catalog=ScriptManagement;User ID=sa;Password=abcde");
con.Open();
SqlCommand cmd = new SqlCommand("select ScriptName,UploadDate from ScriptDetails", con);
using (SqlDataReader dataReader = cmd.ExecuteReader())
{
while (dataReader.Read())
{
dtScriptDetails.Load(dataReader);
}
dataReader.Close();
}
con.Close();
return dtScriptDetails;
}
但是我得到了这个错误:
关闭 reader 时尝试调用 Read 无效。
我找了很多都无法解决这个问题。
任何帮助将不胜感激。
我不确定这是否解决了问题,但使用 if+HasRows
而不是循环 + Read
:
using (SqlDataReader dataReader = cmd.ExecuteReader())
{
if (dataReader.HasRows)
{
dtScriptDetails.Load(dataReader);
} // no need to close it if you use using
}
不过,我会用SqlDataAdapter
来填充table:
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(dtScriptDetails);
DataTable.Load 方法从 reader 加载所有数据。您不需要遍历 reader 中的任何行。所以,在你的代码中,你可以删除循环并有这样的东西:
using (SqlDataReader dataReader = cmd.ExecuteReader())
{
dtScriptDetails.Load(dataReader);
}
我有这样的代码:
public DataTable GetScriptDetails()
{
DataTable dtScriptDetails = new DataTable();
SqlConnection con = new SqlConnection("Data Source=sample;Initial Catalog=ScriptManagement;User ID=sa;Password=abcde");
con.Open();
SqlCommand cmd = new SqlCommand("select ScriptName,UploadDate from ScriptDetails", con);
using (SqlDataReader dataReader = cmd.ExecuteReader())
{
while (dataReader.Read())
{
dtScriptDetails.Load(dataReader);
}
dataReader.Close();
}
con.Close();
return dtScriptDetails;
}
但是我得到了这个错误:
关闭 reader 时尝试调用 Read 无效。
我找了很多都无法解决这个问题。 任何帮助将不胜感激。
我不确定这是否解决了问题,但使用 if+HasRows
而不是循环 + Read
:
using (SqlDataReader dataReader = cmd.ExecuteReader())
{
if (dataReader.HasRows)
{
dtScriptDetails.Load(dataReader);
} // no need to close it if you use using
}
不过,我会用SqlDataAdapter
来填充table:
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(dtScriptDetails);
DataTable.Load 方法从 reader 加载所有数据。您不需要遍历 reader 中的任何行。所以,在你的代码中,你可以删除循环并有这样的东西:
using (SqlDataReader dataReader = cmd.ExecuteReader())
{
dtScriptDetails.Load(dataReader);
}