Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从ADO.NET&C中的SQL Server获取返回值IDENT_CURRENT_C#_Sql_Ado.net - Fatal编程技术网

C# 从ADO.NET&C中的SQL Server获取返回值IDENT_CURRENT

C# 从ADO.NET&C中的SQL Server获取返回值IDENT_CURRENT,c#,sql,ado.net,C#,Sql,Ado.net,我使用的是SQL Server 2014,我有一个返回int值的存储过程: 如果我查询sql,它会工作,我会看到返回值,但在C ADO.NET中,我总是得到NULL。我尝试了一些我在这里看到的事情,但没有任何效果,我很高兴能得到帮助 这是我的C代码: using (con) { SqlCommand cmd = new SqlCommand("dbo.spSetShippingData", con); cmd.CommandType = CommandType.StoredPro

我使用的是SQL Server 2014,我有一个返回int值的存储过程:

如果我查询sql,它会工作,我会看到返回值,但在C ADO.NET中,我总是得到NULL。我尝试了一些我在这里看到的事情,但没有任何效果,我很高兴能得到帮助

这是我的C代码:

using (con)
{
    SqlCommand cmd = new SqlCommand("dbo.spSetShippingData", con);
    cmd.CommandType = CommandType.StoredProcedure;

    SqlParameter tvpParam = cmd.Parameters.AddWithValue("@tvpNewShippingData", dt);
    tvpParam.SqlDbType = SqlDbType.Structured;

    cmd.Parameters.Add("@ShippingDataID", SqlDbType.Int).Direction = ParameterDirection.ReturnValue;

    cmd.ExecuteNonQuery();
    val = (int)cmd.Parameters["@ShippingDataID"].Value;

    returnValue = new SqlParameter();
    returnValue.Direction = ParameterDirection.ReturnValue;
    cmd.Parameters.Add(returnValue);

    cmd.Parameters.Add("@ShippingDataID", SqlDbType.Int).Direction = ParameterDirection.Output;

    val = (int)cmd.Parameters["@ShippingDataID"].Value;
    //cmd.ExecuteNonQuery();
}

con.Close();
这是我的SQL代码:

 CREATE PROCEDURE [dbo].[spSetShippingData] 
      @tvpNewShippingData dbo.TVPShippingDataTableType readonly
 AS
 BEGIN
     DECLARE @ShippingDataID INT = 0;

     INSERT INTO dbo.ShippingData(FirstName, LastName, Email, Phone, AdditionalPhone, City, Street, StreetNumber, Entrance, ApartmentNumber, PostalCode, CompanyID)
        SELECT 
            FirstName, LastName, Email, Phone, AdditionalPhone, 
            City, Street, StreetNumber, Entrance, 
            ApartmentNumber, PostalCode, CompanyID
        FROM 
            @tvpNewShippingData

    SET @ShippingDataID = IDENT_CURRENT ('ShippingData');

    SELECT @ShippingDataID;
END

您可以在过程结束时添加

SET @ShippingDataID = IDENT_CURRENT ('ShippingData'); 
SELECT @ShippingDataID AS RETURN_ID
CREATE PROCEDURE [dbo].[spSetShippingData] @tvpNewShippingData 
    dbo.TVPShippingDataTableType readonly
AS
BEGIN

    INSERT INTO dbo.ShippingData
        (FirstName,LastName,Email,Phone,AdditionalPhone,City,
        Street,StreetNumber,Entrance,ApartmentNumber,PostalCode,CompanyID)
    SELECT FirstName,LastName,Email,Phone,AdditionalPhone,City,
        Street,StreetNumber,Entrance,ApartmentNumber,PostalCode,CompanyID
    FROM @tvpNewShippingData
    RETURN IDENT_CURRENT ('ShippingData');
END
在c中

您可以使用DataAdapter获取值

SqlDataAdapter adp = new SqlDataAdapter(cmd);
adp.Fill(dt);
int shipingId =Convert.ToInt32(dt.Rows[0]["RETURN_ID"].ToString());

我希望您能对这段代码有所了解。

如果希望通过返回参数而不是输出参数接收IDENT_CURRENT的值,则需要在存储过程中调用return语句

SET @ShippingDataID = IDENT_CURRENT ('ShippingData'); 
SELECT @ShippingDataID AS RETURN_ID
CREATE PROCEDURE [dbo].[spSetShippingData] @tvpNewShippingData 
    dbo.TVPShippingDataTableType readonly
AS
BEGIN

    INSERT INTO dbo.ShippingData
        (FirstName,LastName,Email,Phone,AdditionalPhone,City,
        Street,StreetNumber,Entrance,ApartmentNumber,PostalCode,CompanyID)
    SELECT FirstName,LastName,Email,Phone,AdditionalPhone,City,
        Street,StreetNumber,Entrance,ApartmentNumber,PostalCode,CompanyID
    FROM @tvpNewShippingData
    RETURN IDENT_CURRENT ('ShippingData');
END
现在,您的C代码应该在ReturnValue参数中接收返回值

cmd.Parameters.Add("@ShippingDataID", SqlDbType.Int).Direction =    ParameterDirection.ReturnValue;
cmd.ExecuteNonQuery();
val = (int)cmd.Parameters["@ShippingDataID"].Value;
但我更喜欢一种更简单的方法

CREATE PROCEDURE [dbo].[spSetShippingData] @tvpNewShippingData 
    dbo.TVPShippingDataTableType readonly
AS
BEGIN

    INSERT INTO dbo.ShippingData
        (FirstName,LastName,Email,Phone,AdditionalPhone,City,
        Street,StreetNumber,Entrance,ApartmentNumber,PostalCode,CompanyID)
    SELECT FirstName,LastName,Email,Phone,AdditionalPhone,City,
        Street,StreetNumber,Entrance,ApartmentNumber,PostalCode,CompanyID
    FROM @tvpNewShippingData
    SELECT IDENT_CURRENT ('ShippingData');
END
在C中调用ExecuteScalar而不是ExecuteOnQuery,而不使用返回值

object result = cmd.ExecuteScalar();
int val = (result == null ? (int)0 : Convert.ToInt32(result);

ExecuteScalar将返回代码执行的最后一个SELECT的第一行的第一列,因此您不需要构建参数。

您可以添加存储过程的代码吗?特别是参数的声明以及如何设置返回值?我添加了sql代码。IDENT_CURRENT几乎总是使用错误的函数。您是否出于某种原因故意选择使用它,而不是使用SCOPE\u标识?问题是:您正在使用SELECT返回ID,因此这将是存储过程的结果集。然而,在您的C代码中,您试图读取一个不存在的?输出参数。。。。。您需要使用C中的ExecuteScalar调用存储过程,并从结果集中读取该值。这是一个很好的答案,我只想指出,返回值不是用于数据,而是用于结果代码。另外,输出参数会更有效。您可以使用SET@ShippingDataID=SELECT MAXYourShippingDataId from ShippingDatain sql我看到了返回值,但在c中我仍然得到null。