Попытка передать недавний идентификатор с помощью scope_identity и его ошибку me: указанное приведение недействительно - PullRequest
1 голос
/ 05 января 2012

Я пытаюсь передать недавний идентификатор, который я только что вставил с Scope_Identity, и он дает мне некоторые странные вещи.он говорит:

: указанное приведение недопустимо

и ссылается на строку:

int IdOfRecentHistoryGame = (Int32)commandquery.ExecuteScalar();

это остаток кода

string username = Session["Session"].ToString();

            con = new SqlConnection("Data Source=MICROSOF-58B8A5\\SQL_SERVER_R2;Initial Catalog=Daniel;Integrated Security=True");
            con.Open();

            string knowWhichOne = "SELECT ID FROM Users WHERE Username='" + UserOrGuest.Text + "'";

            SqlCommand comm = new SqlCommand(knowWhichOne, con);
            int userID = (Int32)comm.ExecuteScalar();

            knowWhichOne = "SELECT ClassID FROM Users WHERE Username='" + UserOrGuest.Text + "'";

            comm = new SqlCommand(knowWhichOne, con);
            int classID = (Int32)comm.ExecuteScalar();

            knowWhichOne = "SELECT SchoolID FROM Users WHERE Username='"+UserOrGuest.Text + "'";

            comm = new SqlCommand(knowWhichOne, con);
            int schoolID = (Int32)comm.ExecuteScalar();

            if (RadioWords.Checked == true)
            {
                 game = 1;
            }
            else
            {
                 game = 2;
            }
            string arr = "";
            for (int i = 0; i < ListBox.Items.Count; i++)
            {
                arr += ListBox.Items[i] +",";
            }

            string sqlqueryString = "INSERT INTO HistoryOfGames (GameID, UserID, LengthOfArray, NumberOfErrors, ClassID, SchoolID,Arrayarray) VALUES (@GameID, @UserID, @LengthOfArray, @NumberOfErrors, @ClassID, @SchoolID, @Arrayarray);" + "SELECT SCOPE_IDENTITY()";

            SqlCommand commandquery = new SqlCommand(sqlqueryString, con);

            commandquery.Parameters.AddWithValue("GameID", game);
            commandquery.Parameters.AddWithValue("UserID", userID);
            commandquery.Parameters.AddWithValue("LengthOfArray", HowMany.Text);
            commandquery.Parameters.AddWithValue("NumberOfErrors", 0);
            commandquery.Parameters.AddWithValue("ClassID", classID);
            commandquery.Parameters.AddWithValue("SchoolID", schoolID);
            commandquery.Parameters.AddWithValue("Arrayarray", arr);

            commandquery.ExecuteNonQuery();





            int IdOfRecentHistoryGame = (Int32)commandquery.ExecuteScalar();
            con.Close();

            Response.Redirect("NowPlay.aspx?ID="+ IdOfRecentHistoryGame);

у кого-нибудь есть подсказка?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 05 января 2012

SCOPE_IDENTITY() возвращает numeric(38,0), поскольку IDENTITY можно определить для столбцов типов, кроме int (см. SQL Server - Какие типы данных поддерживаются в столбцах IDENTITY? ).

ExecuteScalar возвращает decimal как object, который вы не можете напрямую привести к int. Вместо этого приведите сначала к decimal, затем к int:

int IdOfRecentHistoryGame = (Int32)(Decimal)commandquery.ExecuteScalar();
1 голос
/ 05 января 2012

SCOPE_IDENTITY (), по-видимому, фактически не возвращает Int в SQL-сервере.Я не знал, что это не может быть разыграно, как ты пытался, но, видимо, не может.

В приведенной ниже ссылке написано, что если исходный столбец является целым числом, вам не нужно его вообще разыгрывать, но это стоит того, чтобы его попробовать -

Как сделатьЯ приведу Scope_Identity () к Int? показывает, как привести это в SQL-запросе, чтобы получить целое число:

(Предоставлено Jose Basilio)

DECLARE @NewIdent Int
SET @NewIdent = SCOPE_IDENTITY()

Попробуйтеприсвоение вашей переменной на выходе этого.

...