C# 关闭读取器时调用元数据的尝试无效
我收到一条错误消息:C# 关闭读取器时调用元数据的尝试无效,c#,visual-studio-2010,C#,Visual Studio 2010,我收到一条错误消息: Invalid attempt to call MetaData when reader is closed. 并将其指向此代码: --> txtMname.Text = dr1["Crew_Mname"].ToString(); 下面的代码是我中间名的组合框,如果找到结果,它将填充所有必要的textboxex private void txtMname_SelectedIndexChanged(object sender, EventArgs e) {
Invalid attempt to call MetaData when reader is closed.
并将其指向此代码:
--> txtMname.Text = dr1["Crew_Mname"].ToString();
下面的代码是我中间名的组合框,如果找到结果,它将填充所有必要的textboxex
private void txtMname_SelectedIndexChanged(object sender, EventArgs e)
{
txtMname.Items.Clear();
txtMname.Text = "";
econ = new SqlConnection();
econ.ConnectionString = emp_con;
econ.Open();
ecmd = new SqlCommand("SELECT Crew_Lname, Crew_Fname, Crew_Mname, Crew_Add1, Crew_Add2, Crew_Contact, Crew_Bdate, Rank_Name FROM CREW C, SKILL_RANK SR WHERE C.Rank_Id = SR.Rank_Id AND Crew_Lname like '" + Convert.ToString(txtLname.Text) + "%' AND Crew_Fname like '" + Convert.ToString(txtFname.Text) + "%'", econ);
ecmd.CommandType = CommandType.Text;
ecmd.Connection = econ;
dr1 = ecmd.ExecuteReader();
while (dr1.Read())
{
txtLname.Text = dr1["Crew_Lname"].ToString();
txtFname.Text = dr1["Crew_Fname"].ToString();
txtMname.Text = dr1["Crew_Mname"].ToString();
txtAddress.Text = dr1["Crew_Add1"].ToString();
txtAddress1.Text = dr1["Crew_Add2"].ToString();
txtContact.Text = dr1["Crew_Contact"].ToString();
dtpBdate.Text = dr1["Crew_Bdate"].ToString();
comRank.Text = dr1["Rank_Name"].ToString();
}
econ.Close();
}
还有一件事,每当我搜索同一个单词时,我也会得到同样的错误
e、 我搜索了
约翰
然后在我的数据库中有像约翰·迈克尔、约翰·艾曼纽这样的名字
当我在组合框中单击“John”一词时,会显示错误,并用John Michael的名字填充。。我该怎么办。。请帮忙。。我知道他们在我的代码中存在问题
谢谢大家。顺便说一句,我使用VS2010 C和SQL Server 2005不知道,请尝试使用参数化查询并正确处理连接、命令和读卡器等一次性资源:
using (var con = new SqlConnection(emp_con))
using (var cmd = con.CreateCommand())
{
con.Open();
cmd.CommandText =
@"
SELECT
Crew_Lname,
Crew_Fname,
Crew_Mname,
Crew_Add1,
Crew_Add2,
Crew_Contact,
Crew_Bdate,
Rank_Name
FROM
CREW C,
SKILL_RANK SR
WHERE
C.Rank_Id = SR.Rank_Id
AND
Crew_Lname LIKE @lName
AND
Crew_Fname LIKE @fName
";
cmd.Parameters.AddWithValue("@lName", txtLname.Text + "%");
cmd.Parameters.AddWithValue("@fName", txtFname.Text + "%");
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
txtLname.Text = reader.GetString(reader.GetOrdinal("Crew_Lname"));
txtFname.Text = reader.GetString(reader.GetOrdinal("Crew_Fname"));
txtMname.Text = reader.GetString(reader.GetOrdinal("Crew_Mname"));
txtAddress.Text = reader.GetString(reader.GetOrdinal("Crew_Add1"));
txtAddress1.Text = reader.GetString(reader.GetOrdinal("Crew_Add2"));
txtContact.Text = reader.GetString(reader.GetOrdinal("Crew_Contact"));
// Remark: if the Crew_Bdate is a datetime field in your database
// you should use reader.GetDateTime instead of reader.GetString
dtpBdate.Text = reader.GetString(reader.GetOrdinal("Crew_Bdate"));
comRank.Text = reader.GetString(reader.GetOrdinal("Rank_Name"));
}
}
}