Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir: .NET Framework
.NET
.NET Standard
İlişkisel veritabanındaki birincil anahtar, her zaman benzersiz değerler içeren bir sütun veya sütun birleşimidir. Birincil anahtar değerini bilmek, onu içeren satırı bulmanıza olanak tanır. SQL Server, Oracle ve Microsoft Access/Jet gibi ilişkisel veritabanı altyapıları, birincil anahtar olarak belirlenebilecek otomatik olarak artan sütunların oluşturulmasını destekler. Bu değerler, tabloya satırlar eklendikçe sunucu tarafından oluşturulur. SQL Server'da bir sütunun kimlik özelliğini ayarlarsınız, Oracle'da bir Sıra oluşturursunuz ve Microsoft Access'te bir Otomatik Sayı sütunu oluşturursunuz.
özelliği DataColumn true olarak ayarlanarak AutoIncrement otomatik olarak artan değerler oluşturmak için de kullanılabilir. Ancak, birden çok istemci uygulaması bağımsız olarak değerleri otomatik olarak artırıyorsa, ayrı örneklerinde DataTableyinelenen değerler elde edebilirsiniz. Sunucunun otomatik olarak artan değerler oluşturmasını sağlamak, her kullanıcının eklenen her satır için oluşturulan değeri almasına izin vererek olası çakışmaları ortadan kaldırır.
yöntemine UpdateDataAdapteryapılan çağrı sırasında veritabanı, verileri çıkış parametreleri olarak veya INSERT deyimiyle aynı toplu işlemde yürütülen select deyiminin sonuç kümesinin ilk döndürülen kaydı olarak ADO.NET uygulamanıza geri gönderebilir. SQL Server için Microsoft SqlClient Veri Sağlayıcısı bu değerleri alabilir ve güncelleştirilmekte olan ilgili sütunları DataRow güncelleştirebilir.
Uyarı
Otomatik artırma değeri kullanmanın bir alternatifi, istemci bilgisayarda her yeni satır eklenirken sunucuya kopyalanabilir bir GUID veya genel olarak benzersiz tanımlayıcı oluşturmak için nesnenin yöntemini NewGuid kullanmaktırGuid. yöntemi, NewGuid hiçbir değerin çoğaltılmama olasılığı yüksek olan bir algoritma kullanılarak oluşturulan 16 baytlık bir ikili değer oluşturur. SQL Server veritabanında GUID, SQL Server'ın Transact-SQL uniqueidentifier işlevini kullanarak otomatik olarak oluşturabileceği bir NEWID() sütunda depolanır. Guid'nin birincil anahtar olarak kullanılması performansı olumsuz etkileyebilir. SQL Server, genel olarak benzersiz olacağı garanti edilmeyen ancak daha verimli bir şekilde dizine alınabilen sıralı bir GUID oluşturan işlev için NEWSEQUENTIALID() destek sağlar.
SQL Server kimlik sütun değerlerini alma
Microsoft SQL Server ile çalışırken, eklenen bir satırın kimlik değerini döndürmek için çıkış parametresiyle saklı yordam oluşturabilirsiniz. Aşağıdaki tabloda, SQL Server'da kimlik sütun değerlerini almak için kullanılabilecek üç Transact-SQL işlevi açıklanmaktadır.
| İşlev | Description |
|---|---|
| SCOPE_IDENTITY | Geçerli yürütme kapsamındaki son kimlik değerini döndürür. çoğu senaryo için SCOPE_IDENTITY önerilir. |
| @@IDENTITY | Geçerli oturumdaki herhangi bir tabloda oluşturulan son kimlik değerini içerir. @@IDENTITY tetikleyicilerden etkilenebilir ve beklediğiniz kimlik değerini döndürmeyebilir. |
| IDENT_CURRENT | Herhangi bir oturumdaki ve herhangi bir kapsamdaki belirli bir tablo için oluşturulan son kimlik değerini döndürür. |
Aşağıdaki saklı yordam , Kategoriler tablosuna satır eklemeyi ve Transact-SQL SCOPE_IDENTITY() işlevi tarafından oluşturulan yeni kimlik değerini döndürmek için bir çıkış parametresi kullanmayı gösterir.
CREATE PROCEDURE dbo.InsertCategory
@CategoryName nvarchar(15),
@Identity int OUT
AS
INSERT INTO Categories (CategoryName) VALUES(@CategoryName)
SET @Identity = SCOPE_IDENTITY()
Saklı yordam daha sonra bir InsertCommand nesnenin SqlDataAdapter kaynağı olarak belirtilebilir.
CommandType özelliğinin InsertCommand olarak ayarlanması StoredProceduregerekir. Kimlik çıktısı, içeren bir SqlParameterParameterDirectionOutputoluşturularak alınır.
InsertCommand işlendiğinde, otomatik olarak artırılan kimlik değeri döndürülür ve insert komutunun UpdateRowSource.OutputParameters veya UpdateRowSource.Both özelliğini ayarlarsanız, bu değer, geçerli satırın CategoryID sütununa yerleştirilir.
Insert komutunuz hem INSERT deyimini hem de yeni kimlik değerini döndüren select deyimini içeren bir toplu iş yürütürse, insert komutunun UpdatedRowSourceözelliğini olarak ayarlayarak UpdateRowSource.FirstReturnedRecord yeni değeri alabilirsiniz.
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]);
}
}
}
}
Yeni kimlik değerlerini birleştirme
Yaygın bir senaryo, yalnızca değiştirilen satırları içeren bir kopya oluşturmak ve yöntemini çağırırken yeni kopyayı kullanmak için yöntemini GetChanges çağırmaktır DataTableUpdate.DataAdapter Bu, özellikle değiştirilen satırları güncelleştirmeyi gerçekleştiren ayrı bir bileşene hazırlamanız gerektiğinde kullanışlıdır. Güncelleştirmeden sonra kopya, özgün DataTableile yeniden birleştirilmesi gereken yeni kimlik değerleri içerebilir. Yeni kimlik değerleri, içindeki özgün değerlerden DataTablefarklı olabilir. Birleştirmeyi gerçekleştirmek için, yeni kimlik değerlerini içeren yeni satırları eklemek yerine özgün içindeki mevcut satırları bulabilmek ve güncelleştirebilmek için kopyadaki DataTable sütunlarının özgün değerleri korunmalıdır. Ancak, varsayılan olarak bu özgün değerler yöntemine UpdateDataAdapteryapılan bir çağrıdan sonra kaybolur çünkü AcceptChanges her güncelleştirilen için örtük olarak çağrılır DataRow.
Güncelleştirme sırasında DataColumn içindeki özgün değerlerini korumanın DataRowDataAdapter iki yolu vardır:
Özgün değerleri korumanın ilk yöntemi özelliğini
AcceptChangesDuringUpdateDataAdapterolarak ayarlamaktırfalse. Güncellenmekte olanDataTableiçindeki herDataRow, bu yapılandırmadan etkilenir. Daha fazla bilgi ve kod örneği için bkz AcceptChangesDuringUpdate. .İkinci yöntem, öğesini olarak ayarlamak
RowUpdatediçin öğesininDataAdapterStatus olay işleyicisine kod yazmaktırSkipCurrentRow.DataRowgüncelleştirilir ancak herDataColumnbirinin özgün değeri korunur. Bu yöntem, bazı satırlar için özgün değerleri korumanızı sağlar, diğerleri için korumaz. Örneğin kodunuz, önce StatementType öğesini denetleyerek ve sonra yalnızca içeren satırlar için olarak ayarlayarak StatusSkipCurrentRow , düzenlenen veya silinen satırlar için değil, eklenen satırlarStatementTypeInsertiçin özgün değerleri koruyabilir.
Bir güncelleştirme sırasında özgün değerleri DataRow korumak için bu yöntemlerden biri kullanıldığında, SQL Server için Microsoft SqlClient Veri Bağdaştırıcısı çıkış parametreleri veya sonuç kümesinin ilk döndürülen satırı tarafından döndürülen yeni değerlere geçerli değerlerini DataAdapter ayarlamak için bir dizi eylem gerçekleştirir ve her DataRowbirinde özgün değeri DataColumn korur. İlk olarak, AcceptChanges geçerli değerleri özgün değerler olarak korumak için yöntemi DataRow çağrılır ve ardından yeni değerler atanır. Bu eylemlerin ardından, DataRowsRowState özellikleri olarak Added ayarlanmış olan özelliklere RowStatesahip Modified olacak ve bu beklenmeyen bir durum olabilir.
Komut sonuçlarının güncelleştirilmekte olan her DataRow birine nasıl uygulandığı, her UpdatedRowSourceöğesinin DbCommand özelliği tarafından belirlenir. Bu özellik, numaralandırmadan bir değere UpdateRowSource ayarlanır.
Aşağıdaki tabloda, numaralandırma değerlerinin UpdateRowSource güncelleştirilmiş satırların RowState özelliğini nasıl etkilediği açıklanmaktadır.
| Üye adı | Description |
|---|---|
| Both |
AcceptChanges çağrılır ve hem çıkış parametresi değerleri hem de/veya döndürülen sonuç kümesinin ilk satırındaki değerler güncelleştirilmekte olan değere DataRow yerleştirilir. Uygulanacak değer yoksa, RowState değeri olur Unchanged. |
| FirstReturnedRecord | Bir satır döndürüldüyse, AcceptChanges çağrılır ve satır içindeki DataTabledeğiştirilen satırla eşlenir ve olarak ayarlanır RowStateModified. Hiçbir satır döndürülmezse çağrılmaz AcceptChanges ve RowState kalır Added. |
| None | Döndürülen parametreler veya satırlar yoksayılır. öğesine çağrı AcceptChanges yapılmaz ve RowState kalır Added. |
| OutputParameters |
AcceptChanges çağrılır ve tüm çıkış parametreleri içindeki değiştirilen satıra DataTableeşlenir ve olarak ayarlanır RowStateModified. Çıkış parametresi yoksa, RowState olacaktır Unchanged. |
Example
Bu örnek, veri kaynağını güncelleştirmek ve yeni bir DataTable kimlik sütunu değeri almak için bir ve kullanarak SqlDataAdapter değiştirilen satırları ayıklamayı gösterir. iki InsertCommand Transact-SQL deyimi yürütür; birincisi INSERT deyimi, ikincisi de kimlik değerini almak için SCOPE_IDENTITY işlevini kullanan bir SELECT deyimidir.
INSERT INTO dbo.Shippers (CompanyName)
VALUES (@CompanyName);
SELECT ShipperID, CompanyName FROM dbo.Shippers
WHERE ShipperID = SCOPE_IDENTITY();
UpdatedRowSource insert komutunun özelliği olarak UpdateRowSource.FirstReturnedRowMissingSchemaAction, özelliği DataAdapter ise olarak MissingSchemaAction.AddWithKeyayarlanır.
DataTable doldurulur ve kod öğesine yeni bir satır DataTableekler. Değiştirilen satırlar yeni bir DataTableiçine ayıklanır ve bu, sunucusuna DataAdaptergeçirilir ve bu da sunucuyu güncelleştirir.
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]);
}
}
}
}
Olay OnRowUpdated işleyicisi, satırın StatementTypeSqlRowUpdatedEventArgs bir ekleme olup olmadığını belirlemek için öğesini denetler. Bu durumda özelliği Status olarak SkipCurrentRowayarlanır. Satır güncelleştirilir, ancak satırdaki özgün değerler korunur. Yordamın ana gövdesinde, Merge yeni kimlik değerini özgün DataTableile birleştirmek için yöntemi çağrılır ve son olarak AcceptChanges çağrılır.
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;
}
}
Kimlik değerlerini alma
Sütundaki değerlerin benzersiz olması gerektiğinde genellikle sütunu kimlik olarak ayarlarız. Bazen de yeni verilerin kimlik değerine ihtiyacımız olur. Bu örnek, kimlik değerlerinin nasıl alınduğunu gösterir:
Veri eklemek ve kimlik değeri döndürmek için bir saklı yordam oluşturur.
Yeni verileri eklemek ve sonucu görüntülemek için bir komut yürütür.
Yeni veri eklemek ve sonucu görüntülemek için kullanır SqlDataAdapter .
Örneği derlemeden ve çalıştırmadan önce aşağıdaki betiği kullanarak örnek veritabanını oluşturmanız gerekir:
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
Kod listesi şu şekildedir:
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();
}
}