在 ADO.NET & C# 中从 SQL 服务器获取 return 值 IDENT_CURRENT
Get return value IDENT_CURRENT from SQL Server in ADO.NET & C#
我正在使用 SQL Server 2014,我有一个存储过程 return 是一个 int
值:
@ShippingDataID = IDENT_CURRENT ('ShippingData');
如果我查询 sql 它的工作并且我看到 return 值但在 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
在 c# 中
您可以使用 DataAdapter 获取值
SqlDataAdapter adp = new SqlDataAdapter(cmd);
adp.Fill(dt);
int shipingId =Convert.ToInt32(dt.Rows[0]["RETURN_ID"].ToString());
我希望你能通过这段代码有所了解。
如果您想通过 return 参数(而不是通过 out 参数)接收 IDENT_CURRENT 的值,那么您需要在存储过程中调用 RETURN 语句
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 参数中收到 return 值
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 而不是 ExecuteNonQuery 而不使用 return 值
object result = cmd.ExecuteScalar();
int val = (result == null ? (int)0 : Convert.ToInt32(result);
ExecuteScalar 会return第一行的第一列最后SELECT你的代码执行的,所以你不需要构建参数。
我正在使用 SQL Server 2014,我有一个存储过程 return 是一个 int
值:
@ShippingDataID = IDENT_CURRENT ('ShippingData');
如果我查询 sql 它的工作并且我看到 return 值但在 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
在 c# 中
您可以使用 DataAdapter 获取值
SqlDataAdapter adp = new SqlDataAdapter(cmd);
adp.Fill(dt);
int shipingId =Convert.ToInt32(dt.Rows[0]["RETURN_ID"].ToString());
我希望你能通过这段代码有所了解。
如果您想通过 return 参数(而不是通过 out 参数)接收 IDENT_CURRENT 的值,那么您需要在存储过程中调用 RETURN 语句
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 参数中收到 return 值
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 而不是 ExecuteNonQuery 而不使用 return 值
object result = cmd.ExecuteScalar();
int val = (result == null ? (int)0 : Convert.ToInt32(result);
ExecuteScalar 会return第一行的第一列最后SELECT你的代码执行的,所以你不需要构建参数。