Проблемы с преобразованием значений сеанса, где управление в базе данных сервера sql

Вот моя проблема, при входе в систему я заполняю 2 сеанса, 1 с названием компании и 1 с именем пользователя. Используя эти 2 сеанса, я хотел бы найти соответствующий идентификатор в базе данных. Но, как вы можете догадаться, типы данных сеансов и идентификаторов не совпадают, поэтому я предполагаю, что требуется некоторое преобразование. Итак, в основном то, что я пытаюсь сделать, это сохранить идентификаторы, соответствующие тексту в сеансах, в таблицу.

Вот код, который я использую до сих пор, но это дает ошибку, когда я пытаюсь сохранить заказ.

System.Data.SqlClient.SqlCommand myCommand1 = new System.Data.SqlClient.SqlCommand("SELECT tUserId FROM tblUsers WHERE tUserName=@Username", sqlConn);
                myCommand1.Parameters.AddWithValue("@Username", (string)Session["username"]);
                myCommand1.ExecuteNonQuery();
                int user = Convert.ToInt32(myCommand1.ToString());

                System.Data.SqlClient.SqlCommand myCommand2 = new System.Data.SqlClient.SqlCommand("SELECT tCompId FROM tblCompany WHERE tCompName=@company", sqlConn);
                myCommand2.Parameters.AddWithValue("@company", (string)Session["compNameLogin"]);
                myCommand2.ExecuteNonQuery();
                int comp = Convert.ToInt32(myCommand2.ToString());

                System.Data.SqlClient.SqlCommand myCommand3 = new System.Data.SqlClient.SqlCommand("INSERT INTO tblOrder(tBestCompId, tBestUserId ) VALUES('" + comp + "','" + user + "') ", sqlConn);
                myCommand3.ExecuteNonQuery();

System.FormatException: входная строка имеет неверный формат. в System.Number.StringToNumber (String str, параметры NumberStyles, NumberBuffer и число, информация NumberFormatInfo, логическое значение parseDecimal) в System.Number.ParseInt32 (String s, стиль NumberStyles, информация NumberFormatInfo) в System.Convert.ToInt32 (строковое значение)

Это ошибка, с которой я столкнулся.

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

Заранее спасибо.


person Dieter    schedule 07.04.2011    source источник


Ответы (1)


Что вы хотите сделать, так это получить отдельные данные из БД. Используйте ExecuteScalar:

System.Data.SqlClient.SqlCommand myCommand1 = 
         new System.Data.SqlClient.SqlCommand(
              "SELECT tUserId FROM tblUsers WHERE tUserName=@Username", sqlConn);
myCommand1.Parameters.AddWithValue("@Username", (string)Session["username"]);
int user = (int)myCommand1.ExecuteScalar();

ExecuteNonQuery вернет количество строк затронутый. Преобразование myCommand2.ToString() в int определенно не сработает, так как myCommand2 не сохраняет ваш результат (и мы не знаем, каков результат применения к нему ToString(), что в общем случае является кратким описанием объекта)

2-е решение:

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

string insertQuery = 
@"INSERT INTO tblOrder(tBestCompId, tBestUserId )
 SELECT U.tUserId, T.tblCompany
   FROM (SELECT tUserId FROM tblUsers WHERE tUserName=@Username) U,
        (SELECT tCompId FROM tblCompany WHERE tCompName=@company) T";


System.Data.SqlClient.SqlCommand myCommand
     = new System.Data.SqlClient.SqlCommand(insertQuery, sqlConn);
myCommand.Parameters.AddWithValue("@Username", (string)Session["username"]);
myCommand.Parameters.AddWithValue("@company", (string)Session["compNameLogin"]);
int affectedRows = myCommand1.ExecuteNonQuery();

// affectedRows will contain the number of inserted rows (which is 1)
person manji    schedule 07.04.2011
comment
Привет, спасибо за ваши ответы, но я все еще получаю сообщение об ошибке в строке: int user = (int)myCommand1.ExecuteScalar(); Ошибка гласит: указанный состав недействителен. в Project.MemberPages.Product.ButtonB_Click (отправитель объекта, EventArgs e) - person Dieter; 07.04.2011
comment
Вы можете установить там точку останова и проверить, какой тип myCommand1.ExecuteScalar()? - person manji; 07.04.2011
comment
Можете ли вы попробовать с int user = Convert.ToInt32(myCommand1.ExecuteScalar())? (by the way what is the datatype (in database) of tUserId` & tCompId? - person manji; 07.04.2011
comment
Да, это отлично сработало, просто нужно было добавить Convert.ToInt32. Их тип данных — числовой, кстати. Огромное спасибо за помощь. - person Dieter; 07.04.2011