我有2张桌子: artikulli
tema varchar(250)
abstrakti text
data_publikimit date
path varchar(350)
keywords varchar(350)
kategoria_id int
kategoria
id int
emertimi varchar(350)
我有一个dropdownList,它显示所有" emertimi"当用户选择一个时,它会将该emertimi的id保存在表格中#art; artikulli"在列" kategoria_id"。 我的问题是更新。当我执行更新下拉列表时,不显示预先选择的数据库中存在的值,而是列表中的第一个值。
DropDownList drpdKategoria = e.Item.FindControl("drpdKategoria") as DropDownList;
SqlConnection con = new SqlConnection(connection);
string Qry = "select * from kategoria";
string id = Request.QueryString["id"];
SqlDataAdapter da = new SqlDataAdapter(Qry, con);
SqlDataAdapter did = new SqlDataAdapter(id, con);
DataSet ds = new DataSet();
con.Open();
da.Fill(ds);
did.Fill(ds);
string kategoria_id = "select kategoria_id from artikulli where id='" + id + "'";
SqlDataAdapter dk = new SqlDataAdapter(kategoria_id, con);
dk.Fill(ds);
string emertimi = "select emertimi from kategoria where id='" + kategoria_id + "'";
SqlDataAdapter de = new SqlDataAdapter(emertimi, con);
de.Fill(ds);
drpdKategoria.DataSource = ds;
drpdKategoria.DataValueField = "id";
drpdKategoria.DataTextField = "emertimi";
drpdKategoria.DataBind();
var defaultValue = drpdKategoria.Items.FindByText(emertimi);
if (defaultValue != null)
drpdKategoria.SelectedValue = defaultValue.Value;
con.Close();
con.Dispose();
ds.Dispose();
da.Dispose();
did.Dispose();
dk.Dispose();
de.Dispose();
我做错了什么???
答案 0 :(得分:1)
我不知道我是否帮助你,但我决定写作,因为我遇到了很多你所描述的麻烦。如果您为控件 drpdKategoria 设置了 AutoPostBack = true ,则每次在其中选择一个值时页面都会刷新。
如果您将数据绑定到Page_Load中的 drpdKategoria ,则可以使用:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
//bind data here
}
}
答案 1 :(得分:0)
具体看这些行:
string kategoria_id = "select kategoria_id from artikulli where id='" + id + "'";
SqlDataAdapter dk = new SqlDataAdapter(kategoria_id, con);
dk.Fill(ds);
string emertimi = "select emertimi from kategoria where id='" + kategoria_id + "'";
我不知道你在哪里有这个想法,但根据上面的评论和your previous question,你似乎真的坚持认为不知何故SQL查询字符串将从数据库中成为该查询的结果。它没有赢。 SQL查询的字符串将保留字符串。查询的结果与您使用它的方式一样,将位于DataSet
对象中。
(注意:您每次都重复使用相同的DataSet
对象。自从我使用ADO.NET对象以来已经有一段时间了,但我怀疑每次重新填充新结果时都会覆盖以前的查询结果。对于初学者,您可能希望至少使用单独的DataSet
个对象,直到获得这个问题。)
所以这里的问题是你的emertimi
查询看起来像这样:
select emertimi from kategoria where id='select kategoria_id from artikulli where id='3081''
这个问题显然不会奏效。首先是因为嵌套字符串会导致语法错误,其次是因为没有id
值称为文字字符串 "select kategoria_id from artikulli where id='3081'"
。
变量kategoria_id
只是一个字符串。即使您使用DataAdapter
执行查询,也不会更改字符串。您要查找的ID值,即查询的结果,位于DataSet
对象中。您将要检查它以确保存在值,但在第一个查询的成功方案中,ID值将位于:
ds.Tables[0].Rows[0][0]
这解析为数据集的第一个表,即该表的第一行,即该行中的第一个项。所以你可以这样做:
var kategoria_id_result = Convert.ToInt32(ds.Tables[0].Rows[0][0]);
string emertimi = "select emertimi from kategoria where id='" + kategoria_id_result + "'"
这将使用第一个查询的结果作为第二个查询的值,而不是使用第一个查询本身作为第二个查询的值。因此,最终,您寻找 的值,用于设置DropDownList
中的默认选定项目也可以在某个地方的DataSet
中查询SQL查询的结果。 (可能也在ds.Tables[0].Rows[0][0]
中,因为后面的SQL查询执行会覆盖以前的查询。)
但请注意,您的代码还存在许多其他问题。仅举几例:
Request.QueryString
值)视为可执行SQL代码。使用parameterized queries将用户输入视为数据,而不是代码。 (在提供的链接中,要特别注意在Parameters
对象上使用SqlCommand
属性。)id
值是数据库字符串还是整数?它们很可能是整数,但您的查询将它们视为字符串(通过将值包装在单引号中)。这可能会在执行数据库查询时导致错误。DataSet
。这可能覆盖前两个查询的结果,只保留最后一个查询的结果。using
statement正确处理一次性物品。null
值,尤其是在ADO.NET对象和DataSet
的弱类型世界中。例如,在您引用ds.Tables[0]
之前,您需要确保ds.Tables.Count
大于0,否则您将收到错误。您的代码中有一个 lot 更多的位置,您需要执行这样的检查。 (例如,在您使用FindControl
的开头。在尝试使用控件之前,应确保找到控件。)ds
,da
,did
,dk
等等。当您的变量名称是描述其的有意义的单词时,您会发现代码更容易调试变量的目的。try
/catch
blocks来更好地处理错误,尤其是在处理数据库等外部资源时。我希望这个答案没有过于批评或意味着,它真的不是那样的意图。这段代码有很多错误,我想避免这个单一的Stack Overflow问题成为help vampirism的一个主题。请完成some ADO.NET tutorials,并耐心地检查他们正在使用的对象以及这些对象正在做什么。查看对象的MSDN文档及其上设置的属性。以小步骤进行实验,一次更改一件事并检查它如何修改代码的运行时行为(使用调试器)。理解代码及其工作方式。不要只是复制/粘贴代码示例,并期望它们以您认为应该的方式工作。