Bagaimana cara saya melakukan penyisipan ke basis data dan mengembalikan identitas yang disisipkan dengan Dapper?
Saya sudah mencoba sesuatu seperti ini:
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();
Tapi itu tidak berhasil.
@Marc Gravell terima kasih, untuk balasan. Saya sudah mencoba solusi Anda tetapi, jejak pengecualian masih sama di bawah ini
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
c#
sql-server
dapper
ppiotrowicz
sumber
sumber
numeric
, eh? Mungkin menggunakan kode asli Anda danselect @id
? (ini hanya menambah gips). Saya akan membuat catatan untuk memastikan ini berfungsi secara otomatis di build necis masa depan. Pilihan lain untuk saat ini adalahselect cast(SCOPE_IDENTITY() as int)
- sekali lagi, agak jelek. Saya akan memperbaikinya.scope_identity
tipe pengembalian adalahnumeric(38,0)
. +1 temuan yang sangat bagus. Tidak pernah benar-benar dan saya yakin saya bukan satu-satunya.Query<foo>
bahwa nilai sisipan kemudian memilih * di mana id = SCOPE_IDENTITY ().Query
.Query
dan mendapatkan nilai pertama dari koleksi yang dikembalikan, saya pikirExecuteScalar<T>
lebih masuk akal dalam kasus ini karena paling banyak satu nilai biasanya dikembalikan.KB: 2019779 , "Anda mungkin menerima nilai yang salah saat menggunakan SCOPE_IDENTITY () dan @@ IDENTITY", klausa OUTPUT adalah mekanisme paling aman:
sumber
An enumerable sequence of parameters (arrays, lists, etc) is not allowed in this context
Jawaban yang terlambat, tetapi di sini ada alternatif untuk
SCOPE_IDENTITY()
jawaban yang akhirnya kami gunakan: OUTPUT INSERTEDHanya kembalikan ID objek yang disisipkan:
Ini memungkinkan Anda untuk mendapatkan semua atau beberapa atribut dari baris yang dimasukkan:
Kembalikan objek yang dimasukkan dengan ID:
Jika mau, Anda bisa mendapatkan
Phone
danEmail
atau bahkan seluruh baris yang disisipkan:Juga, dengan ini Anda dapat mengembalikan data dari baris yang dihapus atau diperbarui . Berhati-hatilah jika Anda menggunakan pemicu karena:
Lebih lanjut tentang itu di docs: link
sumber
InvalidCastException yang Anda dapatkan adalah karena SCOPE_IDENTITY menjadi Desimal (38,0) .
Anda dapat mengembalikannya sebagai int dengan melemparkannya sebagai berikut:
sumber
Tidak yakin apakah itu karena saya bekerja melawan SQL 2000 atau tidak, tetapi saya harus melakukan ini untuk membuatnya berfungsi.
sumber
select cast(SCOPE_IDENTITY() as int)
?Ada perpustakaan yang bagus untuk membuat hidup Anda lebih mudah Dapper.Contrib.Extensions. Setelah memasukkan ini, Anda cukup menulis:
sumber
Jika Anda menggunakan Dapper.SimpleSave:
sumber