Dapper를 사용하여 삽입된 ID를 반환하려면 어떻게 해야 합니까?
데이터베이스에 삽입을 실행하여 삽입된 ID를 Dapper에서 반환하려면 어떻게 해야 합니까?
난 이런 걸 해봤어
string sql = "DECLARE @ID int; " +
"INSERT INTO [MyTable] ([Stuff]) VALUES (@Stuff); " +
"SELECT @ID = SCOPE_IDENTITY()";
var id = connection.Query<int>(sql, new { Stuff = mystuff}).First();
하지만 소용없었다.
@마크 그라벨, 답장 고마워요.귀사의 솔루션을 시험해 보았지만 여전히 동일한 예외 추적이 아래에 있습니다.
System.InvalidCastException: Specified cast is not valid
at Dapper.SqlMapper.<QueryInternal>d__a`1.MoveNext() in (snip)\Dapper\SqlMapper.cs:line 610
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at Dapper.SqlMapper.Query[T](IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Boolean buffered, Nullable`1 commandTimeout, Nullable`1 commandType) in (snip)\Dapper\SqlMapper.cs:line 538
at Dapper.SqlMapper.Query[T](IDbConnection cnn, String sql, Object param) in (snip)\Dapper\SqlMapper.cs:line 456
입력/출력 파라미터(포함)를 지원합니다.RETURNvalue)를 사용하는 경우DynamicParameters단, 이 경우 간단한 옵션은 다음과 같습니다.
var id = connection.QuerySingle<int>( @"
INSERT INTO [MyTable] ([Stuff]) VALUES (@Stuff);
SELECT CAST(SCOPE_IDENTITY() as int)", new { Stuff = mystuff});
SQL Server(2005+)의 최신 버전에서는OUTPUT절:
var id = connection.QuerySingle<int>( @"
INSERT INTO [MyTable] ([Stuff])
OUTPUT INSERTED.Id
VALUES (@Stuff);", new { Stuff = mystuff});
늦은 답변입니다만, 여기 다른 대안이 있습니다.SCOPE_IDENTITY()최종적으로 사용한 답변: OUTPUT INSERTED
삽입된 개체의 ID만 반환합니다.
삽입된 행의 모든 속성 또는 일부 속성을 가져올 수 있습니다.
string insertUserSql = @"INSERT INTO dbo.[User](Username, Phone, Email)
OUTPUT INSERTED.[Id]
VALUES(@Username, @Phone, @Email);";
int newUserId = conn.QuerySingle<int>(
insertUserSql,
new
{
Username = "lorem ipsum",
Phone = "555-123",
Email = "lorem ipsum"
},
tran);
삽입된 개체를 ID로 반환합니다.
당신이 원한다면, 당신은 할 수 있다.Phone그리고.Email또는 삽입된 전체 행:
string insertUserSql = @"INSERT INTO dbo.[User](Username, Phone, Email)
OUTPUT INSERTED.*
VALUES(@Username, @Phone, @Email);";
User newUser = conn.QuerySingle<User>(
insertUserSql,
new
{
Username = "lorem ipsum",
Phone = "555-123",
Email = "lorem ipsum"
},
tran);
또한 이를 통해 삭제되거나 업데이트된 행의 데이터를 반환할 수 있습니다.트리거를 사용하는 경우(앞에서 설명한 링크에서):
OUTPUT에서 반환되는 열은 INSERT, UPDATE 또는 DELETE 문이 완료된 후 트리거가 실행되기 전의 데이터를 그대로 반영합니다.
트리거 대신 트리거의 경우 트리거 작업의 결과로 수정이 이루어지지 않더라도 INSERT, UPDATE 또는 DELETE가 실제로 발생한 것처럼 반환된 결과가 생성됩니다.OUTPUT 절을 포함하는 문이 트리거 본문 내에서 사용되는 경우 OUTPUT과 관련된 INSERTED 및 DELETED 테이블과 열 참조가 중복되지 않도록 테이블 별칭을 사용하여 삽입 및 삭제된 테이블을 참조해야 합니다.
자세한 내용은 다음 문서를 참조하십시오.링크
KB:2019779"SCOPE_IDENTITY() 및 @@IDENTITY를 사용할 때 잘못된 값을 받을 수 있습니다.OUTPUT 절은 가장 안전한 메커니즘입니다.
string sql = @"
DECLARE @InsertedRows AS TABLE (Id int);
INSERT INTO [MyTable] ([Stuff]) OUTPUT Inserted.Id INTO @InsertedRows
VALUES (@Stuff);
SELECT Id FROM @InsertedRows";
var id = connection.Query<int>(sql, new { Stuff = mystuff}).Single();
InvalidCastException은 SCOPE_IDENTITY가 10진수(38,0)이기 때문입니다.
다음과 같이 캐스팅하여 int로 반환할 수 있습니다.
string sql = @"
INSERT INTO [MyTable] ([Stuff]) VALUES (@Stuff);
SELECT CAST(SCOPE_IDENTITY() AS INT)";
int id = connection.Query<int>(sql, new { Stuff = mystuff}).Single();
SQL 2000에 대해 작업하고 있기 때문인지 모르겠지만, 작동시키기 위해 이렇게 해야 했습니다.
string sql = "DECLARE @ID int; " +
"INSERT INTO [MyTable] ([Stuff]) VALUES (@Stuff); " +
"SET @ID = SCOPE_IDENTITY(); " +
"SELECT @ID";
var id = connection.Query<int>(sql, new { Stuff = mystuff}).Single();
당신의 삶을 더 편하게 해줄 훌륭한 도서관이 있습니다.기고하다.내선번호이 내용을 포함하면 다음과 같이 쓸 수 있습니다.
public int Add(Transaction transaction)
{
using (IDbConnection db = Connection)
{
return (int)db.Insert(transaction);
}
}
postgres 12.3에서 .net core 3.1을 사용하고 있었습니다.Tadija Bagarich의 답변을 바탕으로 나는 다음과 같은 결론을 내렸다.
using (var connection = new NpgsqlConnection(AppConfig.CommentFilesConnection))
{
string insertUserSql = @"INSERT INTO mytable(comment_id,filename,content)
VALUES( @commentId, @filename, @content) returning id;";
int newUserId = connection.QuerySingle<int>(
insertUserSql,
new
{
commentId = 1,
filename = "foobar!",
content = "content"
}
);
}
여기서 AppConfig는 단순히 내 연결 세부사항에 대한 문자열 세트를 가져오는 나만의 클래스입니다.이것은 Startup.cs Configure Services 메서드로 설정됩니다.
sql server에 대한 답변이 있습니다.이것은 트랜잭션을 사용하는 MySql에 대한 답변입니다.
Dim sql As String = "INSERT INTO Empleado (nombres, apepaterno, apematerno, direccion, colonia, cp, municipio, estado, tel, cel, correo, idrol, relojchecadorid, relojchecadorid2, `activo`,`extras`,`rfc`,`nss`,`curp`,`imagen`,sueldoXHra, IMSSCotiza, thumb) VALUES (@nombres, @apepaterno, @apematerno, @direccion, @colonia, @cp, @municipio, @estado, @tel, @cel, @correo, @idrol, @relojchecadorid, @relojchecadorid2, @activo, @extras, @rfc, @nss, @curp, @imagen,@sueldoXHra,@IMSSCotiza, @thumb)"
Using connection As IDbConnection = New MySqlConnection(getConnectionString())
connection.Open()
Using transaction = connection.BeginTransaction
Dim res = connection.Execute(sql, New With {reg.nombres, reg.apepaterno, reg.apematerno, reg.direccion, reg.colonia, reg.cp, reg.municipio, reg.estado, reg.tel, reg.cel, reg.correo, reg.idrol, reg.relojchecadorid, reg.relojchecadorid2, reg.activo, reg.extras, reg.rfc, reg.nss, reg.curp, reg.imagen, reg.thumb, reg.sueldoXHra, reg.IMSSCotiza}, commandTimeout:=180, transaction:=transaction)
lastInsertedId = connection.ExecuteScalar("SELECT LAST_INSERT_ID();", transaction:=transaction)
If res > 0 Then
transaction.Commit()
return true
end if
End Using
End Using
대퍼를 쓰고 있다면.심플 저장:
//no safety checks
public static int Create<T>(object param)
{
using (SqlConnection conn = new SqlConnection(GetConnectionString()))
{
conn.Open();
conn.Create<T>((T)param);
return (int) (((T)param).GetType().GetProperties().Where(
x => x.CustomAttributes.Where(
y=>y.AttributeType.GetType() == typeof(Dapper.SimpleSave.PrimaryKeyAttribute).GetType()).Count()==1).First().GetValue(param));
}
}
언급URL : https://stackoverflow.com/questions/8270205/how-do-i-perform-an-insert-and-return-inserted-identity-with-dapper
'programing' 카테고리의 다른 글
| EF Code First의 계산된 열 (0) | 2023.04.12 |
|---|---|
| UNION [ALL]에서 SELECT INTO 조항을 사용할 수 있습니까? (0) | 2023.04.07 |
| 열 변경, 기본 제약 조건 추가 (0) | 2023.04.07 |
| LIKE 필터에 밑줄 문자를 사용하면 모든 결과가 나타나는 이유는 무엇입니까? (0) | 2023.04.07 |
| 외부 키 제약 조건이 테이블을 참조하고 있으므로 테이블을 잘라낼 수 없습니까? (0) | 2023.04.07 |