Порядок казней или проблема ExecuteScalar - PullRequest
0 голосов
/ 03 декабря 2011

Сначала я вставляю нового члена в таблицу участников.Затем я запрашиваю таблицу, чтобы получить идентификатор участника.Я получаю данные в таблицу, но они не отображаются там достаточно быстро, чтобы выполнить запрос в следующих строках.

Я получаю это исключение: «ExecuteScalar требует открытого и доступного соединения. Текущее состояние соединения закрыто».Я не могу понять, что здесь не так.

 //This code works fine
 //Insert new members data
 InsertMembers insert = new InsertMembers();
 int age = Int32.Parse(txtAge.Text);
 insert.InsertNewMember(txtEmail.Text, Myguid, txtName.Text, txtCity.Text, txtState.Text, txtDescription.Text, age, gender);

 //This is the block thats failing
 //Get Member Id to Insert into Pictures table
 GetMemberInfo GetID = new GetMemberInfo();
 int UMemberId = GetID.GetMemberId(Myguid);
 Displayme.Text = UMemberId.ToString();



 public int GetMemberID(string guid)
   {
       string strConectionString = ConfigurationManager.AppSettings["DataBaseConnection"];
       string StrSql = "SELECT MemberID FROM MEMBERS WHERE (Guid = @GuidID)";

       int memberId;
       using (var connection = new SqlConnection(strConectionString))
       using (var command = new SqlCommand(StrSql, connection))
       {
           command.Parameters.Add("@GuidID", SqlDbType.VarChar).Value = guid; 
           memberId = (int)command.ExecuteScalar();
       }
       //returns 0 when it should be member id number
       return memberId; 

   }

Ответы [ 3 ]

1 голос
/ 03 декабря 2011

Вы должны позвонить connection.Open() перед выполнением команды:

public int GetMemberID(string guid)
{
    string strConectionString = ConfigurationManager.AppSettings["DataBaseConnection"];
    string StrSql = "SELECT MemberID FROM MEMBERS WHERE (Guid = @GuidID)";

    int memberId;
    using (var connection = new SqlConnection(strConectionString))
    {
        connection.Open();
        using (var command = new SqlCommand(StrSql, connection))
        {
            command.Parameters.Add("@GuidID", SqlDbType.VarChar).Value = guid; 
            memberId = (int)command.ExecuteScalar();
        }
    }

    //returns 0 when it should be member id number
    return memberId; 
}
0 голосов
/ 03 декабря 2011

Замените эти строки кода

  using (var connection = new SqlConnection(strConectionString))
       using (var command = new SqlCommand(StrSql, connection))
       {
           command.Parameters.Add("@GuidID", SqlDbType.VarChar).Value = guid; 
           memberId = (int)command.ExecuteScalar();
       }

на эти

   using (SqlConnection connection = new SqlConnection(
               strConectionString))
    {
        SqlCommand command = new SqlCommand(StrSql, connection);
         command.Parameters.Add("@GuidID", SqlDbType.VarChar).Value = guid;
        command.Connection.Open();
        memberId = (int)command.ExecuteScalar();
    }

оператор using используется для автоматического удаления соединения, и я не думаю, что здесь необходимо применять, используяс командой sql, когда вы уже применили ее на SqlConnection.И вы пропустили открытие соединения перед выполнением команды.

0 голосов
/ 03 декабря 2011

Внимательно прочитайте сообщение об ошибке.Это не имеет никакого отношения к слишком быстрому ExecuteScalar, а также не относится к порядку операций, за исключением того, что есть конкретная операция , пропущенная . Вы не открыли соединение.

Бросьте connection.Open(); в пределах блока using до вызова ExecuteScalar, и вы должны получить другой результат.

...