浏览了一些答案,似乎并不适合我。
我需要返回一个表的ID字段,所以我可以在程序的不同部分使用它,我尝试过使用
Convert.ToInt32(sqlComm.ExecuteScalar());
但没有运气,而且
也是如此 Convert.ToInt32(sqlComm.Parameters["ID"].Value);
并且两者都返回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();
}
}
}
存储过程:
@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
答案 0 :(得分:6)
您应该使用
Convert.ToInt64(sqlComm.Parameters["@AddressID"].Value);
使用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();
//}
答案 1 :(得分:0)
var connectionstring = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
var addressId = 0L; // long value (64bit)
using (var connection = new SqlConnection(connectionString))
using (var command = new SqlCommand("up_Insert_Address", connection))
{
command.CommandType = CommandType.StoredProcedure;
command.Parameters.AddWithValue("@AddressID", addressId);
command.Parameters.AddWithValue("@AddressLineOne", address.AddressLineOne);
command.Parameters["@AddressID"].Direction = ParameterDirection.Output;
try
{
if(connection.State != ConnectionState.Open)
connection.Open();
var rowsAffected = command.ExecuteNonQuery();
addressId = Convert.ToInt64(command.Parameters["@AddressID"].Value);
}
catch (SqlException)
{
// Handle SQL errors here.
}
}