C#Scope_Identity问题

Zee*_*eeV 3 c# sql executescalar scope-identity

浏览了一些答案,似乎并不适合我.

我需要返回一个表的ID字段,所以我可以在程序的不同部分使用它,我尝试过使用

    Convert.ToInt32(sqlComm.ExecuteScalar());
Run Code Online (Sandbox Code Playgroud)

但没有运气,同样如此

    Convert.ToInt32(sqlComm.Parameters["ID"].Value);
Run Code Online (Sandbox Code Playgroud)

并且两者都返回0,即使记录已插入表中.

我将转储下面的代码,任何人都可以看到我做错了什么?

    using (SqlConnection sqlConnect = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
        {
            using (SqlCommand sqlComm = new SqlCommand("up_Insert_Address", sqlConnect))
            {
                sqlComm.CommandType = CommandType.StoredProcedure;
                sqlComm.Parameters.Add("@AddressID", SqlDbType.BigInt).Direction = ParameterDirection.Output;
                sqlComm.Parameters.Add("@AddressLineOne", SqlDbType.NVarChar, 40).Value = address.AddressLineOne;   

                try
                {
                    sqlComm.Connection.Open();
                    return Convert.ToInt32(sqlComm.ExecuteScalar());
                }

                catch (SqlException)
                {
                }

                finally
                {
                    sqlComm.Connection.Close();
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

和存储过程:

    @AddressID   Bigint OUTPUT,
    @AddressLineOne  NVarChar(40)
    AS
     BEGIN
      BEGIN TRY
      INSERT INTO Address
      (
         AddressLineOne
      )
      VALUES 
      (
         @AddressLineOne
      )

      SET @AddressID = SCOPE_IDENTITY();
    END TRY
    BEGIN CATCH
       DECLARE @Err nvarchar(500)
       SET @Err = ERROR_MESSAGE()
       RAISERROR(@Err, 16, 1)
    END CATCH
   END
Run Code Online (Sandbox Code Playgroud)

D S*_*ley 6

你应该使用

Convert.ToInt64(sqlComm.Parameters["@AddressID"].Value);
Run Code Online (Sandbox Code Playgroud)

使用后执行命令后ExceuteNonQuery.供将来参考,ExecuteScalar 返回查询返回的结果集中第一行的第一列.你没有返回任何东西,只是设置一个OUTPUT参数的值.

你也应该绝对不要吞下任何东西SqlException.由于您的命令和连接已经在using块中,因此您无需添加另一个try/catch/finally.将其更改为:

//try
//{
    sqlComm.Connection.Open();
    sqlComm.ExecuteNonQuery();
    return Convert.ToInt64(sqlComm.Parameters["@AddressID"].Value);
    // using Int64 since the SQL type is BigInt
//}

//catch (SqlException)
//{
//}

//finally
//{
//    sqlComm.Connection.Close();
//}
Run Code Online (Sandbox Code Playgroud)