Mengambil nilai identitas atau nomor otomatis
Berlaku untuk: .NET Framework .NET .NET Standard
Kunci primer dalam database relasional adalah kolom atau kombinasi kolom yang selalu berisi nilai unik. Mengetahui nilai kunci primer memungkinkan Anda menemukan baris yang berisinya. Mesin database relasional, seperti SQL Server, Oracle, dan Microsoft Access/Jet mendukung pembuatan kolom yang bertahap secara otomatis yang dapat ditetapkan sebagai kunci primer. Nilai-nilai ini dihasilkan oleh server saat baris ditambahkan ke tabel. Di SQL Server, Anda mengatur properti identitas kolom, di Oracle Anda membuat Urutan, dan di Microsoft Access Anda membuat kolom AutoNumber.
DataColumn juga dapat digunakan untuk menghasilkan nilai yang bertambah secara otomatis dengan mengatur properti AutoIncrement ke true. Namun, Anda mungkin berakhir dengan nilai duplikat dalam instans terpisah dari DataTable, jika beberapa aplikasi klien secara independen menghasilkan nilai yang bertahap secara otomatis. Meminta server menghasilkan nilai yang bertambah secara otomatis menghilangkan potensi konflik dengan memungkinkan setiap pengguna untuk mengambil nilai yang dihasilkan untuk setiap baris yang disisipkan.
Selama panggilan ke metode Update
dari DataAdapter
, database dapat mengirim data kembali ke aplikasi ADO.NET Anda sebagai parameter output atau sebagai rekaman pertama yang dikembalikan dari kumpulan hasil pernyataan SELECT yang dijalankan dalam batch yang sama dengan pernyataan INSERT. Penyedia Data Microsoft SqlClient untuk SQL Server dapat mengambil nilai-nilai ini dan memperbarui kolom terkait dalam yang DataRow sedang diperbarui.
Catatan
Alternatif untuk menggunakan nilai penambahan otomatis adalah menggunakan metode NewGuid objek Guid untuk menghasilkan GUID, atau pengidentifikasi unik global, pada komputer klien yang dapat disalin ke server saat setiap baris baru dimasukkan. Metode NewGuid
ini menghasilkan nilai biner 16 byte yang dibuat menggunakan algoritma yang memberikan probabilitas tinggi bahwa tidak ada nilai yang akan diduplikasi. Dalam database SQL Server, GUID disimpan dalam kolom uniqueidentifier
yang mana dapat dihasilkan SQL Server secara otomatis menggunakan fungsi Transact-SQLNEWID()
. Menggunakan GUID sebagai kunci primer dapat berdampak buruk pada performa. SQL Server menyediakan dukungan untuk fungsi NEWSEQUENTIALID()
, yang menghasilkan GUID berurutan yang tidak dijamin unik secara global tetapi dapat diindeks lebih efisien.
Mengambil nilai kolom identitas SQL Server
Saat bekerja dengan Microsoft SQL Server, Anda dapat membuat prosedur tersimpan dengan parameter output untuk mengembalikan nilai identitas untuk baris yang disisipkan. Tabel berikut ini menjelaskan tiga fungsi SQL Transact dalam SQL Server yang dapat digunakan untuk mengambil nilai kolom identitas.
Fungsi | Deskripsi |
---|---|
SCOPE_IDENTITY | Mengembalikan nilai identitas terakhir dalam cakupan eksekusi saat ini. SCOPE_IDENTITY direkomendasikan untuk sebagian besar skenario. |
@@IDENTITY | Berisi nilai identitas terakhir yang dihasilkan dalam tabel apa pun dalam sesi saat ini. @@IDENTITY dapat dipengaruhi oleh pemicu dan mungkin tidak mengembalikan nilai identitas yang Anda harapkan. |
IDENT_CURRENT | Mengembalikan nilai identitas terakhir yang dihasilkan untuk tabel tertentu dalam sesi apa pun dan cakupan apa pun. |
Prosedur tersimpan berikut menunjukkan cara menyisipkan baris ke dalam tabel Kategori dan menggunakan parameter output untuk mengembalikan nilai identitas baru yang dihasilkan oleh fungsi Transact-SQL SCOPE_IDENTITY().
CREATE PROCEDURE dbo.InsertCategory
@CategoryName nvarchar(15),
@Identity int OUT
AS
INSERT INTO Categories (CategoryName) VALUES(@CategoryName)
SET @Identity = SCOPE_IDENTITY()
Prosedur tersimpan kemudian dapat ditentukan sebagai sumber InsertCommand objek SqlDataAdapter. Properti CommandType dari InsertCommand harus diatur ke StoredProcedure. Output identitas diambil dengan membuat SqlParameter yang memiliki ParameterDirection dari Output. Ketika InsertCommand
diproses, nilai identitas bertahap otomatis dikembalikan dan ditempatkan di kolom CategoryID baris saat ini jika Anda mengatur properti UpdatedRowSource dari perintah sisipkan ke UpdateRowSource.OutputParameters
atau ke UpdateRowSource.Both
.
Jika perintah sisipkan Anda menjalankan batch yang menyertakan pernyataan INSERT dan pernyataan SELECT yang mengembalikan nilai identitas baru, maka Anda dapat mengambil nilai baru dengan mengatur properti UpdatedRowSource
dari perintah sisipkan ke UpdateRowSource.FirstReturnedRecord
.
private static void RetrieveIdentity(string connectionString)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
// Create a SqlDataAdapter based on a SELECT query.
SqlDataAdapter adapter = new SqlDataAdapter(
"SELECT CategoryID, CategoryName FROM dbo.Categories",
connection);
//Create the SqlCommand to execute the stored procedure.
adapter.InsertCommand = new SqlCommand("dbo.InsertCategory",
connection);
adapter.InsertCommand.CommandType = CommandType.StoredProcedure;
// Add the parameter for the CategoryName. Specifying the
// ParameterDirection for an input parameter is not required.
adapter.InsertCommand.Parameters.Add(
new SqlParameter("@CategoryName", SqlDbType.NVarChar, 15,
"CategoryName"));
// Add the SqlParameter to retrieve the new identity value.
// Specify the ParameterDirection as Output.
SqlParameter parameter =
adapter.InsertCommand.Parameters.Add(
"@Identity", SqlDbType.Int, 0, "CategoryID");
parameter.Direction = ParameterDirection.Output;
// Create a DataTable and fill it.
DataTable categories = new DataTable();
adapter.Fill(categories);
// Add a new row.
DataRow newRow = categories.NewRow();
newRow["CategoryName"] = "New Category";
categories.Rows.Add(newRow);
adapter.Update(categories);
Console.WriteLine("List All Rows:");
foreach (DataRow row in categories.Rows)
{
{
Console.WriteLine("{0}: {1}", row[0], row[1]);
}
}
}
}
Menggabungkan nilai identitas baru
Skenario umum adalah memanggil metode GetChanges
untuk DataTable
membuat salinan yang hanya berisi baris yang diubah, dan untuk menggunakan salinan baru saat memanggil metode Update
dari DataAdapter
. Ini sangat berguna ketika Anda perlu menyusun baris yang diubah ke komponen terpisah yang melakukan pembaruan. Setelah pembaruan, salinan dapat berisi nilai identitas baru yang kemudian harus digabungkan kembali ke aslinya DataTable
. Nilai identitas baru kemungkinan berbeda dari nilai asli di DataTable
. Untuk mencapai penggabungan, nilai asli kolom AutoIncrement dalam salinan harus dipertahankan, agar dapat menemukan dan memperbarui baris yang ada di asli DataTable
, daripada menambahkan baris baru yang berisi nilai identitas baru. Namun, secara default nilai asli tersebut hilang setelah panggilan ke metodeUpdate
dari DataAdapter
, karena AcceptChanges
secara implisit dipanggil untuk setiap DataRow
yang diperbarui.
Ada dua cara untuk mempertahankan nilai asli dari DataColumn
dalam DataRow
selama pembaruan DataAdapter
:
Metode pertama untuk mempertahankan nilai asli adalah mengatur properti
AcceptChangesDuringUpdate
dariDataAdapter
kefalse
. Konfigurasi ini memengaruhi setiapDataRow
dalam yangDataTable
diperbarui. Untuk informasi selengkapnya dan contoh kode, lihat AcceptChangesDuringUpdate.Metode kedua adalah menulis kode di penanganan aktivitas
RowUpdated
dariDataAdapter
untuk mengatur ke Status hingga SkipCurrentRow.DataRow
diperbarui tetapi nilai asli masing-masingDataColumn
dipertahankan. Metode ini memungkinkan Anda mempertahankan nilai asli untuk beberapa baris dan bukan untuk yang lain. Misalnya, kode Anda dapat mempertahankan nilai asli untuk baris yang ditambahkan dan bukan untuk baris yang diedit atau dihapus dengan terlebih dahulu memeriksa StatementType lalu mengatur Status ke SkipCurrentRow hanya untuk baris denganStatementType
dariInsert
.
Ketika salah satu metode ini digunakan untuk mempertahankan nilai asli dalam DataRow
selama DataAdapter
pembaruan, Adaptor Data Microsoft SqlClient untuk SQL Server melakukan serangkaian tindakan untuk mengatur nilai saat ini dari DataRow
ke nilai baru yang dikembalikan oleh parameter output atau oleh baris pertama yang dikembalikan dari kumpulan hasil, sambil tetap mempertahankan nilai asli di masing-masing DataColumn
. Pertama, metode AcceptChanges
dari DataRow
dipanggil untuk mempertahankan nilai saat ini sebagai nilai asli, lalu nilai baru ditetapkan. Mengikuti tindakan ini, DataRows
yang properti RowState-nya diatur ke Added akan mengatur properti mereka RowState
ke Modified, yang mungkin tidak terduga.
Bagaimana hasil perintah diterapkan ke setiap DataRow yang diperbarui ditentukan oleh properti UpdatedRowSource dari masing-masing DbCommand. Properti ini diatur ke nilai dari enumerasi UpdateRowSource
.
Tabel berikut ini menjelaskan bagaimana nilai enumerasi UpdateRowSource
memengaruhi properti RowState di baris yang diperbarui.
Nama anggota | Deskripsi |
---|---|
Both | AcceptChanges dipanggil dan nilai parameter output dan/atau nilai di baris pertama dari setiap tataan hasil yang dikembalikan ditempatkan dalam yang DataRow sedang diperbarui. Jika tidak ada nilai yang akan diterapkan, RowState akan menjadi Unchanged. |
FirstReturnedRecord | Jika baris dikembalikan, AcceptChanges dipanggil dan baris dipetakan ke baris yang diubah di DataTable , mengatur RowState ke Modified . Jika tidak ada baris yang dikembalikan, maka AcceptChanges tidak dipanggil dan RowState tetap Added . |
None | Parameter atau baris yang dikembalikan diabaikan. Tidak ada panggilan ke AcceptChanges dan RowState tetap Added . |
OutputParameters | AcceptChanges dipanggil dan parameter output apa pun dipetakan ke baris yang diubah di DataTable , mengatur RowState ke Modified . Jika tidak ada parameter output, RowState akan menjadi Unchanged . |
Contoh
Contoh ini menunjukkan mengekstrak baris yang diubah dari DataTable
dan menggunakan SqlDataAdapter untuk memperbarui sumber data dan mengambil nilai kolom identitas baru. InsertCommand menjalankan dua pernyataan transact-SQL; yang pertama adalah pernyataan INSERT, dan yang kedua adalah pernyataan SELECT yang menggunakan fungsi SCOPE_IDENTITY untuk mengambil nilai identitas.
INSERT INTO dbo.Shippers (CompanyName)
VALUES (@CompanyName);
SELECT ShipperID, CompanyName FROM dbo.Shippers
WHERE ShipperID = SCOPE_IDENTITY();
Properti UpdatedRowSource
perintah sisipkan diatur ke UpdateRowSource.FirstReturnedRow
dan properti MissingSchemaAction dari DataAdapter
diatur ke MissingSchemaAction.AddWithKey
. DataTable
diisi dan kode menambahkan baris baru ke DataTable
. Baris yang diubah kemudian diekstrak ke dalam DataTable
yang baru, yang diteruskan ke DataAdapter
, yang kemudian memperbarui server.
private static void MergeIdentityColumns(string connectionString)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
// Create the DataAdapter
SqlDataAdapter adapter = new SqlDataAdapter(
"SELECT ShipperID, CompanyName FROM dbo.Shippers",
connection);
//Add the InsertCommand to retrieve new identity value.
adapter.InsertCommand = new SqlCommand(
"INSERT INTO dbo.Shippers (CompanyName) " +
"VALUES (@CompanyName); " +
"SELECT ShipperID, CompanyName FROM dbo.Shippers " +
"WHERE ShipperID = SCOPE_IDENTITY();", connection);
// Add the parameter for the inserted value.
adapter.InsertCommand.Parameters.Add(
new SqlParameter("@CompanyName", SqlDbType.NVarChar, 40,
"CompanyName"));
adapter.InsertCommand.UpdatedRowSource = UpdateRowSource.Both;
// MissingSchemaAction adds any missing schema to
// the DataTable, including identity columns
adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
// Fill the DataTable.
DataTable shipper = new DataTable();
adapter.Fill(shipper);
// Add a new shipper.
DataRow newRow = shipper.NewRow();
newRow["CompanyName"] = "New Shipper";
shipper.Rows.Add(newRow);
// Add changed rows to a new DataTable. This
// DataTable will be used by the DataAdapter.
DataTable dataChanges = shipper.GetChanges();
// Add the event handler.
adapter.RowUpdated +=
new SqlRowUpdatedEventHandler(OnRowUpdated);
adapter.Update(dataChanges);
connection.Close();
// Merge the updates.
shipper.Merge(dataChanges);
// Commit the changes.
shipper.AcceptChanges();
Console.WriteLine("Rows after merge.");
foreach (DataRow row in shipper.Rows)
{
{
Console.WriteLine("{0}: {1}", row[0], row[1]);
}
}
}
}
Penanganan aktivitas OnRowUpdated
memeriksa StatementType dari SqlRowUpdatedEventArgs untuk menentukan apakah baris tersebut adalah sisipan. Jika ya, maka properti Status diatur ke SkipCurrentRow. Baris diperbarui, tetapi nilai asli dalam baris dipertahankan. Dalam isi utama prosedur, metode Merge ini dipanggil untuk menggabungkan nilai identitas baru ke dalam aslinya DataTable
, dan akhirnya AcceptChanges
dipanggil.
protected static void OnRowUpdated(
object sender, SqlRowUpdatedEventArgs e)
{
// If this is an insert, then skip this row.
if (e.StatementType == StatementType.Insert)
{
e.Status = UpdateStatus.SkipCurrentRow;
}
}
Mengambil nilai identitas
Kami sering mengatur kolom sebagai identitas ketika nilai dalam kolom harus unik. Dan terkadang kita membutuhkan nilai identitas data baru. Sampel ini menunjukkan cara mengambil nilai identitas:
Membuat prosedur tersimpan untuk menyisipkan data dan mengembalikan nilai identitas.
Menjalankan perintah untuk menyisipkan data baru dan menampilkan hasilnya.
Menggunakan SqlDataAdapter untuk menyisipkan data baru dan menampilkan hasilnya.
Sebelum mengkompilasi dan menjalankan sampel, Anda harus membuat database sampel, menggunakan skrip berikut:
USE [master]
GO
CREATE DATABASE [MySchool]
GO
USE [MySchool]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE procedure [dbo].[CourseExtInfo] @CourseId int
as
select c.CourseID,c.Title,c.Credits,d.Name as DepartmentName
from Course as c left outer join Department as d on c.DepartmentID=d.DepartmentID
where c.CourseID=@CourseId
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
create procedure [dbo].[DepartmentInfo] @DepartmentId int,@CourseCount int output
as
select @CourseCount=Count(c.CourseID)
from course as c
where c.DepartmentID=@DepartmentId
select d.DepartmentID,d.Name,d.Budget,d.StartDate,d.Administrator
from Department as d
where d.DepartmentID=@DepartmentId
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
Create PROCEDURE [dbo].[GetDepartmentsOfSpecifiedYear]
@Year int,@BudgetSum money output
AS
BEGIN
SELECT @BudgetSum=SUM([Budget])
FROM [MySchool].[dbo].[Department]
Where YEAR([StartDate])=@Year
SELECT [DepartmentID]
,[Name]
,[Budget]
,[StartDate]
,[Administrator]
FROM [MySchool].[dbo].[Department]
Where YEAR([StartDate])=@Year
END
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[GradeOfStudent]
-- Add the parameters for the stored procedure here
@CourseTitle nvarchar(100),@FirstName nvarchar(50),
@LastName nvarchar(50),@Grade decimal(3,2) output
AS
BEGIN
select @Grade=Max(Grade)
from [dbo].[StudentGrade] as s join [dbo].[Course] as c on
s.CourseID=c.CourseID join [dbo].[Person] as p on s.StudentID=p.PersonID
where c.Title=@CourseTitle and p.FirstName=@FirstName
and p.LastName= @LastName
END
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[InsertPerson]
-- Add the parameters for the stored procedure here
@FirstName nvarchar(50),@LastName nvarchar(50),
@PersonID int output
AS
BEGIN
insert [dbo].[Person](LastName,FirstName) Values(@LastName,@FirstName)
set @PersonID=SCOPE_IDENTITY()
END
Go
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Course]([CourseID] [nvarchar](10) NOT NULL,
[Year] [smallint] NOT NULL,
[Title] [nvarchar](100) NOT NULL,
[Credits] [int] NOT NULL,
[DepartmentID] [int] NOT NULL,
CONSTRAINT [PK_Course] PRIMARY KEY CLUSTERED
(
[CourseID] ASC,
[Year] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Department]([DepartmentID] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](50) NOT NULL,
[Budget] [money] NOT NULL,
[StartDate] [datetime] NOT NULL,
[Administrator] [int] NULL,
CONSTRAINT [PK_Department] PRIMARY KEY CLUSTERED
(
[DepartmentID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Person]([PersonID] [int] IDENTITY(1,1) NOT NULL,
[LastName] [nvarchar](50) NOT NULL,
[FirstName] [nvarchar](50) NOT NULL,
[HireDate] [datetime] NULL,
[EnrollmentDate] [datetime] NULL,
[Picture] [varbinary](max) NULL,
CONSTRAINT [PK_School.Student] PRIMARY KEY CLUSTERED
(
[PersonID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[StudentGrade]([EnrollmentID] [int] IDENTITY(1,1) NOT NULL,
[CourseID] [nvarchar](10) NOT NULL,
[StudentID] [int] NOT NULL,
[Grade] [decimal](3, 2) NOT NULL,
CONSTRAINT [PK_StudentGrade] PRIMARY KEY CLUSTERED
(
[EnrollmentID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
create view [dbo].[EnglishCourse]
as
select c.CourseID,c.Title,c.Credits,c.DepartmentID
from Course as c join Department as d on c.DepartmentID=d.DepartmentID
where d.Name=N'English'
GO
INSERT [dbo].[Course] ([CourseID], [Year], [Title], [Credits], [DepartmentID]) VALUES (N'C1045', 2012, N'Calculus', 4, 7)
INSERT [dbo].[Course] ([CourseID], [Year], [Title], [Credits], [DepartmentID]) VALUES (N'C1061', 2012, N'Physics', 4, 1)
INSERT [dbo].[Course] ([CourseID], [Year], [Title], [Credits], [DepartmentID]) VALUES (N'C2021', 2012, N'Composition', 3, 2)
INSERT [dbo].[Course] ([CourseID], [Year], [Title], [Credits], [DepartmentID]) VALUES (N'C2042', 2012, N'Literature', 4, 2)
SET IDENTITY_INSERT [dbo].[Department] ON
INSERT [dbo].[Department] ([DepartmentID], [Name], [Budget], [StartDate], [Administrator]) VALUES (1, N'Engineering', 350000.0000, CAST(0x0000999C00000000 AS DateTime), 2)
INSERT [dbo].[Department] ([DepartmentID], [Name], [Budget], [StartDate], [Administrator]) VALUES (2, N'English', 120000.0000, CAST(0x0000999C00000000 AS DateTime), 6)
INSERT [dbo].[Department] ([DepartmentID], [Name], [Budget], [StartDate], [Administrator]) VALUES (4, N'Economics', 200000.0000, CAST(0x0000999C00000000 AS DateTime), 4)
INSERT [dbo].[Department] ([DepartmentID], [Name], [Budget], [StartDate], [Administrator]) VALUES (7, N'Mathematics', 250024.0000, CAST(0x0000999C00000000 AS DateTime), 3)
SET IDENTITY_INSERT [dbo].[Department] OFF
SET IDENTITY_INSERT [dbo].[Person] ON
INSERT [dbo].[Person] ([PersonID], [LastName], [FirstName], [HireDate], [EnrollmentDate]) VALUES (1, N'Hu', N'Nan', NULL, CAST(0x0000A0BF00000000 AS DateTime))
INSERT [dbo].[Person] ([PersonID], [LastName], [FirstName], [HireDate], [EnrollmentDate]) VALUES (2, N'Norman', N'Laura', NULL, CAST(0x0000A0BF00000000 AS DateTime))
INSERT [dbo].[Person] ([PersonID], [LastName], [FirstName], [HireDate], [EnrollmentDate]) VALUES (3, N'Olivotto', N'Nino', NULL, CAST(0x0000A0BF00000000 AS DateTime))
INSERT [dbo].[Person] ([PersonID], [LastName], [FirstName], [HireDate], [EnrollmentDate]) VALUES (4, N'Anand', N'Arturo', NULL, CAST(0x0000A0BF00000000 AS DateTime))
INSERT [dbo].[Person] ([PersonID], [LastName], [FirstName], [HireDate], [EnrollmentDate]) VALUES (5, N'Jai', N'Damien', NULL, CAST(0x0000A0BF00000000 AS DateTime))
INSERT [dbo].[Person] ([PersonID], [LastName], [FirstName], [HireDate], [EnrollmentDate]) VALUES (6, N'Holt', N'Roger', CAST(0x000097F100000000 AS DateTime), NULL)
INSERT [dbo].[Person] ([PersonID], [LastName], [FirstName], [HireDate], [EnrollmentDate]) VALUES (7, N'Martin', N'Randall', CAST(0x00008B1A00000000 AS DateTime), NULL)
SET IDENTITY_INSERT [dbo].[Person] OFF
SET IDENTITY_INSERT [dbo].[StudentGrade] ON
INSERT [dbo].[StudentGrade] ([EnrollmentID], [CourseID], [StudentID], [Grade]) VALUES (1, N'C1045', 1, CAST(3.50 AS Decimal(3, 2)))
INSERT [dbo].[StudentGrade] ([EnrollmentID], [CourseID], [StudentID], [Grade]) VALUES (2, N'C1045', 2, CAST(3.00 AS Decimal(3, 2)))
INSERT [dbo].[StudentGrade] ([EnrollmentID], [CourseID], [StudentID], [Grade]) VALUES (3, N'C1045', 3, CAST(2.50 AS Decimal(3, 2)))
INSERT [dbo].[StudentGrade] ([EnrollmentID], [CourseID], [StudentID], [Grade]) VALUES (4, N'C1045', 4, CAST(4.00 AS Decimal(3, 2)))
INSERT [dbo].[StudentGrade] ([EnrollmentID], [CourseID], [StudentID], [Grade]) VALUES (5, N'C1045', 5, CAST(3.50 AS Decimal(3, 2)))
INSERT [dbo].[StudentGrade] ([EnrollmentID], [CourseID], [StudentID], [Grade]) VALUES (6, N'C1061', 1, CAST(4.00 AS Decimal(3, 2)))
INSERT [dbo].[StudentGrade] ([EnrollmentID], [CourseID], [StudentID], [Grade]) VALUES (7, N'C1061', 3, CAST(3.50 AS Decimal(3, 2)))
INSERT [dbo].[StudentGrade] ([EnrollmentID], [CourseID], [StudentID], [Grade]) VALUES (8, N'C1061', 4, CAST(2.50 AS Decimal(3, 2)))
INSERT [dbo].[StudentGrade] ([EnrollmentID], [CourseID], [StudentID], [Grade]) VALUES (9, N'C1061', 5, CAST(1.50 AS Decimal(3, 2)))
INSERT [dbo].[StudentGrade] ([EnrollmentID], [CourseID], [StudentID], [Grade]) VALUES (10, N'C2021', 1, CAST(2.50 AS Decimal(3, 2)))
INSERT [dbo].[StudentGrade] ([EnrollmentID], [CourseID], [StudentID], [Grade]) VALUES (11, N'C2021', 2, CAST(3.50 AS Decimal(3, 2)))
INSERT [dbo].[StudentGrade] ([EnrollmentID], [CourseID], [StudentID], [Grade]) VALUES (12, N'C2021', 4, CAST(3.00 AS Decimal(3, 2)))
INSERT [dbo].[StudentGrade] ([EnrollmentID], [CourseID], [StudentID], [Grade]) VALUES (13, N'C2021', 5, CAST(3.00 AS Decimal(3, 2)))
INSERT [dbo].[StudentGrade] ([EnrollmentID], [CourseID], [StudentID], [Grade]) VALUES (14, N'C2042', 1, CAST(2.00 AS Decimal(3, 2)))
INSERT [dbo].[StudentGrade] ([EnrollmentID], [CourseID], [StudentID], [Grade]) VALUES (15, N'C2042', 2, CAST(3.50 AS Decimal(3, 2)))
INSERT [dbo].[StudentGrade] ([EnrollmentID], [CourseID], [StudentID], [Grade]) VALUES (16, N'C2042', 3, CAST(4.00 AS Decimal(3, 2)))
INSERT [dbo].[StudentGrade] ([EnrollmentID], [CourseID], [StudentID], [Grade]) VALUES (17, N'C2042', 5, CAST(3.00 AS Decimal(3, 2)))
SET IDENTITY_INSERT [dbo].[StudentGrade] OFF
ALTER TABLE [dbo].[Course] WITH CHECK ADD CONSTRAINT [FK_Course_Department] FOREIGN KEY([DepartmentID])
REFERENCES [dbo].[Department] ([DepartmentID])
GO
ALTER TABLE [dbo].[Course] CHECK CONSTRAINT [FK_Course_Department]
GO
ALTER TABLE [dbo].[StudentGrade] WITH CHECK ADD CONSTRAINT [FK_StudentGrade_Student] FOREIGN KEY([StudentID])
REFERENCES [dbo].[Person] ([PersonID])
GO
ALTER TABLE [dbo].[StudentGrade] CHECK CONSTRAINT [FK_StudentGrade_Student]
GO
Daftar kode mengikuti:
static void Main(string[] args)
{
String SqlDbConnectionString = "Data Source=(local);Initial Catalog=MySchool;Integrated Security=True;";
InsertPersonInCommand(SqlDbConnectionString, "Janice", "Galvin");
Console.WriteLine();
InsertPersonInAdapter(SqlDbConnectionString, "Peter", "Krebs");
Console.WriteLine();
Console.WriteLine("Please press any key to exit.....");
Console.ReadKey();
}
// Using stored procedure to insert a new row and retrieve the identity value
static void InsertPersonInCommand(String connectionString, String firstName, String lastName)
{
String commandText = "dbo.InsertPerson";
using (SqlConnection conn = new SqlConnection(connectionString))
{
using (SqlCommand cmd = new SqlCommand(commandText, conn))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@FirstName", firstName));
cmd.Parameters.Add(new SqlParameter("@LastName", lastName));
SqlParameter personId = new SqlParameter("@PersonID", SqlDbType.Int);
personId.Direction = ParameterDirection.Output;
cmd.Parameters.Add(personId);
conn.Open();
cmd.ExecuteNonQuery();
Console.WriteLine("Person Id of new person:{0}", personId.Value);
}
}
}
// Using stored procedure in adapter to insert new rows and update the identity value.
static void InsertPersonInAdapter(String connectionString, String firstName, String lastName)
{
String commandText = "dbo.InsertPerson";
using (SqlConnection conn = new SqlConnection(connectionString))
{
SqlDataAdapter mySchool = new SqlDataAdapter("Select PersonID,FirstName,LastName from [dbo].[Person]", conn);
mySchool.InsertCommand = new SqlCommand(commandText, conn);
mySchool.InsertCommand.CommandType = CommandType.StoredProcedure;
mySchool.InsertCommand.Parameters.Add(
new SqlParameter("@FirstName", SqlDbType.NVarChar, 50, "FirstName"));
mySchool.InsertCommand.Parameters.Add(
new SqlParameter("@LastName", SqlDbType.NVarChar, 50, "LastName"));
SqlParameter personId = mySchool.InsertCommand.Parameters.Add(new SqlParameter("@PersonID", SqlDbType.Int, 0, "PersonID"));
personId.Direction = ParameterDirection.Output;
DataTable persons = new DataTable();
mySchool.Fill(persons);
DataRow newPerson = persons.NewRow();
newPerson["FirstName"] = firstName;
newPerson["LastName"] = lastName;
persons.Rows.Add(newPerson);
mySchool.Update(persons);
Console.WriteLine("Show all persons:");
ShowDataTable(persons, 14);
}
}
private static void ShowDataTable(DataTable table, Int32 length)
{
foreach (DataColumn col in table.Columns)
{
Console.Write("{0,-" + length + "}", col.ColumnName);
}
Console.WriteLine();
foreach (DataRow row in table.Rows)
{
foreach (DataColumn col in table.Columns)
{
if (col.DataType.Equals(typeof(DateTime)))
Console.Write("{0,-" + length + ":d}", row[col]);
else if (col.DataType.Equals(typeof(Decimal)))
Console.Write("{0,-" + length + ":C}", row[col]);
else
Console.Write("{0,-" + length + "}", row[col]);
}
Console.WriteLine();
}
}