SCOPE_IDENTITY在asp.net中不起作用?
技术问答
238 人阅读
|
0 人回复
|
2023-09-14
|
我试图通过一个接一个地执行两个查询来插入一个记录并获得新生成的记录ID,但我不知道为什么它给了我以下错误。' s) t! g; \( e9 f
Object cannot be cast from DBNull to other types我的代码如下我不想用sql存储过程)5 c, _6 J4 M8 B
SqlParameter sqlParam; int lastInsertedVideoId = 0; using (SqlConnection Conn = new SqlConnection(ObjUtils._ConnString)) Conn.Open();;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;using (SqlCommand sqlCmd = Conn.CreateCommand()) string sqlInsertValues = "@Name,@Slug"; string sqlColumnNames = "[Name],[Slug]"; string sqlQuery = "INSERT INTO videos(" sqlColumnNames ") VALUES(" sqlInsertValues ");"; sqlCmd.CommandText = sqlQuery; sqlCmd.CommandType = CommandType.Text; sqlParam = sqlCmd.Parameters.Add("@Name",SqlDbType.VarChar); sqlParam.Value = txtName.Text.Trim();;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sqlParam = sqlCmd.Parameters.Add("@Slug",SqlDbType.VarChar); sqlParam.Value = txtSlug.Text.Trim();;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sqlCmd.ExecuteNonQuery();;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;//getting last inserted video id sqlCmd.CommandText = "SELECT SCOPE_IDENTITY() AS [lastInsertedVideoId]"; using (SqlDataReader sqlDr = sqlCmd.ExecuteReader())())) sqlDr.Read();;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; lastInsertedVideoId = Convert.ToInt32(sqlDr["lastInsertedVideoId"]); } } } //tags insertion into tag table if (txtTags.Text.Trim().Length > 0 && lastInsertedVideoId > 0) { string sqlBulkTagInsert = ""; string[] tags = txtTags.Text.Split(new string[] { "," },StringSplitOptions.RemoveEmptyEntries); foreach (string tag in tags) sqlBulkTagInsert = "INSERT INTO tags(VideoId,Tag) VALUES(" lastInsertedVideoId "," tag.Trim().ToLowerInvariant() "); "; using (SqlConnection Conn = new SqlConnection(ObjUtils._ConnString)) Conn.Open();;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;using (SqlCommand sqlCmd = Conn.CreateCommand()) string sqlQuery = sqlBulkTagInsert; sqlCmd.CommandText = sqlQuery; sqlCmd.CommandType = CommandType.Text; sqlCmd.ExecuteNonQuery(); } }另外,如果可能的话,请检查上面的代码是否正确,或者我们可以优化它来提高性能? M3 J2 V. a2 }# y3 [4 c& h; P
谢谢1 H: {8 x5 I/ g3 T
, i; E' E) a4 C A& n+ M
解决方案:
9 n, X6 z, K. u" \: p 对SCOPE_IDENTITY()调用不会被视为与您一起执行INSERT命令位于同一个作用域。! _( {. o' d+ d) D) z- I: u! l
本质上,你需要做的是改变你的职业:8 y+ s- p! q S: ^( ]
string sqlQuery = "INSERT INTO videos(" sqlColumnNames ") VALUES(" sqlInsertValues ");";到:
& A3 A2 n4 p, N6 ~& o) W, ^, astring sqlQuery = "INSERT INTO videos(" sqlColumnNames ") VALUES(" sqlInsertValues "); SELECT SCOPE_IDENTITY() AS [lastInsertedVideoId]";然后打电话& u0 g1 T0 h* g! S. P" S
int lastVideoInsertedId = Convert.ToInt32(sqlCmd.ExecuteScalar());而不是.ExecuteNonQuery和 ///获取最后插入的视频ID注释后面的代码块。 |
|
|
|
|
|