Порядок казней или проблема ExecuteScalar
Сначала я вставляю нового члена в таблицу участников. Затем я запрашиваю таблицу, чтобы получить идентификатор участника. Я получаю данные в таблицу, но они не отображаются там достаточно быстро, чтобы выполнить запрос в следующих строках.
Я получаю это исключение: "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 ответа
Вам следует позвонить 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;
}
Прочитайте сообщение об ошибке очень внимательно. Это не имеет никакого отношения к слишком быстрому ExecuteScalar, а также не касается порядка операций, за исключением случаев, когда отсутствует конкретная операция. Вы не открыли соединение.
Бросить в connection.Open();
в рамках using
блоки до ExecuteScalar
вызов, и вы должны испытать другой результат.
Замените эти строки кода
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();
}
Использование оператора используется для автоматического удаления соединения, и я не думаю, что здесь необходимо применять команду с использованием команды sql, когда вы уже применили ее в SqlConnection. И вы пропустили, чтобы открыть соединение перед выполнением команды.