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.
JDBC sürücüsünü indirin
Microsoft SQL Server, büyük dosyaları SQL Server veritabanlarındaki tablolara veya görünümlere hızla toplu olarak kopyalamak için adlı bcp popüler bir komut satırı yardımcı programı içerir. sınıfı, SQLServerBulkCopy Java'da benzer işlevler sağlayan kod çözümleri yazmanızı sağlar. Sql Server tablosuna veri yüklemenin başka yolları da vardır (örneğin INSERT deyimleri), ancak SQLServerBulkCopy bunlara göre önemli bir performans avantajı sunar.
SQLServerBulkCopy sınıfı yalnızca SQL Server tablolarına veri yazmak için kullanılabilir. Ancak veri kaynağı SQL Server ile sınırlı değildir; herhangi bir veri kaynağı, veriler bir ResultSet, RowSetveya ISQLServerBulkRecord uygulamasıyla okunabildiği sürece kullanılabilir.
Uyarı
ISQLServerBulkData toplu kopyalama kullanılırken veri kaynağı olarak şu anda tam olarak desteklenmemekte ve kullanıcılar bu veri kaynağı türünü kullanırken hatayla karşılaşabilir. Bunun yerine bir ResultSet, RowSetveya ISQLServerBulkRecord kullanmanız önerilir.
sınıfını SQLServerBulkCopy kullanarak şunları gerçekleştirebilirsiniz:
Tek bir toplu kopyalama işlemi
Birden çok toplu kopyalama işlemi
İşlem içeren toplu kopyalama işlemi
Uyarı
SQL Server için Microsoft JDBC Driver 4.1 veya önceki sürümleri (SQLServerBulkCopy sınıfını desteklemez) kullanırken bunun yerine SQL Server Transact-SQL BULK INSERT deyimini yürütebilirsiniz.
Toplu kopyalama örneği kurulumu
SQLServerBulkCopy sınıfı yalnızca SQL Server tablolarına veri yazmak için kullanılabilir. Bu makalede gösterilen kod örnekleri , AdventureWorks adlı SQL Server örnek veritabanını kullanır. Kod örneklerindeki mevcut tabloların değiştirilmesini önlemek için, önce oluşturduğunuz tablolara veri yazın.
BulkCopyDemoMatchingColumns ve BulkCopyDemoDifferentColumns tablolarının her ikisi de AdventureWorks Production.Products tablosunu temel alır. Bu tabloları kullanan kod örneklerinde, veriler tablodan Production.Products bu örnek tablolardan birine eklenir. Tablo BulkCopyDemoDifferentColumns , örnek kaynak verilerdeki sütunları hedef tabloya eşlemeyi gösterirken kullanılır; BulkCopyDemoMatchingColumns diğer örneklerin çoğu için kullanılır.
Kod örneklerinden birkaçı, birden çok tabloya yazmak için bir SQLServerBulkCopy sınıfın nasıl kullanılacağını gösterir. Bu örnekler için ve BulkCopyDemoOrderHeaderBulkCopyDemoOrderDetail tabloları hedef tablolar olarak kullanılır. Bu tablolar AdventureWorks'teki Sales.SalesOrderHeader ve Sales.SalesOrderDetail tablolarını temel alır.
Uyarı
Yalnızca SQLServerBulkCopy kullanmak için söz dizimini göstermek amacıyla kod SQLServerBulkCopy örnekleri sağlanmıştır. Kaynak ve hedef tablolar aynı SQL Server örneğinde bulunuyorsa, verileri kopyalamak için Transact-SQL INSERT ... SELECT deyimini kullanmak daha kolay ve daha hızlıdır.
Tablo kurulumu
Kod örneklerinin doğru çalışması için gerekli tabloları oluşturmak için, SQL Server veritabanında aşağıdaki Transact-SQL deyimlerini çalıştırmanız gerekir.
USE AdventureWorks2022;
GO
IF EXISTS (SELECT * FROM dbo.sysobjects
WHERE id = object_id(N'[dbo].[BulkCopyDemoMatchingColumns]')
AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
DROP TABLE [dbo].[BulkCopyDemoMatchingColumns]
CREATE TABLE [dbo].[BulkCopyDemoMatchingColumns]([ProductID] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](50) NOT NULL,
[ProductNumber] [nvarchar](25) NOT NULL,
CONSTRAINT [PK_ProductID] PRIMARY KEY CLUSTERED
(
[ProductID] ASC
) ON [PRIMARY]) ON [PRIMARY]
IF EXISTS (SELECT * FROM dbo.sysobjects
WHERE id = object_id(N'[dbo].[BulkCopyDemoDifferentColumns]')
AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
DROP TABLE [dbo].[BulkCopyDemoDifferentColumns]
CREATE TABLE [dbo].[BulkCopyDemoDifferentColumns]([ProdID] [int] IDENTITY(1,1) NOT NULL,
[ProdNum] [nvarchar](25) NOT NULL,
[ProdName] [nvarchar](50) NOT NULL,
CONSTRAINT [PK_ProdID] PRIMARY KEY CLUSTERED
(
[ProdID] ASC
) ON [PRIMARY]) ON [PRIMARY]
IF EXISTS (SELECT * FROM dbo.sysobjects
WHERE id = object_id(N'[dbo].[BulkCopyDemoOrderHeader]')
AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
DROP TABLE [dbo].[BulkCopyDemoOrderHeader]
CREATE TABLE [dbo].[BulkCopyDemoOrderHeader]([SalesOrderID] [int] IDENTITY(1,1) NOT NULL,
[OrderDate] [datetime] NOT NULL,
[AccountNumber] [nvarchar](15) NULL,
CONSTRAINT [PK_SalesOrderID] PRIMARY KEY CLUSTERED
(
[SalesOrderID] ASC
) ON [PRIMARY]) ON [PRIMARY]
IF EXISTS (SELECT * FROM dbo.sysobjects
WHERE id = object_id(N'[dbo].[BulkCopyDemoOrderDetail]')
AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
DROP TABLE [dbo].[BulkCopyDemoOrderDetail]
CREATE TABLE [dbo].[BulkCopyDemoOrderDetail]([SalesOrderID] [int] NOT NULL,
[SalesOrderDetailID] [int] NOT NULL,
[OrderQty] [smallint] NOT NULL,
[ProductID] [int] NOT NULL,
[UnitPrice] [money] NOT NULL,
CONSTRAINT [PK_LineNumber] PRIMARY KEY CLUSTERED
(
[SalesOrderID] ASC,
[SalesOrderDetailID] ASC
) ON [PRIMARY]) ON [PRIMARY]
Tekil toplu kopyalama operasyonu
SQL Server toplu kopyalama işlemi gerçekleştirmenin en basit yaklaşımı, veritabanında tek bir işlem gerçekleştirmektir. Varsayılan olarak, toplu kopyalama işlemi yalıtılmış bir işlem olarak gerçekleştirilir: Kopyalama işlemi işlem yapılmamış bir şekilde gerçekleşir ve geri döndürme fırsatı yoktur.
Uyarı
Hata oluştuğunda toplu kopyanın tamamını veya bir bölümünü geri almanız gerekiyorsa, yönetilen bir işlem kullanabilir veya mevcut bir SQLServerBulkCopyişlem içinde toplu kopyalama işlemini gerçekleştirebilirsiniz.
Daha fazla bilgi için bkz . İşlem ve toplu kopyalama işlemleri
Toplu kopyalama işlemini gerçekleştirmeye yönelik genel adımlar şunlardır:
Kaynak sunucuya bağlanın ve kopyalanacak verileri alın. Veriler bir
ResultSetnesneden veyaISQLServerBulkRecordbir uygulamadan alınabiliyorsa diğer kaynaklardan da gelebilir.Hedef sunucuya bağlanın (sizin için bir bağlantı kurmak istemiyorsanız
SQLServerBulkCopy).Bir
SQLServerBulkCopynesnesi oluşturun, gerekli özelliklerisetBulkCopyOptionsaracılığıyla ayarlayarak.Toplu ekleme işlemi için hedef tabloyu belirtmek amacıyla
setDestinationTableNameyöntemini çağırın.Yöntemlerden birini
writeToServerçağırın.İsteğe bağlı olarak,
setBulkCopyOptionsüzerinden özellikleri güncelleştirin ve gerektiğindewriteToServer'i tekrar çağırın.çağrısı gerçekleştirin
closeveya bir try-with-resources deyimi içinde toplu kopyalama işlemlerini sarmalayın.
Dikkat
Kaynak ve hedef sütun veri türlerinin eşleşmesini öneririz. Veri türleri eşleşmiyorsa, SQLServerBulkCopy her kaynak değeri hedef veri türüne dönüştürmeyi dener. Dönüştürmeler performansı etkileyebilir ve beklenmeyen hatalara neden olabilir. Örneğin, bir çift veri türü çoğu zaman ondalık veri türüne dönüştürülebilir, ancak her zaman dönüştürülemez.
Example
Aşağıdaki uygulama, SQLServerBulkCopy sınıfını kullanarak verilerin nasıl yükleneceğini gösterir. Bu örnekte, SQL Server AdventureWorks veritabanındaki Production.Product tablosundaki verileri aynı veritabanındaki benzer bir tabloya kopyalamak için kullanılır ResultSet .
Önemli
Çalışma tablolarını Tablo kurulumunda açıklandığı gibi oluşturmadığınız sürece bu örnek çalışmaz. Bu kod, yalnızca SQLServerBulkCopy öğesini kullanmanın sözdizimini göstermek için sağlanmıştır. Kaynak ve hedef tablolar aynı SQL Server örneğinde bulunuyorsa, verileri kopyalamak için Transact-SQL INSERT ... SELECT deyimini kullanmak daha kolay ve hızlıdır.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.microsoft.sqlserver.jdbc.SQLServerBulkCopy;
public class BulkCopySingle {
public static void main(String[] args) {
String connectionUrl = "jdbc:sqlserver://<server>:<port>;encrypt=true;databaseName=AdventureWorks;user=<user>;password=<password>";
String destinationTable = "dbo.BulkCopyDemoMatchingColumns";
int countBefore, countAfter;
ResultSet rsSourceData;
try (Connection sourceConnection = DriverManager.getConnection(connectionUrl);
Connection destinationConnection = DriverManager.getConnection(connectionUrl);
Statement stmt = sourceConnection.createStatement();
SQLServerBulkCopy bulkCopy = new SQLServerBulkCopy(destinationConnection)) {
// Empty the destination table.
stmt.executeUpdate("DELETE FROM " + destinationTable);
// Perform an initial count on the destination table.
countBefore = getRowCount(stmt, destinationTable);
// Get data from the source table as a ResultSet.
rsSourceData = stmt.executeQuery("SELECT ProductID, Name, ProductNumber FROM Production.Product");
// In real world applications you would
// not use SQLServerBulkCopy to move data from one table to the other
// in the same database. This is for demonstration purposes only.
// Set up the bulk copy object.
// Note that the column positions in the source
// table match the column positions in
// the destination table so there is no need to
// map columns.
bulkCopy.setDestinationTableName(destinationTable);
// Write from the source to the destination.
bulkCopy.writeToServer(rsSourceData);
// Perform a final count on the destination
// table to see how many rows were added.
countAfter = getRowCount(stmt, destinationTable);
System.out.println((countAfter - countBefore) + " rows were added.");
}
// Handle any errors that may have occurred.
catch (SQLException e) {
e.printStackTrace();
}
}
private static int getRowCount(Statement stmt,
String tableName) throws SQLException {
ResultSet rs = stmt.executeQuery("SELECT COUNT(*) FROM " + tableName);
rs.next();
int count = rs.getInt(1);
rs.close();
return count;
}
}
Transact-SQL kullanarak toplu kopyalama işlemi gerçekleştirme
Aşağıdaki örnekte BULK INSERT deyimini executeUpdate yürütmek için yönteminin nasıl kullanılacağı gösterilmektedir.
Uyarı
Veri kaynağının dosya yolu sunucuya göredir. Toplu kopyalama işleminin başarılı olması için sunucu işleminin bu yola erişimi olmalıdır.
try (Connection con = DriverManager.getConnection(connectionUrl);
Statement stmt = con.createStatement()) {
// Perform the BULK INSERT
stmt.executeUpdate(
"BULK INSERT Northwind.dbo.[Order Details] " + "FROM 'f:\\mydata\\data.tbl' " + "WITH ( FORMATFILE='f:\\mydata\\data.fmt' )");
}
Birden çok toplu kopyalama işlemi
Bir sınıfın tek bir örneğini SQLServerBulkCopy kullanarak birden çok toplu kopyalama işlemi gerçekleştirebilirsiniz. İşlem parametreleri kopyalar arasında değişirse (örneğin, hedef tablonun adı), aşağıdaki örnekte gösterildiği gibi, yöntemlerin herhangi birine writeToServer yapılan sonraki çağrılardan önce bunları güncelleştirmeniz gerekir. Açıkça değiştirilmediği sürece, tüm özellik değerleri belirli bir örneğin önceki toplu kopyalama işleminde olduğu gibi kalır.
Uyarı
Aynı örneğini SQLServerBulkCopy kullanarak birden çok toplu kopyalama işlemi gerçekleştirmek genellikle her işlem için ayrı bir örnek kullanmaktan daha verimlidir.
Aynı SQLServerBulkCopy nesneyi kullanarak birkaç toplu kopyalama işlemi gerçekleştirirseniz, kaynak veya hedef bilgilerin her işlemde eşit veya farklı olup olmadığına ilişkin bir kısıtlama yoktur. Ancak, sunucuya her yazdığınızda sütun ilişkilendirme bilgilerinin düzgün ayarlandığından emin olmanız gerekir.
Önemli
Çalışma tablolarını Tablo kurulumunda açıklandığı gibi oluşturmadığınız sürece bu örnek çalışmaz. Bu kod, yalnızca SQLServerBulkCopy öğesini kullanmanın sözdizimini göstermek için sağlanmıştır. Kaynak ve hedef tablolar aynı SQL Server örneğinde bulunuyorsa, verileri kopyalamak için Transact-SQL INSERT ... SELECT deyimini kullanmak daha kolay ve hızlıdır.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.microsoft.sqlserver.jdbc.SQLServerBulkCopy;
import com.microsoft.sqlserver.jdbc.SQLServerBulkCopyOptions;
public class BulkCopyMultiple {
public static void main(String[] args) {
String connectionUrl = "jdbc:sqlserver://<server>:<port>;encrypt=true;databaseName=AdventureWorks;user=<user>;password=<password>";
String destinationHeaderTable = "dbo.BulkCopyDemoOrderHeader";
String destinationDetailTable = "dbo.BulkCopyDemoOrderDetail";
int countHeaderBefore, countDetailBefore, countHeaderAfter, countDetailAfter;
ResultSet rsHeader, rsDetail;
try (Connection sourceConnection1 = DriverManager.getConnection(connectionUrl);
Connection sourceConnection2 = DriverManager.getConnection(connectionUrl);
Statement stmt = sourceConnection1.createStatement();
PreparedStatement preparedStmt1 = sourceConnection1.prepareStatement(
"SELECT [SalesOrderID], [OrderDate], [AccountNumber] FROM [Sales].[SalesOrderHeader] WHERE [AccountNumber] = ?;");
PreparedStatement preparedStmt2 = sourceConnection2.prepareStatement(
"SELECT [Sales].[SalesOrderDetail].[SalesOrderID], [SalesOrderDetailID], [OrderQty], [ProductID], [UnitPrice] FROM "
+ "[Sales].[SalesOrderDetail] INNER JOIN [Sales].[SalesOrderHeader] ON "
+ "[Sales].[SalesOrderDetail].[SalesOrderID] = [Sales].[SalesOrderHeader].[SalesOrderID] WHERE [AccountNumber] = ?;");
SQLServerBulkCopy bulkCopy = new SQLServerBulkCopy(connectionUrl);) {
// Empty the destination tables.
stmt.executeUpdate("DELETE FROM " + destinationHeaderTable);
stmt.executeUpdate("DELETE FROM " + destinationDetailTable);
// Perform an initial count on the destination
// table with matching columns.
countHeaderBefore = getRowCount(stmt, destinationHeaderTable);
// Perform an initial count on the destination
// table with different column positions.
countDetailBefore = getRowCount(stmt, destinationDetailTable);
// Get data from the source table as a ResultSet.
// The Sales.SalesOrderHeader and Sales.SalesOrderDetail
// tables are quite large and could easily cause a timeout
// if all data from the tables is added to the destination.
// To keep the example simple and quick, a parameter is
// used to select only orders for a particular account
// as the source for the bulk insert.
preparedStmt1.setString(1, "10-4020-000034");
rsHeader = preparedStmt1.executeQuery();
// Get the Detail data in a separate connection.
preparedStmt2.setString(1, "10-4020-000034");
rsDetail = preparedStmt2.executeQuery();
// Create the SQLServerBulkCopySQLServerBulkCopy object.
SQLServerBulkCopyOptions copyOptions = new SQLServerBulkCopyOptions();
copyOptions.setBulkCopyTimeout(100);
bulkCopy.setBulkCopyOptions(copyOptions);
bulkCopy.setDestinationTableName(destinationHeaderTable);
// Guarantee that columns are mapped correctly by
// defining the column mappings for the order.
bulkCopy.addColumnMapping("SalesOrderID", "SalesOrderID");
bulkCopy.addColumnMapping("OrderDate", "OrderDate");
bulkCopy.addColumnMapping("AccountNumber", "AccountNumber");
// Write rsHeader to the destination.
bulkCopy.writeToServer(rsHeader);
// Set up the order details destination.
bulkCopy.setDestinationTableName(destinationDetailTable);
// Clear the existing column mappings
bulkCopy.clearColumnMappings();
// Add order detail column mappings.
bulkCopy.addColumnMapping("SalesOrderID", "SalesOrderID");
bulkCopy.addColumnMapping("SalesOrderDetailID", "SalesOrderDetailID");
bulkCopy.addColumnMapping("OrderQty", "OrderQty");
bulkCopy.addColumnMapping("ProductID", "ProductID");
bulkCopy.addColumnMapping("UnitPrice", "UnitPrice");
// Write rsDetail to the destination.
bulkCopy.writeToServer(rsDetail);
// Perform a final count on the destination
// tables to see how many rows were added.
countHeaderAfter = getRowCount(stmt, destinationHeaderTable);
countDetailAfter = getRowCount(stmt, destinationDetailTable);
System.out.println((countHeaderAfter - countHeaderBefore) + " rows were added to the Header table.");
System.out.println((countDetailAfter - countDetailBefore) + " rows were added to the Detail table.");
}
// Handle any errors that may have occurred.
catch (SQLException e) {
e.printStackTrace();
}
}
private static int getRowCount(Statement stmt,
String tableName) throws SQLException {
ResultSet rs = stmt.executeQuery("SELECT COUNT(*) FROM " + tableName);
rs.next();
int count = rs.getInt(1);
rs.close();
return count;
}
}
İşlem ve toplu kopyalama operasyonları
Toplu kopyalama işlemleri, yalıtılmış işlemler olarak veya birden çok adımlı bir işlemin parçası olarak gerçekleştirilebilir. Bu ikinci seçenek, aynı işlem içinde birden fazla toplu kopyalama işlemi gerçekleştirmenize ve işlemin tamamını işlemeye veya geri almaya devam ederken diğer veritabanı işlemlerini (eklemeler, güncelleştirmeler ve silmeler gibi) gerçekleştirmenize olanak tanır.
Varsayılan olarak, toplu kopyalama işlemi yalıtılmış bir işlem olarak gerçekleştirilir. Toplu kopyalama işlemi işlem yapılmamış bir şekilde gerçekleşir ve geri döndürme fırsatı yoktur. Hata oluştuğunda toplu kopyalamanın tamamını veya bir kısmını geri almanız gerekiyorsa, yönetilen bir işlem kullanabilir veya mevcut bir SQLServerBulkCopyişlem içinde toplu kopyalama işlemini gerçekleştirebilirsiniz.
Azure Veri Ambarı için Genişletilmiş Toplu Kopyalama
Sürücü sürümü v8.4.1 yeni bir bağlantı özelliği ekler: sendTemporalDataTypesAsStringForBulkCopy. Bu boole özelliği varsayılan olarakdır true .
bu bağlantı özelliği olarak ayarlandığında falseDATE, DATETIME, DATIMETIME2, DATETIMEOFFSET, SMALLDATETIME ve TIME veri türlerini Dize olarak göndermek yerine ilgili türler olarak gönderir.
Zamansal veri türlerini ilgili türleri olarak göndermek, kullanıcının Azure Synapse Analytics için bu sütunlara veri göndermesine olanak tanır. Bu, sürücünün verileri Dizeye dönüştürmesi nedeniyle daha önce mümkün değildi. SQL Server, bizim için örtük dönüştürme gerçekleştirebileceği için String verilerini geçici sütunlara göndermek SQL Server ile işe yarar. Ancak, Azure Synapse Analytics ile bu durum aynı değildir.
Buna ek olarak, v8.4.1 ve sonrasından bu bağlantı dizesini 'false' olarak ayarlamadan bile, MONEY ve SMALLMONEY veri türleri ONDALıK yerine / SMALLMONEY veri türleri olarak gönderilir ve bu da bu veri türlerinin Azure Synapse Analytics'e toplu olarak kopyalanmasına olanak tanır.
Azure Veri Ambarı sınırlamaları için Genişletilmiş Toplu Kopyalama
Şu anda iki sınırlama vardır:
Bu bağlantı özelliği olarak
falseayarlandığında, sürücü yalnızca her zamansal veri türünün varsayılan dize değişmez biçimini kabul eder, örneğin:DATE: YYYY-MM-DDDATETIME: YYYY-MM-DD hh:mm:ss[.nnn]DATETIME2: YYYY-MM-DD hh:mm:ss[.nnnnnnn]DATETIMEOFFSET: YYYY-MM-DD hh:mm:ss[.nnnnnnn] [{+/-}hh:mm]SMALLDATETIME:YYYY-MM-DD hh:mm:ssTIME: hh:mm:ss[.nnnnnnn]Bu bağlantı özelliği olarak
falseayarlandığında, toplu kopyalama için belirtilen sütun türünün Temel veri türlerini kullanma bölümünden veri türü eşleme grafiğine uyması gerekir. Örneğin, daha önce kullanıcılar verileri birjava.sql.Types.TIMESTAMPsütuna toplu olarak kopyalamayı belirtebiliyorlardıDATE, ancak bu özellik etkinleştirildiğinde, aynı işlemi gerçekleştirmek için belirtmelerijava.sql.Types.DATEgerekir.
İşlemsiz toplu kopyalama işlemi gerçekleştirme
Aşağıdaki uygulama, işlemsiz bir toplu kopyalama işlemi sırasında bir hatayla karşılaşıldığında ne olduğunu gösterir.
Örnekte, kaynak tablo ve hedef tablonun her birinde adlı ProductIDbir Identity sütunu bulunur. Kod önce tüm satırları silerek ve ardından kaynak tabloda var olduğu bilinen tek bir satır ProductID ekleyerek hedef tabloyu hazırlar. Varsayılan olarak, eklenen her satır için hedef tabloda Kimlik sütunu için yeni bir değer oluşturulur. Bu örnekte, bağlantı açıldığında toplu yükleme işlemini bunun yerine kaynak tablodan Kimlik değerlerini kullanmaya zorlayan bir seçenek ayarlanır.
Toplu kopyalama işlemi, BatchSize özelliği 10 olarak ayarlanmış şekilde yürütülür. İşlem geçersiz satırla karşılaştığında hata verilir. Bu ilk örnekte toplu kopyalama işlemi işlem dışıdır. Hata noktasına kadar kopyalanan tüm toplu işlemler gerçekleştirilir; yinelenen anahtarı içeren toplu işlem geri alınır ve diğer toplu işlemler işlenmeden önce toplu kopyalama işlemi durdurulur.
Uyarı
Çalışma tablolarını Tablo kurulumunda açıklandığı gibi oluşturmadığınız sürece bu örnek çalışmaz. Bu kod, yalnızca SQLServerBulkCopy öğesini kullanmanın sözdizimini göstermek için sağlanmıştır. Kaynak ve hedef tablolar aynı SQL Server örneğinde bulunuyorsa, verileri kopyalamak için Transact-SQL INSERT ... SELECT deyimini kullanmak daha kolay ve hızlıdır.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.microsoft.sqlserver.jdbc.SQLServerBulkCopy;
import com.microsoft.sqlserver.jdbc.SQLServerBulkCopyOptions;
public class BulkCopyNonTransacted {
public static void main(String[] args) {
String connectionUrl = "jdbc:sqlserver://<server>:<port>;encrypt=true;databaseName=AdventureWorks;user=<user>;password=<password>";
String destinationTable = "dbo.BulkCopyDemoMatchingColumns";
int countBefore, countAfter;
ResultSet rsSourceData;
try (Connection sourceConnection = DriverManager.getConnection(connectionUrl);
Statement stmt = sourceConnection.createStatement();
SQLServerBulkCopy bulkCopy = new SQLServerBulkCopy(connectionUrl)) {
// Empty the destination table.
stmt.executeUpdate("DELETE FROM " + destinationTable);
// Add a single row that will result in duplicate key
// when all rows from source are bulk copied.
// Note that this technique will only be successful in
// illustrating the point if a row with ProductID = 446
// exists in the AdventureWorks Production.Products table.
// If you have made changes to the data in this table, change
// the SQL statement in the code to add a ProductID that
// does exist in your version of the Production.Products
// table. Choose any ProductID in the middle of the table
// (not first or last row) to best illustrate the result.
stmt.executeUpdate("SET IDENTITY_INSERT " + destinationTable + " ON;" + "INSERT INTO " + destinationTable
+ "([ProductID], [Name] ,[ProductNumber]) VALUES(446, 'Lock Nut 23','LN-3416'); SET IDENTITY_INSERT " + destinationTable
+ " OFF");
// Perform an initial count on the destination table.
countBefore = getRowCount(stmt, destinationTable);
// Get data from the source table as a ResultSet.
rsSourceData = stmt.executeQuery("SELECT ProductID, Name, ProductNumber FROM Production.Product");
// Set up the bulk copy object using the KeepIdentity option and BatchSize = 10.
SQLServerBulkCopyOptions copyOptions = new SQLServerBulkCopyOptions();
copyOptions.setKeepIdentity(true);
copyOptions.setBatchSize(10);
bulkCopy.setBulkCopyOptions(copyOptions);
bulkCopy.setDestinationTableName(destinationTable);
// Write from the source to the destination.
// This should fail with a duplicate key error
// after some of the batches have been copied.
try {
bulkCopy.writeToServer(rsSourceData);
}
catch (SQLException e) {
e.printStackTrace();
}
// Perform a final count on the destination
// table to see how many rows were added.
countAfter = getRowCount(stmt, destinationTable);
System.out.println((countAfter - countBefore) + " rows were added.");
}
// Handle any errors that may have occurred.
catch (SQLException e) {
e.printStackTrace();
}
}
private static int getRowCount(Statement stmt,
String tableName) throws SQLException {
ResultSet rs = stmt.executeQuery("SELECT COUNT(*) FROM " + tableName);
rs.next();
int count = rs.getInt(1);
rs.close();
return count;
}
}
Bir işlemde özel bir toplu kopyalama işlemi gerçekleştirme
Varsayılan olarak, toplu kopyalama işlemi işlemlerin kendisini oluşturmaz. Ayrılmış bir toplu kopyalama işlemi gerçekleştirmek istediğinizde, bağlantı dizesiyle yeni bir örneği SQLServerBulkCopy oluşturun. Bu senaryoda, toplu kopyalama işleminin her partisi veritabanı tarafından örtük olarak onaylanır.
SQLServerBulkCopyOptions copyOptions = new SQLServerBulkCopyOptions();
copyOptions.setKeepIdentity(true);
copyOptions.setBatchSize(10);
copyOptions.setUseInternalTransaction(true);
Mevcut işlemleri kullanma
Etkinleştirilmiş işlemleri olan bir Connection nesneyi bir SQLServerBulkCopy oluşturucuda parametre olarak geçirebilirsiniz. Bu durumda, toplu kopyalama işlemi mevcut bir işlemde gerçekleştirilir ve işlem durumunda herhangi bir değişiklik yapılmaz (yani, commit edilmez veya iptal edilmez). Bu, uygulamanın toplu kopyalama işlemini diğer veritabanı işlemleriyle birlikte bir işleme dahil etmesine olanak tanır. Bir hata oluştuğundan toplu kopyalama işleminin tamamını geri almanız gerekiyorsa veya toplu kopyalama geri alınabilecek daha büyük bir işlemin parçası olarak yürütülecekse, toplu kopyalama işleminden Connection sonra herhangi bir noktada nesne üzerinde geri alma işlemini gerçekleştirebilirsiniz.
Aşağıdaki uygulama, tek bir özel durumla benzerdir BulkCopyNonTransacted: bu örnekte, toplu kopyalama işlemi daha büyük bir dış işleme dahil edilmiştir. Birincil anahtar ihlali hatası oluştuğunda, tüm işlem geri alınır ve hedef tabloya satır eklenmez.
Uyarı
Çalışma tablolarını Tablo kurulumunda açıklandığı gibi oluşturmadığınız sürece bu örnek çalışmaz. Bu kod, yalnızca SQLServerBulkCopy öğesini kullanmanın sözdizimini göstermek için sağlanmıştır. Kaynak ve hedef tablolar aynı SQL Server örneğinde bulunuyorsa, verileri kopyalamak için Transact-SQL INSERT ... SELECT deyimini kullanmak daha kolay ve hızlıdır.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.microsoft.sqlserver.jdbc.SQLServerBulkCopy;
import com.microsoft.sqlserver.jdbc.SQLServerBulkCopyOptions;
public class BulkCopyExistingTransactions {
public static void main(String[] args) {
String connectionUrl = "jdbc:sqlserver://<server>:<port>;encrypt=true;databaseName=AdventureWorks;user=<user>;password=<password>";
String destinationTable = "dbo.BulkCopyDemoMatchingColumns";
int countBefore, countAfter;
ResultSet rsSourceData;
SQLServerBulkCopyOptions copyOptions;
try (Connection sourceConnection = DriverManager.getConnection(connectionUrl);
Connection destinationConnection = DriverManager.getConnection(connectionUrl);
Statement stmt = sourceConnection.createStatement();
SQLServerBulkCopy bulkCopy = new SQLServerBulkCopy(destinationConnection);) {
// Empty the destination table.
stmt.executeUpdate("DELETE FROM " + destinationTable);
// Add a single row that will result in duplicate key
// when all rows from source are bulk copied.
// Note that this technique will only be successful in
// illustrating the point if a row with ProductID = 446
// exists in the AdventureWorks Production.Products table.
// If you have made changes to the data in this table, change
// the SQL statement in the code to add a ProductID that
// does exist in your version of the Production.Products
// table. Choose any ProductID in the middle of the table
// (not first or last row) to best illustrate the result.
stmt.executeUpdate("SET IDENTITY_INSERT " + destinationTable + " ON;" + "INSERT INTO " + destinationTable
+ "([ProductID], [Name] ,[ProductNumber]) VALUES(446, 'Lock Nut 23','LN-3416'); SET IDENTITY_INSERT " + destinationTable
+ " OFF");
// Perform an initial count on the destination table.
countBefore = getRowCount(stmt, destinationTable);
// Get data from the source table as a ResultSet.
rsSourceData = stmt.executeQuery("SELECT ProductID, Name, ProductNumber FROM Production.Product");
// Set up the bulk copy object inside the transaction.
destinationConnection.setAutoCommit(false);
copyOptions = new SQLServerBulkCopyOptions();
copyOptions.setKeepIdentity(true);
copyOptions.setBatchSize(10);
bulkCopy.setBulkCopyOptions(copyOptions);
bulkCopy.setDestinationTableName(destinationTable);
// Write from the source to the destination.
// This should fail with a duplicate key error.
try {
bulkCopy.writeToServer(rsSourceData);
destinationConnection.commit();
}
catch (SQLException e) {
e.printStackTrace();
destinationConnection.rollback();
}
// Perform a final count on the destination
// table to see how many rows were added.
countAfter = getRowCount(stmt, destinationTable);
System.out.println((countAfter - countBefore) + " rows were added.");
}
catch (Exception e) {
// Handle any errors that may have occurred.
e.printStackTrace();
}
}
private static int getRowCount(Statement stmt,
String tableName) throws SQLException {
ResultSet rs = stmt.executeQuery("SELECT COUNT(*) FROM " + tableName);
rs.next();
int count = rs.getInt(1);
rs.close();
return count;
}
}
CSV dosyasından toplu kopyalama
Aşağıdaki uygulama, SQLServerBulkCopy sınıfını kullanarak verilerin nasıl yükleneceğini gösterir. Bu örnekte, SQL Server AdventureWorks veritabanındaki Production.Product tablosundan dışarı aktarılan verileri veritabanındaki benzer bir tabloya kopyalamak için bir CSV dosyası kullanılır.
Önemli
Bu örnek, çalışma tablolarını Tablo kurulumu'nda açıklandığı gibi oluşturmadığınız sürece çalışmaz.
SQL Server Management Studio'yu açın ve AdventureWorks veritabanıyla SQL Server'a bağlanın.
Veritabanlarını genişletin, AdventureWorks veritabanına sağ tıklayın, Görevler ve Verileri Dışarı Aktar... seçeneğini belirleyin.
Veri Kaynağı için SQL Server'ınıza bağlanmanıza olanak tanıyan Veri kaynağını seçin (örneğin, SQL Server Yerel İstemcisi 11.0), yapılandırmayı denetleyin ve ardından İleri'yi seçin
Hedef için Düz Dosya Hedefi'ni seçin ve
C:\Test\TestBulkCSVExample.csvgibi bir hedefle birlikte bir Dosya Adı girin. Biçim Sınırlı olup olmadığını, Metin niteleyicisinin hiçbiri olup olmadığını denetleyin, ilk veri satırında Sütun adlarını etkinleştirin ve ardından İleri'yi seçinAktarılacak verileri belirtmek için Sorgu yaz'ı ve İleri'yi seçin. SQL Deyiminizi
SELECT ProductID, Name, ProductNumber FROM Production.Productgirin ve İleri'yi seçinYapılandırmayı denetleyin: Satır sınırlayıcısını
{CR}{LF}olarak ve Sütun Sınırlayıcısını Virgül{,}olarak bırakabilirsiniz. Eşlemeleri Düzenle... öğesini seçin ve her sütun için veri türünün doğru olup olmadığını denetleyin (örneğin, diğerleri içinProductIDtamsayı ve Unicode dizesi).Son'a atlayın ve dışarı aktarmayı çalıştırın.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.microsoft.sqlserver.jdbc.SQLServerBulkCSVFileRecord;
import com.microsoft.sqlserver.jdbc.SQLServerBulkCopy;
public class BulkCopyCSV {
public static void main(String[] args) {
String connectionUrl = "jdbc:sqlserver://<server>:<port>;encrypt=true;databaseName=AdventureWorks;user=<user>;password=<password>";
String destinationTable = "dbo.BulkCopyDemoMatchingColumns";
int countBefore, countAfter;
// Get data from the source file by loading it into a class that implements ISQLServerBulkRecord.
// Here we are using the SQLServerBulkCSVFileRecord implementation to import the example CSV file.
try (Connection destinationConnection = DriverManager.getConnection(connectionUrl);
Statement stmt = destinationConnection.createStatement();
SQLServerBulkCopy bulkCopy = new SQLServerBulkCopy(destinationConnection);
SQLServerBulkCSVFileRecord fileRecord = new SQLServerBulkCSVFileRecord("C:\\Test\\TestBulkCSVExample.csv", true);) {
// Set the metadata for each column to be copied.
fileRecord.addColumnMetadata(1, null, java.sql.Types.INTEGER, 0, 0);
fileRecord.addColumnMetadata(2, null, java.sql.Types.NVARCHAR, 50, 0);
fileRecord.addColumnMetadata(3, null, java.sql.Types.NVARCHAR, 25, 0);
// Empty the destination table.
stmt.executeUpdate("DELETE FROM " + destinationTable);
// Perform an initial count on the destination table.
countBefore = getRowCount(stmt, destinationTable);
// Set up the bulk copy object.
// Note that the column positions in the source
// data reader match the column positions in
// the destination table so there is no need to
// map columns.
bulkCopy.setDestinationTableName(destinationTable);
// Write from the source to the destination.
bulkCopy.writeToServer(fileRecord);
// Perform a final count on the destination
// table to see how many rows were added.
countAfter = getRowCount(stmt, destinationTable);
System.out.println((countAfter - countBefore) + " rows were added.");
}
// Handle any errors that may have occurred.
catch (SQLException e) {
e.printStackTrace();
}
}
private static int getRowCount(Statement stmt,
String tableName) throws SQLException {
ResultSet rs = stmt.executeQuery("SELECT COUNT(*) FROM " + tableName);
rs.next();
int count = rs.getInt(1);
rs.close();
return count;
}
}
Sınırlayıcı olarak bir regex karakteri kullanma
Uyarı
Özel sınırlayıcı ayarlarken, '|' gibi bir regex karakteriyse, bu karakterden kaçış yapın.
SQLServerBulkCSVFileRecord fileRecord = new SQLServerBulkCSVFileRecord(CSVFilePath, null, "\\|", true);
CSV dosyasında veri olarak sınırlayıcılarla toplu kopyalama
Sürücü sürümü 8.4.1 yeni bir API SQLServerBulkCSVFileRecord.setEscapeColumnDelimitersCSV(boolean)ekler. True olarak ayarlandığında aşağıdaki kurallar geçerli olur:
- Her bir alan çift tırnak içine alınmış olabilir veya alınmayabilir.
- Alanlar çift tırnak içine alınmamışsa, alanların içinde çift tırnak olmamalıdır.
- Çift tırnak veya sınırlayıcı içeren alanlar çift tırnak içine alınmalıdır.
- Alanları içine almak için çift tırnak kullanılıyorsa, bir alanın içinde görünen çift tırnak işaretinden önce başka bir çift tırnak işareti girilmesi gerekir.
Always Encrypted sütunlarıyla toplu kopyalama
SQL Server için Microsoft JDBC Driver 6.0'da başlayarak, toplu kopyalama Always Encrypted sütunlarıyla desteklenir.
Toplu kopyalama seçeneklerine ve kaynak ve hedef tabloların şifreleme türüne bağlı olarak JDBC sürücüsü saydam olarak şifrelerini çözebilir ve ardından verileri şifreleyebilir veya şifrelenmiş verileri olduğu gibi gönderebilir. Örneğin, şifrelenmiş bir sütundaki verileri şifrelenmemiş bir sütuna toplu olarak kopyalarken, sürücü SQL Server'a göndermeden önce verilerin şifresini saydam bir şekilde çözer. Benzer şekilde, şifrelenmemiş bir sütundan (veya CSV dosyasından) şifrelenmiş bir sütuna verileri toplu olarak kopyalarken, sürücü SQL Server'a göndermeden önce verileri saydam bir şekilde şifreler. Hem kaynak hem de hedef şifrelenirse, toplu kopyalama seçeneğine allowEncryptedValueModifications bağlı olarak sürücü verileri olduğu gibi gönderir veya verilerin şifresini çözer ve SQL Server'a göndermeden önce yeniden şifreler.
Daha fazla bilgi için aşağıdaki toplu kopyalama seçeneğine allowEncryptedValueModifications ve JDBC Sürücüsü ile Always Encrypted kullanma bölümüne bakın.
Önemli
Microsoft JDBC Driver 6.0 for SQL Server'ın, CSV dosyasından şifrelenmiş sütunlara veri kopyalarken sınırlamaları.
Tarih ve saat türleri için yalnızca Transact-SQL varsayılan dize değişmez değer biçimi desteklenmektedir.
DATETIME ve SMALLDATETIME veri türleri desteklenmez
JDBC sürücüsü için toplu kopyalama API'si
SQLServerBulkCopy
Sql Server tablosunu başka bir kaynaktan alınan verilerle verimli bir şekilde toplu yüklemenizi sağlar.
Microsoft SQL Server, tek bir sunucuda veya sunucular arasında verileri bir tablodan diğerine taşımak için bcp adlı popüler bir komut istemi yardımcı programı içerir. sınıfı, SQLServerBulkCopy Java'da benzer işlevler sağlayan kod çözümleri yazmanızı sağlar. SQL Server tablosuna veri yüklemenin başka yolları da vardır (örneğin INSERT deyimleri), ancak SQLServerBulkCopy bunlara göre önemli bir performans avantajı sunar.
SQLServerBulkCopy sınıfı yalnızca SQL Server tablolarına veri yazmak için kullanılabilir. Ancak, veri kaynağı SQL Server ile sınırlı değildir; veriler bir örnek veya ResultSet uygulamayla okunabildiği sürece herhangi bir ISQLServerBulkRecord veri kaynağı kullanılabilir.
| Yapıcı | Description |
|---|---|
SQLServerBulkCopy(Connection connection) |
SQLServerBulkCopy sınıfının yeni bir örneğini, belirtilen açık SQLServerConnection örneğini kullanarak başlatır.
Connection üzerinde işlemler etkinse, kopyalama işlemleri bu işlem kapsamında gerçekleştirilir. |
SQLServerBulkCopy(String connectionURL) |
Sağlanan connectionURL'i temel alarak SQLServerConnection'nin yeni bir örneğini başlatır ve açar. Oluşturucu, SQLServerConnection öğesini kullanarak SQLServerBulkCopy sınıfının yeni bir öbeğini başlatır. |
| Mülkiyet | Description |
|---|---|
String DestinationTableName |
Sunucudaki hedef tablonun adı. Çağrıldığında DestinationTableName ayarlanmamışsa writeToServer, bir SQLServerException fırlatılır.DestinationTableName üç bölümlü bir addır (<database>.<owningschema>.<name>). İsterseniz tablo adını veritabanıyla ve sahip olan şemayla niteleyebilirsiniz. Ancak, tablo adı alt çizgi ("_") veya başka bir özel karakter kullanıyorsa, çevresindeki köşeli ayraçları kullanarak addan kaçmalısınız. Daha fazla bilgi için bkz. Veritabanı Tanımlayıcıları. |
ColumnMappings |
Sütun eşlemeleri, veri kaynağındaki sütunlarla hedefteki sütunlar arasındaki ilişkileri tanımlar. Eşlemeler tanımlanmamışsa, sütunlar sıralı konuma göre örtük olarak eşlenir. Bunun çalışması için kaynak ve hedef şemaların eşleşmesi gerekir. Aksi takdirde bir Özel Durum fırlatılır. Eşlemeler boş değilse, veri kaynağında mevcut olan her sütunun belirtilmesi gerekmez. Eşlenmeyenler yoksayılır. Kaynak ve hedef sütunlara adına veya sırasına göre başvurabilirsiniz. |
| Yöntem | Description |
|---|---|
void addColumnMapping(int sourceColumn, int destinationColumn) |
Kaynak ve hedef sütunları belirtmek üzere sıra numaralarını kullanarak yeni bir sütun eşlemesi ekleme işlemi gerçekleştirir. |
void addColumnMapping (int sourceColumn, String destinationColumn) |
Kaynak sütun için bir sıra ve hedef sütun için sütun adı kullanarak yeni bir sütun eşlemesi ekler. |
void addColumnMapping (String sourceColumn, int destinationColumn) |
Kaynak sütunu açıklamak için bir sütun adı ve hedef sütunu belirtmek için bir sıra numarası kullanarak yeni bir sütun eşlemesi ekler. |
void addColumnMapping (String sourceColumn, String destinationColumn) |
Hem kaynak hem de hedef sütunları belirtmek için sütun adlarını kullanarak yeni bir sütun eşlemesi ekler. |
void clearColumnMappings() |
Sütun eşlemelerinin içeriğini temizler. |
void close() |
SQLServerBulkCopy Örneği kapatır. |
SQLServerBulkCopyOptions getBulkCopyOptions() |
Geçerli kümesini SQLServerBulkCopyOptionsalır. |
String getDestinationTableName() |
Geçerli hedef tablo adını alın. |
void setBulkCopyOptions(SQLServerBulkCopyOptions copyOptions) |
Sağlanan seçeneklere SQLServerBulkCopy göre örneğin davranışını güncelleştirir. |
void setDestinationTableName(String tableName) |
Hedef tablonun adını ayarlar. |
void writeToServer(ResultSet sourceData) |
Sağlanan ResultSet içindeki tüm satırları nesnenin DestinationTableName özelliği tarafından belirtilen bir hedef tabloya SQLServerBulkCopy kopyalar. |
void writeToServer(RowSet sourceData) |
Sağlanan RowSet içindeki tüm satırları nesnenin DestinationTableName özelliği tarafından belirtilen bir hedef tabloya SQLServerBulkCopy kopyalar. |
void writeToServer(ISQLServerBulkRecord sourceData) |
Sağlanan ISQLServerBulkRecord uygulamadan tüm satırları, SQLServerBulkCopy nesnesinin DestinationTableName özelliği tarafından belirtilen bir hedef tabloya kopyalar. |
SQLServerBulkCopyOptions
writeToServer yöntemlerinin SQLServerBulkCopy bir örneğinde nasıl davranacağını denetleyen ayarlar koleksiyonu.
| Yapıcı | Description |
|---|---|
SQLServerBulkCopyOptions() |
Tüm ayarlar için varsayılanları kullanarak sınıfın yeni bir örneğini SQLServerBulkCopyOptions başlatır. |
Aşağıdaki seçenekler için alıcı ve ayarlayıcılar vardır:
| Seçenek | Description | Varsayılan |
|---|---|---|
boolean CheckConstraints |
Veriler eklenirken kısıtlamaları denetleyin. | False - kısıtlamalar doğrulanmıyor |
boolean FireTriggers |
Sunucunun veritabanına eklenen satırlar için ekleme tetikleyicilerini tetiklemesini sağlar. | False - hiçbir tetikleyici çalıştırılmadı |
boolean KeepIdentity |
Kaynak kimlik değerlerini koruyun. | False - kimlik değerleri hedef tarafından atanır |
boolean KeepNulls |
Varsayılan değerlerin ayarlarından bağımsız olarak hedef tablodaki null değerleri koruyun. | False - null değerler, varsa varsayılan değerlerle değiştirilir. |
boolean TableLock |
Toplu kopyalama işlemi süresi boyunca bir toplu güncelleme kilidi alın. | Yanlış - satır kilitleri kullanılır. |
boolean UseInternalTransaction |
olarak trueayarlandığında, toplu kopyalama işleminin her toplu işlemi bir işlem içinde gerçekleşir. Eğer SQLServerBulkCopy mevcut bir bağlantı kullanıyorsa (oluşturucu tarafından belirtildiği gibi), bir SQLServerException meydana gelecektir. Ayrılmış bir bağlantı oluşturursa SQLServerBulkCopy, her toplu iş için bir işlem oluşturulup onaylanacaktır. |
False - işlem yok |
int BatchSize |
Her bir veri kümesindeki satır sayısı. Her toplu işlemin sonunda, toplu iş içindeki satırlar sunucuya gönderilir. Satırlar işlendiğinde veya hedef veri kaynağına gönderilecek satır kalmadığında BatchSize toplu işlem tamamlanır.
SQLServerBulkCopy örneği UseInternalTransaction seçeneği false olarak ayarlandıysa, satırlar bir kerede BatchSize satırları sunucuya gönderilir, ancak işlemle ilgili herhangi bir işlem yapılmaz.
UseInternalTransaction
true olarak ayarlanırsa, her bir satır partisi açık bir işlem içinde gerçekleştirilir. |
0 - her writeToServer işlemin tek bir toplu iş olduğunu gösterir |
int BulkCopyTimeout |
İşlemin zaman aşımına uğramadan önce tamamlanması için saniye sayısı. 0 değeri sınır olmadığını gösterir; toplu kopya süresiz olarak bekler. | 60 saniye. |
boolean allowEncryptedValueModifications |
Bu seçenek SQL Server için Microsoft JDBC Sürücüsü 6.0 (veya üzeri) ile kullanılabilir. olarak trueayarlandığında, allowEncryptedValueModifications verilerin şifresini çözmeden şifrelenmiş verilerin tablolar veya veritabanları arasında toplu olarak kopyalanmasını sağlar. Genellikle, bir uygulama verilerin şifresini çözmeden bir tablodaki şifrelenmiş sütunlardan verileri seçer (uygulama, sütun şifreleme ayarı anahtar sözcüğü devre dışı olarak ayarlanmış şekilde veritabanına bağlanır) ve ardından verileri toplu olarak eklemek için bu seçeneği kullanır ve bu seçenek hala şifrelenmiştir. Daha fazla bilgi için bkz. JDBC Sürücüsü ile Always Encrypted Kullanma.Ayarlarken allowEncryptedValueModifications'yi true'ye dikkatle kullanın çünkü sürücü, verilerin gerçekten şifrelenip şifrelenmediğini veya hedef sütunla aynı şifreleme türü, algoritma ve anahtar kullanılarak doğru şekilde şifrelenip şifrelenmediğini kontrol etmez. |
Alıcı ve ayarlayıcılar:
| Methods | Description |
|---|---|
boolean isCheckConstraints() |
Veriler eklenirken kısıtlamaların denetlenip denetlenmeyeceğini gösterir. |
void setCheckConstraints(boolean checkConstraints) |
Veriler eklenirken kısıtlamaların denetlenip denetlenmeyeceğini ayarlar. |
boolean isFireTriggers() |
Sunucunun veritabanına eklenen satırlar için ekleme tetikleyicilerini tetiklemesi gerekip gerekmediğini gösterir. |
void setFireTriggers(boolean fireTriggers) |
Sunucunun, veritabanına eklenen satırlar için tetikleyicileri çalıştıracak şekilde ayarlanıp ayarlanmayacağını belirler. |
boolean isKeepIdentity() |
Kaynak kimlik değerlerinin korunup korunmayacağını gösterir. |
void setKeepIdentity(boolean keepIdentity) |
Kimlik değerlerinin korunup korunmayacağını ayarlar. |
boolean isKeepNulls() |
Varsayılan değerlerin ayarlarından bağımsız olarak hedef tablodaki null değerlerin korunup korunmayacağını veya varsayılan değerlerle (varsa) değiştirilmesi gerekip gerekmediğini gösterir. |
void setKeepNulls(boolean keepNulls) |
Varsayılan değerlerin ayarlarından bağımsız olarak hedef tablodaki null değerlerin korunup korunmayacağını veya bunların varsayılan değerlerle değiştirilip değiştirilmeyeceğini (varsa) ayarlar. |
boolean isTableLock() |
Toplu kopyalama işlemi süresi boyunca SQLServerBulkCopy için toplu güncelleştirme kilidi alınıp alınmayacağını gösterir. |
void setTableLock(boolean tableLock) |
SQLServerBulkCopy'in toplu kopyalama işlemi süresi boyunca toplu güncelleştirme kilidi alıp almayacağını ayarlar. |
boolean isUseInternalTransaction() |
Toplu kopyalama işleminin her toplu işleminin bir işlem içinde gerçekleşip gerçekleşmeyeceğini gösterir. |
void setUseInternalTransaction(boolean useInternalTransaction) |
Toplu kopyalama işlemlerinin her toplu işleminin bir işlem içinde gerçekleşip gerçekleşmeyeceğini ayarlar. |
int getBatchSize() |
Her toplu işlemdeki satır sayısını alır. Her toplu işlemin sonunda, satırlar sunucuya gönderilir. |
void setBatchSize(int batchSize) |
Her toplu işlemdeki satır sayısını ayarlar. Her toplu işlemin sonunda, toplu içindeki satırlar sunucuya gönderilir. |
int getBulkCopyTimeout() |
İşlemin zaman aşımına uğramadan önce tamamlanması için gereken saniye sayısını alır. |
void setBulkCopyTimeout(int timeout) |
İşlemin zaman aşımına uğramadan önce tamamlanması için saniye sayısını ayarlar. |
boolean isAllowEncryptedValueModifications() |
Ayarın etkin mi yoksa devre dışı mı olduğunu allowEncryptedValueModifications gösterir. |
void setAllowEncryptedValueModifications(boolean allowEncryptedValueModifications) |
allowEncryptedValueModifications ayarı, Always Encrypted sütunlarıyla toplu kopyalama için yapılandırılır. |
ISQLServerBulkRecord
Arabirim ISQLServerBulkRecord , herhangi bir kaynaktan (dosya gibi) verileri okuyan sınıflar oluşturmak ve bir SQLServerBulkCopy örneğin bu verilerle bir SQL Server tablosunu toplu olarak yüklemesine izin vermek için kullanılabilir.
| Arabirim Yöntemleri | Description |
|---|---|
set<Integer> getColumnOrdinals() |
Bu veri kaydında temsil edilen sütunların her biri için sıra numaralarını alın. |
String getColumnName(int column) |
Verilen sütunun adını alın. |
int getColumnType(int column) |
Verilen sütunun JDBC veri türünü alın. |
int getPrecision(int column) |
Verilen sütun için hassasiyeti alın. |
object[] getRowData() |
Geçerli satırın verilerini Bir Nesne dizisi olarak alır. Her Nesne, belirtilen sütun için belirtilen JDBC veri türünü temsil etmek için kullanılan Java dil Türü ile eşleşmelidir. Daha fazla bilgi için uygun eşlemeler için bkz. JDBC Sürücüsü Veri Türlerini Anlama . |
int getScale(int column) |
Verilen sütunun ölçeğini alın. |
boolean isAutoIncrement(int column) |
Sütunun bir kimlik sütununu temsil edip etmediğini gösterir. |
boolean next() |
Sonraki veri satırına ilerler. |
SQLServerBulkCSVFileRecord
Sınırlandırılmış bir dosyada, her satırın bir veri satırını temsil ettiği durumlarda, temel Java veri tiplerini okumak için kullanılabilen ISQLServerBulkRecord arabiriminin basit bir uygulaması.
Uygulama Notları ve Sınırlamaları:
Veriler bir kerede bir satır okunduğundan, belirli bir satırda izin verilen en fazla veri miktarı kullanılabilir bellekle sınırlıdır.
Büyük veri türleri olan
varchar(max),varbinary(max),nvarchar(max),sqlxmlventext'ün akışı desteklenmez.CSV dosyası için belirtilen sınırlayıcı, verilerin herhangi bir yerinde görünmemelidir ve Java normal ifadelerinde kısıtlanmış bir karakterse düzgün bir şekilde kaçılmalıdır.
CSV dosyası uygulamasında çift tırnak işaretleri verilerin bir parçası olarak değerlendirilir. Örneğin, sınırlayıcı bir virgül ise,
hello,"world","hello,world"satırıhello,"world","helloveworld"değerleriyle dört sütun olarak değerlendirilir.Yeni satır karakterleri satır sonlandırıcıları olarak kullanılır ve verilerin herhangi bir yerinde kullanılamaz.
| Yapıcı | Description |
|---|---|
SQLServerBulkCSVFileRecord(String fileToParse, String encoding, String delimiter, boolean firstLineIsColumnNames) |
SQLServerBulkCSVFileRecord sınıfının, sağlanan sınırlayıcı ve kodlama ile fileToParse içindeki her satırı ayrıştıracak yeni bir örneğini başlatır. True olarak ayarlanırsa firstLineIsColumnNames , dosyadaki ilk satır sütun adları olarak ayrıştırılır. Kodlama NULL ise, varsayılan kodlama kullanılır. |
SQLServerBulkCSVFileRecord(String fileToParse, String encoding, boolean firstLineIsColumnNames) |
Yeni bir SQLServerBulkCSVFileRecord sınıfı örneği başlatır; bu sınıf, fileToParse içindeki her satırı sağlanan kodlama ve virgül sınırlayıcı ile ayrıştıracaktır. True olarak ayarlanırsa firstLineIsColumnNames , dosyadaki ilk satır sütun adları olarak ayrıştırılır. Kodlama NULL ise, varsayılan kodlama kullanılır. |
SQLServerBulkCSVFileRecord(String fileToParse, boolean firstLineIsColumnNames |
Yeni bir SQLServerBulkCSVFileRecord sınıfı örneğini oluşturur; bu sınıf, fileToParse içindeki her satırı varsayılan kodlama ve sınırlayıcı olarak virgül kullanarak ayrıştıracaktır. True olarak ayarlanırsa firstLineIsColumnNames , dosyadaki ilk satır sütun adları olarak ayrıştırılır. |
| Yöntem | Description |
|---|---|
void addColumnMetadata(int positionInFile, String columnName, int jdbcType, int precision, int scale) |
Dosyadaki belirtilen sütun için meta veriler ekler. |
void close() |
Dosya okuyucuyla ilişkili tüm kaynakları serbest bırakır. |
void setTimestampWithTimezoneFormat(DateTimeFormatter dateTimeFormatter) |
Zaman damgası verilerini dosyadan ayrıştırma formatı olarak java.sql.Types.TIMESTAMP_WITH_TIMEZONE ayarlar. |
void setTimestampWithTimezoneFormat(String dateTimeFormat) |
Zaman verilerinin dosyadan java.sql.Types.TIME_WITH_TIMEZONE biçiminde ayrıştırılmasını ayarlar. |
void setTimeWithTimezoneFormat(DateTimeFormatter dateTimeFormatter) |
Zaman verilerini dosyasından java.sql.Types.TIME_WITH_TIMEZONE olarak ayrıştırma biçimini ayarlar. |
void setTimeWithTimezoneFormat(String timeFormat) |
Zaman verilerinin dosyadan java.sql.Types.TIME_WITH_TIMEZONE biçiminde ayrıştırılmasını ayarlar. |