当前位置: 首页 > 面试题库 >

SCOPE_IDENTITY在asp.net中不起作用?

洪育
2023-03-14
问题内容

我试图通过一条记录一个接一个地执行两个查询来插入一条记录并获取其新生成的ID,但是不知道为什么它给了我以下错误。

Object cannot be cast from DBNull to other types

我的代码如下:(我不想使用sql存储过程)

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

另外,如果可能,请检查上面的代码是否编码正确,或者我们可以对其进行更多优化以提高性能

谢谢


问题答案:

对SCOPE_IDENTITY()的调用不会被视为与您正在执行的INSERT命令位于同一“作用域”中。

本质上,您需要做的是更改行:

string sqlQuery = "INSERT INTO videos(" + sqlColumnNames + ") VALUES(" + sqlInsertValues + ");";

到:

string sqlQuery = "INSERT INTO videos(" + sqlColumnNames + ") VALUES(" + sqlInsertValues + "); SELECT SCOPE_IDENTITY() AS [lastInsertedVideoId]";

然后打电话

int lastVideoInsertedId = Convert.ToInt32(sqlCmd.ExecuteScalar());

而不是.ExecuteNonQuery和“ //获取最后插入的视频ID”注释后面的代码块。



 类似资料:
  • 问题内容: 我正在使用Razor创建一个新项目asp.net mvc3,并希望将LogOn转换为ajax请求。 的HTML 控制者 其他所有内容保持不变。 首先,用Fiddler查看http响应,我注意到没有x-requested-with标头。所以我加 这似乎可行,但是现在我收到的是一个Json对象,该对象没有被解析,而是Google Chrome通过发送回一个application / jso

  • 我想用Gzip压缩我的web应用程序,我使用下面的类 压缩滤波器 更新缓存过滤器工作正常,但仍然没有gzip压缩,下面是Chrome中的响应头。 我有什么办法能让这一切成功吗?我真的需要帮助,谢谢

  • Authenticate-method工作得很好。我的webapp从请求中获得一个令牌,我可以将其设置为授权头(例如,$HTTP用于angular apps)。随后对带[Authorize]注释的函数的调用将正确返回。但是,如果我调用Logout,它将正确返回“OK”字符串,但不会使令牌无效。如果我在调用Logout之后调用Authorize-method,我仍然得到一个正确的值,而不是预期的40

  • 问题内容: 我在一个控制器中使用了以下代码; 我调试了它,它涉及返回行,但是没有发生重定向。是否可以在Ajax.BeginForm内执行此操作?这是剃刀代码; 问题答案: 您无法从服务器重定向AJAX操作。如果您希望浏览器以AJAX操作重定向,则需要使用javascript进行重定向。显然,使用AJAX重定向绝对没有用。如果您打算重定向,请使用常规的Html.Begin表单,不要打扰AJAX。

  • 问题内容: 我有一个包含的Web用户控件。表单视图显示求职者的详细信息。我为“下载简历”链接提供了一个按钮,以便管理员/ HR可以下载简历。我已将此控件放置在包含UpdatePanel的aspx页面中。除了下载链接,其他一切都正常。 我已经给出了“下载链接上的命令”链接按钮,并且有一个函数与该命令相关联以开始下载。 下面是我实现的代码- 如果删除了更新面板,则代码可以正常工作,但是如果使用了更新面

  • 问题内容: 一直试图获取SCOPE_IDENTITY()(最后一个插入到DB中的ID)并将其作为变量存储在我的PHP函数中。 这是我目前拥有的: 我做错了什么? 编辑: 另外…在构造中,我试图在$ this-> post中传递ID($ this-> Id),但它返回0。我可以看到这是由于我只设置了$查询通过后this-> Id,因此返回0,但我不确定如何继续。有什么建议? 问题答案: 首先,您的问