Неправильная попытка вызова метаданных, когда читатель закрыт - PullRequest
0 голосов
/ 18 января 2012

Я получил сообщение об ошибке:

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();
    }

И еще одна вещь, я также получаю эту же ошибку, когда я ищу слово с тем же словом, например, я искал Джон

затем в моей базе данных есть имена, такие как Джон Майкл, Джон Эммануэль

, когда я щелкнул слово Джон в своем поле со списком, отобразилась ошибка, и она заполнилась именем Джон Майкл ... что мне делать ...пожалуйста помогите .. я знаю, что они / есть проблема в моем коде ..

спасибо всем.Кстати, я использую VS2010 C # и SQL Server 2005

1 Ответ

0 голосов
/ 18 января 2012

Понятия не имею, попробуйте использовать параметризованный запрос и правильно обработать одноразовые ресурсы, такие как соединения, команды и программы чтения:

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"));
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...