我試圖從一個存儲過程得到插入或更新的ID,我嘗試兩種不同的方式的Upsert返回ID
我不能使用使用If exists(select ....)
性能原因
1 OUTPUT
@firstName varchar(30),
@Telephone int
AS
BEGIN transaction
UPDATE [PHONE_BOOK].[dbo].[USER]
SET TELEPHONE= @Telephone
output inserted.USERID
where FIRST_NAME = @firstName
if @@ROWCOUNT = 0
begin
INSERT INTO [PHONE_BOOK].[dbo].[USER]
([FIRST_NAME]
,[TELEPHONE])
output inserted.USERID -- or output SCOPE_IDENTITY()
VALUES
(@firstName
,@Telephone)
end
C#代碼
IList<SqlParameter> parameters = new List<SqlParameter>();
parameters.Add(new SqlParameter("@firstName", "Mike"));
parameters.Add(new SqlParameter("@Telephone", 9514256));
using (var sqlConnection = new SqlConnection(Config.ConnString))
{
sqlConnection.Open();
using (SqlCommand command = sqlConnection.CreateCommand())
{
command.CommandType = CommandType.StoredProcedure;
command.CommandText = "[dbo].[INSET_USER]";
command.UpdatedRowSource = UpdateRowSource.None;
foreach (SqlParameter oPar in parameters)
command.Parameters.Add(oPar);
object x = command.ExecuteScalar();
}
}
- 在更新的情況下==>
x
是正確 - 在刪除==時>
x
爲空使用OUTPUT參數
2-
@firstName varchar(30),
@Telephone int,
@userId int output
AS
BEGIN transaction
UPDATE [PHONE_BOOK].[dbo].[USER]
SET TELEPHONE= @Telephone
where FIRST_NAME = @firstName
-- i can't find different way to set @userId than doing a select which is not acceptable
if @@ROWCOUNT = 0
begin
INSERT INTO [PHONE_BOOK].[dbo].[USER]
([FIRST_NAME]
,[TELEPHONE])
VALUES
(@firstName
,@Telephone)
set @userId = SCOPE_IDENTITY()
end
C#代碼:
IList<SqlParameter> parameters = new List<SqlParameter>();
parameters.Add(new SqlParameter("@firstName", "Mike"));
parameters.Add(new SqlParameter("@Telephone", 9514256));
using (var sqlConnection = new SqlConnection(Config.ConnString))
{
sqlConnection.Open();
using (SqlCommand command = sqlConnection.CreateCommand())
{
command.CommandType = CommandType.StoredProcedure;
command.CommandText = "[dbo].[INSET_USER]";
command.UpdatedRowSource = UpdateRowSource.None;
foreach (SqlParameter oPar in parameters)
command.Parameters.Add(oPar);
command.Parameters.Add("@userId",0).Direction = ParameterDirection.Output;
command.ExecuteNonQuery();
var x = command.Parameters["@userId"].Value;
}
}
- 在更新==>
x
的情況下是-1 - 在刪除==時>
x
是正確的
我怎樣才能解決這一問題?由於我不需要將輸出參數傳遞給存儲過程,因此我不需要將輸出參數傳遞給存儲過程
如何使存儲過程中的ID爲OUTPUT參數? – Melanie 2013-03-04 22:06:34
然後在我的C#代碼中,我必須傳遞一個ID值?如果是的話,我必須通過什麼價值?另外如果我傳遞id作爲參數,那麼在更新的情況下,然後我必須調用select來將id分配給我想要避免的更新值 – Maro 2013-03-04 22:09:38
您是否正在查找更新中影響的行數? – 2013-03-04 22:12:16