Проблемы с преобразованием значений сеанса, где управление в базе данных сервера 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)


arrow_upward
2
arrow_downward

Что вы хотите сделать, так это получить отдельные данные из БД. Используйте 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