1

Scope_Identity で挿入したばかりの最近の ID を渡そうとしていますが、奇妙なことがいくつかあります。それは言う:

: 指定されたキャストは無効です

そして次の行を参照してください:

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);

誰かが手がかりを持っていますか?

ありがとう!

4

2 に答える 2

3

SCOPE_IDENTITY()以外の型の列で を定義できるnumeric(38,0)ため、戻ります( SQL Server - IDENTITY 列でサポートされているデータ型は何ですか? を参照してください)。IDENTITYint

ExecuteScalardecimalは aを として返しobjectますが、直接キャストすることはできませんint。代わりに、decimal最初にキャストしてから、次のようにキャストしintます。

int IdOfRecentHistoryGame = (Int32)(Decimal)commandquery.ExecuteScalar();
于 2012-01-05T01:49:57.350 に答える
1

SCOPE_IDENTITY() は、実際には SQL サーバーで Int を返さないようです。あなたがしようとしたようにキャストできないとは知りませんでしたが、どうやらできないようです。

以下のリンクは、ソース列が整数の場合、それをまったくキャストする必要はないことを示していますが、これはとにかく試してみる価値があります-

Scope_Identity() を Int にキャストするにはどうすればよいですか? 整数を取得するために SQL クエリ内でこれをキャストする方法を示します。

(Jose Basilio 提供)

DECLARE @NewIdent Int
SET @NewIdent = SCOPE_IDENTITY()

その出力に変数を割り当ててみてください。

于 2012-01-05T01:16:13.843 に答える