C# SqlCommand asp.net C
我请你帮我解决我的问题我正在尝试创建一个函数,在下拉列表上输出数据设置我的参数我的代码如下:C# SqlCommand asp.net C,c#,asp.net,sql,C#,Asp.net,Sql,我请你帮我解决我的问题我正在尝试创建一个函数,在下拉列表上输出数据设置我的参数我的代码如下: public static List<string> GetTracks(out List<string> trackIds, string conferenceId) { var res = new List<string>(); trackIds = new List<string>();
public static List<string> GetTracks(out List<string> trackIds, string conferenceId)
{
var res = new List<string>();
trackIds = new List<string>();
var sqlCon = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
SqlCommand cmd = new SqlCommand("select Track_name,Track_ID from TrackCommittee where Conference_id= @conferenceId", sqlCon);
DataSet ds = new DataSet();
cmd.Connection.Open();
cmd.Parameters.Add(new SqlParameter("@conferenceId", conferenceId));
using (SqlDataReader sdr = cmd.ExecuteReader())
{
while (sdr.Read())
{
res.Add(sdr.GetString(sdr.GetOrdinal("Track_name")));
trackIds.Add(sdr.GetInt32(sdr.GetOrdinal("Track_ID")).ToString());
}
}
cmd.Connection.Close();
cmd.Dispose();
return res;
}
提前感谢您我不确定您的数据集的用途。这是我过去使用过的语法。我认为语法是正确的-我这里没有我的代码
using (SqlDataReader sdr = cmd.ExecuteReader())
{
while (sdr.Read())
{
res.Add(sdr.GetString(sdr.GetOrdinal("Track_name")));
trackIds.Add(sdr.GetInt32(sdr.GetOrdinal("Track_ID")).ToString())
}
}
编辑:如注释中所述,在SqlConnection周围放置一个using,以保存您自己关闭/处理它。您从未实际接触过结果集sdr:
重新编写整个函数,如下所示:
public static IEnumerable<ListItem> GetTracks(string conferenceId)
{
using (var sqlCon = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
using (var cmd = new SqlCommand("select Track_name,Track_ID from TrackCommittee where Conference_id= @conferenceId", sqlCon))
{
cmd.Parameters.Add("@conferenceId", SqlDbType.Int).Value = conferenceId;
sqlCon.Open();
using (SqlDataReader sdr = cmd.ExecuteReader())
{
while (sdr.Read())
{
yield return new ListItem(sdr[0].ToString(), sdr[1].ToString());
}
}
}
}
if (string.IsNullOrEmpty(os.SelectedValue))
{
os.Items.AddRange(GetTracks("all").ToArray());
}
using (SqlDataReader sdr = cmd.ExecuteReader())
{
while(sdr.Read())
{
//whatever
}
...
为了更好地分离呈现层和数据层,我将修改getTrack以返回KeyValuePairs,并调用从KeyValuePairs向ListItem添加选择投影。您似乎没有对SqlDataReader做任何事情。通常情况下,您会遇到如下情况:
public static IEnumerable<ListItem> GetTracks(string conferenceId)
{
using (var sqlCon = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
using (var cmd = new SqlCommand("select Track_name,Track_ID from TrackCommittee where Conference_id= @conferenceId", sqlCon))
{
cmd.Parameters.Add("@conferenceId", SqlDbType.Int).Value = conferenceId;
sqlCon.Open();
using (SqlDataReader sdr = cmd.ExecuteReader())
{
while (sdr.Read())
{
yield return new ListItem(sdr[0].ToString(), sdr[1].ToString());
}
}
}
}
if (string.IsNullOrEmpty(os.SelectedValue))
{
os.Items.AddRange(GetTracks("all").ToArray());
}
using (SqlDataReader sdr = cmd.ExecuteReader())
{
while(sdr.Read())
{
//whatever
}
...
现在看起来您正在执行该命令,然后对结果不做任何处理。我也不确定DataTable是如何发挥作用的。与SqlDataReader相比,SqlConnection周围有一个using块更重要,而您的问题到底是什么?我猜问题是数据集中没有任何内容。。。有吗?我已将代码更改为这样,但仍有一个错误System.Data.SqlClient.SqlException:将nvarchar值“all”转换为数据类型int时,转换失败。是的,当您为int typeTrack_ID传入all时,SQL将显示一个异常。将函数更改为接受conferenceId的int,而不是字符串。然后修复代码以单独处理'all'cae,尝试使用不同的查询。使用该代码,我无法从加载页调用它。如果string.IsNullOrEmptyos.SelectedValue{List IDs;var names=GetTracksout IDs,all;for int i=0;i