Menggunakan parameter output prosedur tersimpan dalam C#
Soalan
Mengembalikan parameter output daripada prosedur disimpan SQL Server ke dalam pembolehubah C# boleh mencabar. Walaupun mengikut pelbagai cadangan, banyak pembangun masih melaporkan nilai nol atau isu lain.
Prosedur Tersimpan
Pertimbangkan prosedur tersimpan berikut usp_InsertContract
, yang direka untuk memasukkan nombor kontrak ke dalam pangkalan data dan mengembalikan kunci utama sebagai parameter output:
<code class="language-sql">CREATE PROCEDURE usp_InsertContract @ContractNumber varchar(7), @NewId int OUTPUT AS BEGIN INSERT INTO [dbo].[Contracts] (ContractNumber) VALUES (@ContractNumber); Select @NewId = Id From [dbo].[Contracts] where ContractNumber = @ContractNumber; END</code>
Buka pangkalan data
Buka sambungan pangkalan data menggunakan kod berikut:
<code class="language-csharp">pvConnectionString = "Server = Desktop-PC\SQLEXPRESS; Database = PVDatabase; User ID = sa; PASSWORD = *******; Trusted_Connection = True;"; try { pvConnection = new SqlConnection(pvConnectionString); pvConnection.Open(); } catch (Exception e) { databaseError = true; }</code>
Laksanakan arahan
Laksanakan prosedur tersimpan menggunakan kod berikut:
<code class="language-csharp">pvCommand = new SqlCommand("usp_InsertContract", pvConnection); pvCommand.Transaction = pvTransaction; pvCommand.CommandType = CommandType.StoredProcedure; pvCommand.Parameters.Clear(); pvCommand.Parameters.Add(new SqlParameter("@ContractNumber", contractNumber)); SqlParameter pvNewId = new SqlParameter(); pvNewId.ParameterName = "@NewId"; pvNewId.DbType = DbType.Int32; pvNewId.Direction = ParameterDirection.Output; pvCommand.Parameters.Add(pvNewId); try { sqlRows = pvCommand.ExecuteNonQuery(); if (sqlRows > 0) Debug.Print("New Id Inserted = ", pvCommand.Parameters["@NewId"].Value.ToString()); } catch (Exception e) { Debug.Print("Insert Exception Type: {0}", e.GetType()); Debug.Print(" Message: {0}", e.Message); }</code>
Penyelesaian
Gunakan SCOPE_IDENTITY()
untuk mendapatkan kunci utama dan buat beberapa pengubahsuaian pada prosedur tersimpan untuk menyelesaikan masalah nilai nol:
<code class="language-sql">CREATE PROCEDURE usp_InsertContract @ContractNumber varchar(7), @NewId int OUTPUT AS BEGIN INSERT INTO [dbo].[Contracts] (ContractNumber) VALUES (@ContractNumber); SELECT @NewId = SCOPE_IDENTITY(); END</code>
Untuk menggunakan prosedur tersimpan yang diubah suai ini dalam C#, laksanakan kod berikut:
<code class="language-csharp">using(SqlConnection conn = new SqlConnection(pvConnectionString)) using(SqlCommand cmd = new SqlCommand("dbo.usp_InsertContract", conn)) { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add("@ContractNumber", SqlDbType.VarChar, 7).Value = contractNumber; cmd.Parameters.Add("@NewId", SqlDbType.Int).Direction = ParameterDirection.Output; conn.Open(); cmd.ExecuteNonQuery(); int contractID = Convert.ToInt32(cmd.Parameters["@NewId"].Value); conn.Close(); }</code>
Kod ini berjaya mendapatkan dan mencetak kunci utama yang dikembalikan daripada prosedur yang disimpan.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Berjaya Mendapatkan Parameter Output daripada Prosedur Tersimpan Pelayan SQL dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!