Related samples to ADO.NET documents, importing from .NET Framework-Part 4 (#840)
* Add samples Related to the next part of porting documents from .NET Framework documents.
This commit is contained in:
Родитель
4f4f4124a0
Коммит
59c3b102d4
|
@ -0,0 +1,45 @@
|
|||
using System;
|
||||
// <Snippet1>
|
||||
using Microsoft.Data.SqlClient;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Samples
|
||||
{
|
||||
class CancellationSample
|
||||
{
|
||||
public static void Main(string[] args)
|
||||
{
|
||||
CancellationTokenSource source = new CancellationTokenSource();
|
||||
source.CancelAfter(2000); // give up after 2 seconds
|
||||
try
|
||||
{
|
||||
Task result = CancellingAsynchronousOperations(source.Token);
|
||||
result.Wait();
|
||||
}
|
||||
catch (AggregateException exception)
|
||||
{
|
||||
if (exception.InnerException is SqlException)
|
||||
{
|
||||
Console.WriteLine("Operation canceled");
|
||||
}
|
||||
else
|
||||
{
|
||||
throw;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static async Task CancellingAsynchronousOperations(CancellationToken cancellationToken)
|
||||
{
|
||||
using (SqlConnection connection = new SqlConnection("Server=(local);Integrated Security=true"))
|
||||
{
|
||||
await connection.OpenAsync(cancellationToken);
|
||||
|
||||
SqlCommand command = new SqlCommand("WAITFOR DELAY '00:10:00'", connection);
|
||||
await command.ExecuteNonQueryAsync(cancellationToken);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// </Snippet1>
|
|
@ -0,0 +1,68 @@
|
|||
using System;
|
||||
// <Snippet1>
|
||||
using Microsoft.Data.SqlClient;
|
||||
using System.Threading.Tasks;
|
||||
using System.Transactions;
|
||||
|
||||
class Program
|
||||
{
|
||||
public static void Main()
|
||||
{
|
||||
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
|
||||
// replace these with your own values
|
||||
// create two tables RegionTable1 and RegionTable2
|
||||
// and add a constraint in one of these tables
|
||||
// to avoid duplicate RegionID
|
||||
builder.DataSource = "localhost";
|
||||
builder.InitialCatalog = "Northwind";
|
||||
builder.IntegratedSecurity = true;
|
||||
|
||||
Task task = ExecuteDistributedTransaction(builder.ConnectionString, builder.ConnectionString);
|
||||
task.Wait();
|
||||
}
|
||||
|
||||
static async Task ExecuteDistributedTransaction(string connectionString1, string connectionString2)
|
||||
{
|
||||
using (SqlConnection connection1 = new SqlConnection(connectionString1))
|
||||
using (SqlConnection connection2 = new SqlConnection(connectionString2))
|
||||
{
|
||||
using (CommittableTransaction transaction = new CommittableTransaction())
|
||||
{
|
||||
await connection1.OpenAsync();
|
||||
connection1.EnlistTransaction(transaction);
|
||||
|
||||
await connection2.OpenAsync();
|
||||
connection2.EnlistTransaction(transaction);
|
||||
|
||||
try
|
||||
{
|
||||
SqlCommand command1 = connection1.CreateCommand();
|
||||
command1.CommandText = "Insert into RegionTable1 (RegionID, RegionDescription) VALUES (100, 'Description')";
|
||||
await command1.ExecuteNonQueryAsync();
|
||||
|
||||
SqlCommand command2 = connection2.CreateCommand();
|
||||
command2.CommandText = "Insert into RegionTable2 (RegionID, RegionDescription) VALUES (100, 'Description')";
|
||||
await command2.ExecuteNonQueryAsync();
|
||||
|
||||
transaction.Commit();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine("Exception Type: {0}", ex.GetType());
|
||||
Console.WriteLine(" Message: {0}", ex.Message);
|
||||
|
||||
try
|
||||
{
|
||||
transaction.Rollback();
|
||||
}
|
||||
catch (Exception ex2)
|
||||
{
|
||||
Console.WriteLine("Rollback Exception Type: {0}", ex2.GetType());
|
||||
Console.WriteLine(" Message: {0}", ex2.Message);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// </Snippet1>
|
|
@ -0,0 +1,72 @@
|
|||
using System;
|
||||
// <Snippet1>
|
||||
using System.Data.Common;
|
||||
using Microsoft.Data.SqlClient;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
class Class1
|
||||
{
|
||||
static void Main()
|
||||
{
|
||||
Task task = MultipleCommands();
|
||||
task.Wait();
|
||||
}
|
||||
|
||||
static async Task MultipleCommands()
|
||||
{
|
||||
// By default, MARS is disabled when connecting to a MARS-enabled.
|
||||
// It must be enabled in the connection string.
|
||||
string connectionString = GetConnectionString();
|
||||
|
||||
int vendorID;
|
||||
SqlDataReader productReader = null;
|
||||
string vendorSQL =
|
||||
"SELECT BusinessEntityID, Name FROM Purchasing.Vendor";
|
||||
string productSQL =
|
||||
"SELECT Production.Product.Name FROM Production.Product " +
|
||||
"INNER JOIN Purchasing.ProductVendor " +
|
||||
"ON Production.Product.ProductID = " +
|
||||
"Purchasing.ProductVendor.ProductID " +
|
||||
"WHERE Purchasing.ProductVendor.BusinessEntityID = @VendorId";
|
||||
|
||||
using (SqlConnection awConnection =
|
||||
new SqlConnection(connectionString))
|
||||
{
|
||||
SqlCommand vendorCmd = new SqlCommand(vendorSQL, awConnection);
|
||||
SqlCommand productCmd =
|
||||
new SqlCommand(productSQL, awConnection);
|
||||
|
||||
productCmd.Parameters.Add("@VendorId", SqlDbType.Int);
|
||||
|
||||
await awConnection.OpenAsync();
|
||||
using (SqlDataReader vendorReader = await vendorCmd.ExecuteReaderAsync())
|
||||
{
|
||||
while (await vendorReader.ReadAsync())
|
||||
{
|
||||
Console.WriteLine(vendorReader["Name"]);
|
||||
|
||||
vendorID = (int)vendorReader["BusinessEntityID"];
|
||||
|
||||
productCmd.Parameters["@VendorId"].Value = vendorID;
|
||||
// The following line of code requires a MARS-enabled connection.
|
||||
productReader = await productCmd.ExecuteReaderAsync();
|
||||
using (productReader)
|
||||
{
|
||||
while (await productReader.ReadAsync())
|
||||
{
|
||||
Console.WriteLine(" " +
|
||||
productReader["Name"].ToString());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static string GetConnectionString()
|
||||
{
|
||||
// To avoid storing the connection string in your code, you can retrieve it from a configuration file.
|
||||
return "Data Source=(local);Integrated Security=SSPI;Initial Catalog=AdventureWorks;MultipleActiveResultSets=True";
|
||||
}
|
||||
}
|
||||
// </Snippet1>
|
|
@ -0,0 +1,116 @@
|
|||
using System;
|
||||
// <Snippet1>
|
||||
using System.Data.Common;
|
||||
using Microsoft.Data.SqlClient;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
class Program
|
||||
{
|
||||
static void Main()
|
||||
{
|
||||
Task task = ReadingAndUpdatingData();
|
||||
task.Wait();
|
||||
}
|
||||
|
||||
static async Task ReadingAndUpdatingData()
|
||||
{
|
||||
// By default, MARS is disabled when connecting to a MARS-enabled host.
|
||||
// It must be enabled in the connection string.
|
||||
string connectionString = GetConnectionString();
|
||||
|
||||
SqlTransaction updateTx = null;
|
||||
SqlCommand vendorCmd = null;
|
||||
SqlCommand prodVendCmd = null;
|
||||
SqlCommand updateCmd = null;
|
||||
|
||||
SqlDataReader prodVendReader = null;
|
||||
|
||||
int vendorID = 0;
|
||||
int productID = 0;
|
||||
int minOrderQty = 0;
|
||||
int maxOrderQty = 0;
|
||||
int onOrderQty = 0;
|
||||
int recordsUpdated = 0;
|
||||
int totalRecordsUpdated = 0;
|
||||
|
||||
string vendorSQL =
|
||||
"SELECT BusinessEntityID, Name FROM Purchasing.Vendor " +
|
||||
"WHERE CreditRating = 5";
|
||||
string prodVendSQL =
|
||||
"SELECT ProductID, MaxOrderQty, MinOrderQty, OnOrderQty " +
|
||||
"FROM Purchasing.ProductVendor " +
|
||||
"WHERE BusinessEntityID = @VendorID";
|
||||
string updateSQL =
|
||||
"UPDATE Purchasing.ProductVendor " +
|
||||
"SET OnOrderQty = @OrderQty " +
|
||||
"WHERE ProductID = @ProductID AND BusinessEntityID = @VendorID";
|
||||
|
||||
using (SqlConnection awConnection =
|
||||
new SqlConnection(connectionString))
|
||||
{
|
||||
await awConnection.OpenAsync();
|
||||
updateTx = await Task.Run(() => awConnection.BeginTransaction());
|
||||
|
||||
vendorCmd = new SqlCommand(vendorSQL, awConnection);
|
||||
vendorCmd.Transaction = updateTx;
|
||||
|
||||
prodVendCmd = new SqlCommand(prodVendSQL, awConnection);
|
||||
prodVendCmd.Transaction = updateTx;
|
||||
prodVendCmd.Parameters.Add("@VendorId", SqlDbType.Int);
|
||||
|
||||
updateCmd = new SqlCommand(updateSQL, awConnection);
|
||||
updateCmd.Transaction = updateTx;
|
||||
updateCmd.Parameters.Add("@OrderQty", SqlDbType.Int);
|
||||
updateCmd.Parameters.Add("@ProductID", SqlDbType.Int);
|
||||
updateCmd.Parameters.Add("@VendorID", SqlDbType.Int);
|
||||
|
||||
using (SqlDataReader vendorReader = await vendorCmd.ExecuteReaderAsync())
|
||||
{
|
||||
while (await vendorReader.ReadAsync())
|
||||
{
|
||||
Console.WriteLine(vendorReader["Name"]);
|
||||
|
||||
vendorID = (int)vendorReader["BusinessEntityID"];
|
||||
prodVendCmd.Parameters["@VendorID"].Value = vendorID;
|
||||
prodVendReader = await prodVendCmd.ExecuteReaderAsync();
|
||||
|
||||
using (prodVendReader)
|
||||
{
|
||||
while (await prodVendReader.ReadAsync())
|
||||
{
|
||||
productID = (int)prodVendReader["ProductID"];
|
||||
|
||||
if (prodVendReader["OnOrderQty"] == DBNull.Value)
|
||||
{
|
||||
minOrderQty = (int)prodVendReader["MinOrderQty"];
|
||||
onOrderQty = minOrderQty;
|
||||
}
|
||||
else
|
||||
{
|
||||
maxOrderQty = (int)prodVendReader["MaxOrderQty"];
|
||||
onOrderQty = (int)(maxOrderQty / 2);
|
||||
}
|
||||
|
||||
updateCmd.Parameters["@OrderQty"].Value = onOrderQty;
|
||||
updateCmd.Parameters["@ProductID"].Value = productID;
|
||||
updateCmd.Parameters["@VendorID"].Value = vendorID;
|
||||
|
||||
recordsUpdated = await updateCmd.ExecuteNonQueryAsync();
|
||||
totalRecordsUpdated += recordsUpdated;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Console.WriteLine("Total Records Updated: ", totalRecordsUpdated.ToString());
|
||||
await Task.Run(() => updateTx.Rollback());
|
||||
Console.WriteLine("Transaction Rolled Back");
|
||||
}
|
||||
}
|
||||
|
||||
private static string GetConnectionString()
|
||||
{
|
||||
// To avoid storing the connection string in your code, you can retrieve it from a configuration file.
|
||||
return "Data Source=(local);Integrated Security=SSPI;Initial Catalog=AdventureWorks;MultipleActiveResultSets=True";
|
||||
}
|
||||
}
|
||||
// </Snippet1>
|
|
@ -0,0 +1,46 @@
|
|||
using System;
|
||||
// <Snippet1>
|
||||
using System.Data.Common;
|
||||
using Microsoft.Data.SqlClient;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
class program
|
||||
{
|
||||
static async Task PerformDBOperationsUsingProviderModel(string connectionString)
|
||||
{
|
||||
using (DbConnection connection = SqlClientFactory.Instance.CreateConnection())
|
||||
{
|
||||
connection.ConnectionString = connectionString;
|
||||
await connection.OpenAsync();
|
||||
|
||||
DbCommand command = connection.CreateCommand();
|
||||
command.CommandText = "SELECT * FROM AUTHORS";
|
||||
|
||||
using (DbDataReader reader = await command.ExecuteReaderAsync())
|
||||
{
|
||||
while (await reader.ReadAsync())
|
||||
{
|
||||
for (int i = 0; i < reader.FieldCount; i++)
|
||||
{
|
||||
// Process each column as appropriate
|
||||
object obj = await reader.GetFieldValueAsync<object>(i);
|
||||
Console.WriteLine(obj);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void Main()
|
||||
{
|
||||
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
|
||||
// replace these with your own values
|
||||
builder.DataSource = "localhost";
|
||||
builder.InitialCatalog = "pubs";
|
||||
builder.IntegratedSecurity = true;
|
||||
|
||||
Task task = PerformDBOperationsUsingProviderModel(builder.ConnectionString);
|
||||
task.Wait();
|
||||
}
|
||||
}
|
||||
// </Snippet1>
|
|
@ -0,0 +1,275 @@
|
|||
using System;
|
||||
// <Snippet1>
|
||||
using System.Data;
|
||||
using Microsoft.Data.SqlClient;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace SqlBulkCopyAsyncCodeSample
|
||||
{
|
||||
class Program
|
||||
{
|
||||
static string selectStatement = "SELECT * FROM [pubs].[dbo].[titles]";
|
||||
static string createDestTableStatement =
|
||||
@"CREATE TABLE {0} (
|
||||
[title_id] [varchar](6) NOT NULL,
|
||||
[title] [varchar](80) NOT NULL,
|
||||
[type] [char](12) NOT NULL,
|
||||
[pub_id] [char](4) NULL,
|
||||
[price] [money] NULL,
|
||||
[advance] [money] NULL,
|
||||
[royalty] [int] NULL,
|
||||
[ytd_sales] [int] NULL,
|
||||
[notes] [varchar](200) NULL,
|
||||
[pubdate] [datetime] NOT NULL)";
|
||||
|
||||
// Replace the connection string if needed, for instance to connect to SQL Express: @"Server=(local)\SQLEXPRESS;Database=Demo;Integrated Security=true"
|
||||
// static string connectionString = @"Server=(localdb)\V11.0;Database=Demo";
|
||||
static string connectionString = @"Server=(local);Database=Demo;Integrated Security=true";
|
||||
|
||||
// static string marsConnectionString = @"Server=(localdb)\V11.0;Database=Demo;MultipleActiveResultSets=true;";
|
||||
static string marsConnectionString = @"Server=(local);Database=Demo;MultipleActiveResultSets=true;Integrated Security=true";
|
||||
|
||||
// Replace the Server name with your actual sql azure server name and User ID/Password
|
||||
static string azureConnectionString = @"Server=SqlAzure;User ID=<myUserID>;Password=<myPassword>;Database=Demo";
|
||||
|
||||
static void Main(string[] args)
|
||||
{
|
||||
SynchronousSqlBulkCopy();
|
||||
AsyncSqlBulkCopy().Wait();
|
||||
MixSyncAsyncSqlBulkCopy().Wait();
|
||||
AsyncSqlBulkCopyNotifyAfter().Wait();
|
||||
AsyncSqlBulkCopyDataRows().Wait();
|
||||
AsyncSqlBulkCopySqlServerToSqlAzure().Wait();
|
||||
AsyncSqlBulkCopyCancel().Wait();
|
||||
AsyncSqlBulkCopyMARS().Wait();
|
||||
}
|
||||
|
||||
// 3.1.1 Synchronous bulk copy in .NET 4.5
|
||||
private static void SynchronousSqlBulkCopy()
|
||||
{
|
||||
using (SqlConnection conn = new SqlConnection(connectionString))
|
||||
{
|
||||
conn.Open();
|
||||
DataTable dt = new DataTable();
|
||||
using (SqlCommand cmd = new SqlCommand(selectStatement, conn))
|
||||
{
|
||||
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
|
||||
adapter.Fill(dt);
|
||||
|
||||
string temptable = "[#" + Guid.NewGuid().ToString("N") + "]";
|
||||
cmd.CommandText = string.Format(createDestTableStatement, temptable);
|
||||
cmd.ExecuteNonQuery();
|
||||
|
||||
using (SqlBulkCopy bcp = new SqlBulkCopy(conn))
|
||||
{
|
||||
bcp.DestinationTableName = temptable;
|
||||
bcp.WriteToServer(dt);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// 3.1.2 Asynchronous bulk copy in .NET 4.5
|
||||
private static async Task AsyncSqlBulkCopy()
|
||||
{
|
||||
using (SqlConnection conn = new SqlConnection(connectionString))
|
||||
{
|
||||
await conn.OpenAsync();
|
||||
DataTable dt = new DataTable();
|
||||
using (SqlCommand cmd = new SqlCommand(selectStatement, conn))
|
||||
{
|
||||
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
|
||||
adapter.Fill(dt);
|
||||
|
||||
string temptable = "[#" + Guid.NewGuid().ToString("N") + "]";
|
||||
cmd.CommandText = string.Format(createDestTableStatement, temptable);
|
||||
await cmd.ExecuteNonQueryAsync();
|
||||
|
||||
using (SqlBulkCopy bcp = new SqlBulkCopy(conn))
|
||||
{
|
||||
bcp.DestinationTableName = temptable;
|
||||
await bcp.WriteToServerAsync(dt);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 3.2 Add new Async.NET capabilities in an existing application (Mixing synchronous and asynchronous calls)
|
||||
private static async Task MixSyncAsyncSqlBulkCopy()
|
||||
{
|
||||
using (SqlConnection conn1 = new SqlConnection(connectionString))
|
||||
{
|
||||
conn1.Open();
|
||||
using (SqlCommand cmd = new SqlCommand(selectStatement, conn1))
|
||||
{
|
||||
using (SqlDataReader reader = cmd.ExecuteReader())
|
||||
{
|
||||
using (SqlConnection conn2 = new SqlConnection(connectionString))
|
||||
{
|
||||
await conn2.OpenAsync();
|
||||
string temptable = "[#" + Guid.NewGuid().ToString("N") + "]";
|
||||
SqlCommand createCmd = new SqlCommand(string.Format(createDestTableStatement, temptable), conn2);
|
||||
await createCmd.ExecuteNonQueryAsync();
|
||||
using (SqlBulkCopy bcp = new SqlBulkCopy(conn2))
|
||||
{
|
||||
bcp.DestinationTableName = temptable;
|
||||
await bcp.WriteToServerAsync(reader);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 3.3 Using the NotifyAfter property
|
||||
private static async Task AsyncSqlBulkCopyNotifyAfter()
|
||||
{
|
||||
using (SqlConnection conn = new SqlConnection(connectionString))
|
||||
{
|
||||
await conn.OpenAsync();
|
||||
DataTable dt = new DataTable();
|
||||
using (SqlCommand cmd = new SqlCommand(selectStatement, conn))
|
||||
{
|
||||
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
|
||||
adapter.Fill(dt);
|
||||
|
||||
string temptable = "[#" + Guid.NewGuid().ToString("N") + "]";
|
||||
cmd.CommandText = string.Format(createDestTableStatement, temptable);
|
||||
await cmd.ExecuteNonQueryAsync();
|
||||
|
||||
using (SqlBulkCopy bcp = new SqlBulkCopy(conn))
|
||||
{
|
||||
bcp.DestinationTableName = temptable;
|
||||
bcp.NotifyAfter = 5;
|
||||
bcp.SqlRowsCopied += new SqlRowsCopiedEventHandler(OnSqlRowsCopied);
|
||||
await bcp.WriteToServerAsync(dt);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void OnSqlRowsCopied(object sender, SqlRowsCopiedEventArgs e)
|
||||
{
|
||||
Console.WriteLine("Copied {0} so far...", e.RowsCopied);
|
||||
}
|
||||
|
||||
// 3.4 Using the new SqlBulkCopy Async.NET capabilities with DataRow[]
|
||||
private static async Task AsyncSqlBulkCopyDataRows()
|
||||
{
|
||||
using (SqlConnection conn = new SqlConnection(connectionString))
|
||||
{
|
||||
await conn.OpenAsync();
|
||||
DataTable dt = new DataTable();
|
||||
using (SqlCommand cmd = new SqlCommand(selectStatement, conn))
|
||||
{
|
||||
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
|
||||
adapter.Fill(dt);
|
||||
DataRow[] rows = dt.Select();
|
||||
|
||||
string temptable = "[#" + Guid.NewGuid().ToString("N") + "]";
|
||||
cmd.CommandText = string.Format(createDestTableStatement, temptable);
|
||||
await cmd.ExecuteNonQueryAsync();
|
||||
|
||||
using (SqlBulkCopy bcp = new SqlBulkCopy(conn))
|
||||
{
|
||||
bcp.DestinationTableName = temptable;
|
||||
await bcp.WriteToServerAsync(rows);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 3.5 Copying data from SQL Server to SQL Azure in .NET 4.5
|
||||
private static async Task AsyncSqlBulkCopySqlServerToSqlAzure()
|
||||
{
|
||||
using (SqlConnection srcConn = new SqlConnection(connectionString))
|
||||
using (SqlConnection destConn = new SqlConnection(azureConnectionString))
|
||||
{
|
||||
await srcConn.OpenAsync();
|
||||
await destConn.OpenAsync();
|
||||
using (SqlCommand srcCmd = new SqlCommand(selectStatement, srcConn))
|
||||
{
|
||||
using (SqlDataReader reader = await srcCmd.ExecuteReaderAsync())
|
||||
{
|
||||
string temptable = "[#" + Guid.NewGuid().ToString("N") + "]";
|
||||
using (SqlCommand destCmd = new SqlCommand(string.Format(createDestTableStatement, temptable), destConn))
|
||||
{
|
||||
await destCmd.ExecuteNonQueryAsync();
|
||||
using (SqlBulkCopy bcp = new SqlBulkCopy(destConn))
|
||||
{
|
||||
bcp.DestinationTableName = temptable;
|
||||
await bcp.WriteToServerAsync(reader);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 3.6 Cancelling an Asynchronous Operation to SQL Azure
|
||||
private static async Task AsyncSqlBulkCopyCancel()
|
||||
{
|
||||
CancellationTokenSource cts = new CancellationTokenSource();
|
||||
using (SqlConnection srcConn = new SqlConnection(connectionString))
|
||||
using (SqlConnection destConn = new SqlConnection(azureConnectionString))
|
||||
{
|
||||
await srcConn.OpenAsync(cts.Token);
|
||||
await destConn.OpenAsync(cts.Token);
|
||||
using (SqlCommand srcCmd = new SqlCommand(selectStatement, srcConn))
|
||||
{
|
||||
using (SqlDataReader reader = await srcCmd.ExecuteReaderAsync(cts.Token))
|
||||
{
|
||||
string temptable = "[#" + Guid.NewGuid().ToString("N") + "]";
|
||||
using (SqlCommand destCmd = new SqlCommand(string.Format(createDestTableStatement, temptable), destConn))
|
||||
{
|
||||
await destCmd.ExecuteNonQueryAsync(cts.Token);
|
||||
using (SqlBulkCopy bcp = new SqlBulkCopy(destConn))
|
||||
{
|
||||
bcp.DestinationTableName = temptable;
|
||||
await bcp.WriteToServerAsync(reader, cts.Token);
|
||||
//Cancel Async SqlBulCopy Operation after 200 ms
|
||||
cts.CancelAfter(200);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 3.7 Using Async.Net and MARS
|
||||
private static async Task AsyncSqlBulkCopyMARS()
|
||||
{
|
||||
using (SqlConnection marsConn = new SqlConnection(marsConnectionString))
|
||||
{
|
||||
await marsConn.OpenAsync();
|
||||
|
||||
SqlCommand titlesCmd = new SqlCommand("SELECT * FROM [pubs].[dbo].[titles]", marsConn);
|
||||
SqlCommand authorsCmd = new SqlCommand("SELECT * FROM [pubs].[dbo].[authors]", marsConn);
|
||||
//With MARS we can have multiple active results sets on the same connection
|
||||
using (SqlDataReader titlesReader = await titlesCmd.ExecuteReaderAsync())
|
||||
using (SqlDataReader authorsReader = await authorsCmd.ExecuteReaderAsync())
|
||||
{
|
||||
await authorsReader.ReadAsync();
|
||||
|
||||
string temptable = "[#" + Guid.NewGuid().ToString("N") + "]";
|
||||
using (SqlConnection destConn = new SqlConnection(connectionString))
|
||||
{
|
||||
await destConn.OpenAsync();
|
||||
using (SqlCommand destCmd = new SqlCommand(string.Format(createDestTableStatement, temptable), destConn))
|
||||
{
|
||||
await destCmd.ExecuteNonQueryAsync();
|
||||
using (SqlBulkCopy bcp = new SqlBulkCopy(destConn))
|
||||
{
|
||||
bcp.DestinationTableName = temptable;
|
||||
await bcp.WriteToServerAsync(titlesReader);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// </Snippet1>
|
|
@ -0,0 +1,70 @@
|
|||
using System;
|
||||
// <Snippet1>
|
||||
using Microsoft.Data.SqlClient;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
class Program
|
||||
{
|
||||
static void Main()
|
||||
{
|
||||
string connectionString =
|
||||
"Persist Security Info=False;Integrated Security=SSPI;database=Northwind;server=(local)";
|
||||
Task task = ExecuteSqlTransaction(connectionString);
|
||||
task.Wait();
|
||||
}
|
||||
|
||||
static async Task ExecuteSqlTransaction(string connectionString)
|
||||
{
|
||||
using (SqlConnection connection = new SqlConnection(connectionString))
|
||||
{
|
||||
await connection.OpenAsync();
|
||||
|
||||
SqlCommand command = connection.CreateCommand();
|
||||
SqlTransaction transaction = null;
|
||||
|
||||
// Start a local transaction.
|
||||
transaction = await Task.Run<SqlTransaction>(
|
||||
() => connection.BeginTransaction("SampleTransaction")
|
||||
);
|
||||
|
||||
// Must assign both transaction object and connection
|
||||
// to Command object for a pending local transaction
|
||||
command.Connection = connection;
|
||||
command.Transaction = transaction;
|
||||
|
||||
try {
|
||||
command.CommandText =
|
||||
"Insert into Region (RegionID, RegionDescription) VALUES (555, 'Description')";
|
||||
await command.ExecuteNonQueryAsync();
|
||||
|
||||
command.CommandText =
|
||||
"Insert into Region (RegionID, RegionDescription) VALUES (556, 'Description')";
|
||||
await command.ExecuteNonQueryAsync();
|
||||
|
||||
// Attempt to commit the transaction.
|
||||
await Task.Run(() => transaction.Commit());
|
||||
Console.WriteLine("Both records are written to database.");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine("Commit Exception Type: {0}", ex.GetType());
|
||||
Console.WriteLine(" Message: {0}", ex.Message);
|
||||
|
||||
// Attempt to roll back the transaction.
|
||||
try
|
||||
{
|
||||
transaction.Rollback();
|
||||
}
|
||||
catch (Exception ex2)
|
||||
{
|
||||
// This catch block will handle any errors that may have occurred
|
||||
// on the server that would cause the rollback to fail, such as
|
||||
// a closed connection.
|
||||
Console.WriteLine("Rollback Exception Type: {0}", ex2.GetType());
|
||||
Console.WriteLine(" Message: {0}", ex2.Message);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// </Snippet1>
|
|
@ -0,0 +1,173 @@
|
|||
// <Snippet1>
|
||||
using System;
|
||||
using Microsoft.Data.SqlClient;
|
||||
using System.Diagnostics;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace PerformanceCounterTest
|
||||
{
|
||||
class Program
|
||||
{
|
||||
PerformanceCounter[] PerfCounters = new PerformanceCounter[10];
|
||||
SqlConnection connection = new SqlConnection();
|
||||
|
||||
static void Main()
|
||||
{
|
||||
Program prog = new Program();
|
||||
// Open a connection and create the performance counters.
|
||||
prog.connection.ConnectionString =
|
||||
GetIntegratedSecurityConnectionString();
|
||||
prog.SetUpPerformanceCounters();
|
||||
Console.WriteLine("Available Performance Counters:");
|
||||
|
||||
// Create the connections and display the results.
|
||||
prog.CreateConnections();
|
||||
Console.WriteLine("Press Enter to finish.");
|
||||
Console.ReadLine();
|
||||
}
|
||||
|
||||
private void CreateConnections()
|
||||
{
|
||||
// List the Performance counters.
|
||||
WritePerformanceCounters();
|
||||
|
||||
// Create 4 connections and display counter information.
|
||||
SqlConnection connection1 = new SqlConnection(
|
||||
GetIntegratedSecurityConnectionString());
|
||||
connection1.Open();
|
||||
Console.WriteLine("Opened the 1st Connection:");
|
||||
WritePerformanceCounters();
|
||||
|
||||
SqlConnection connection2 = new SqlConnection(
|
||||
GetSqlConnectionStringDifferent());
|
||||
connection2.Open();
|
||||
Console.WriteLine("Opened the 2nd Connection:");
|
||||
WritePerformanceCounters();
|
||||
|
||||
SqlConnection connection3 = new SqlConnection(
|
||||
GetSqlConnectionString());
|
||||
connection3.Open();
|
||||
Console.WriteLine("Opened the 3rd Connection:");
|
||||
WritePerformanceCounters();
|
||||
|
||||
SqlConnection connection4 = new SqlConnection(
|
||||
GetSqlConnectionString());
|
||||
connection4.Open();
|
||||
Console.WriteLine("Opened the 4th Connection:");
|
||||
WritePerformanceCounters();
|
||||
|
||||
connection1.Close();
|
||||
Console.WriteLine("Closed the 1st Connection:");
|
||||
WritePerformanceCounters();
|
||||
|
||||
connection2.Close();
|
||||
Console.WriteLine("Closed the 2nd Connection:");
|
||||
WritePerformanceCounters();
|
||||
|
||||
connection3.Close();
|
||||
Console.WriteLine("Closed the 3rd Connection:");
|
||||
WritePerformanceCounters();
|
||||
|
||||
connection4.Close();
|
||||
Console.WriteLine("Closed the 4th Connection:");
|
||||
WritePerformanceCounters();
|
||||
}
|
||||
|
||||
private enum ADO_Net_Performance_Counters
|
||||
{
|
||||
NumberOfActiveConnectionPools,
|
||||
NumberOfReclaimedConnections,
|
||||
HardConnectsPerSecond,
|
||||
HardDisconnectsPerSecond,
|
||||
NumberOfActiveConnectionPoolGroups,
|
||||
NumberOfInactiveConnectionPoolGroups,
|
||||
NumberOfInactiveConnectionPools,
|
||||
NumberOfNonPooledConnections,
|
||||
NumberOfPooledConnections,
|
||||
NumberOfStasisConnections
|
||||
// The following performance counters are more expensive to track.
|
||||
// Enable ConnectionPoolPerformanceCounterDetail in your config file.
|
||||
// SoftConnectsPerSecond
|
||||
// SoftDisconnectsPerSecond
|
||||
// NumberOfActiveConnections
|
||||
// NumberOfFreeConnections
|
||||
}
|
||||
|
||||
private void SetUpPerformanceCounters()
|
||||
{
|
||||
connection.Close();
|
||||
this.PerfCounters = new PerformanceCounter[10];
|
||||
string instanceName = GetInstanceName();
|
||||
Type apc = typeof(ADO_Net_Performance_Counters);
|
||||
int i = 0;
|
||||
foreach (string s in Enum.GetNames(apc))
|
||||
{
|
||||
this.PerfCounters[i] = new PerformanceCounter();
|
||||
this.PerfCounters[i].CategoryName = ".NET Data Provider for SqlServer";
|
||||
this.PerfCounters[i].CounterName = s;
|
||||
this.PerfCounters[i].InstanceName = instanceName;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
[DllImport("kernel32.dll", SetLastError = true)]
|
||||
static extern int GetCurrentProcessId();
|
||||
|
||||
private string GetInstanceName()
|
||||
{
|
||||
//This works for Winforms apps.
|
||||
string instanceName =
|
||||
System.Reflection.Assembly.GetEntryAssembly().GetName().Name;
|
||||
|
||||
// Must replace special characters like (, ), #, /, \\
|
||||
string instanceName2 =
|
||||
AppDomain.CurrentDomain.FriendlyName.ToString().Replace('(', '[')
|
||||
.Replace(')', ']').Replace('#', '_').Replace('/', '_').Replace('\\', '_');
|
||||
|
||||
// For ASP.NET applications your instanceName will be your CurrentDomain's
|
||||
// FriendlyName. Replace the line above that sets the instanceName with this:
|
||||
// instanceName = AppDomain.CurrentDomain.FriendlyName.ToString().Replace('(','[')
|
||||
// .Replace(')',']').Replace('#','_').Replace('/','_').Replace('\\','_');
|
||||
|
||||
string pid = GetCurrentProcessId().ToString();
|
||||
instanceName = instanceName + "[" + pid + "]";
|
||||
Console.WriteLine("Instance Name: {0}", instanceName);
|
||||
Console.WriteLine("---------------------------");
|
||||
return instanceName;
|
||||
}
|
||||
|
||||
private void WritePerformanceCounters()
|
||||
{
|
||||
Console.WriteLine("---------------------------");
|
||||
foreach (PerformanceCounter p in this.PerfCounters)
|
||||
{
|
||||
Console.WriteLine("{0} = {1}", p.CounterName, p.NextValue());
|
||||
}
|
||||
Console.WriteLine("---------------------------");
|
||||
}
|
||||
|
||||
private static string GetIntegratedSecurityConnectionString()
|
||||
{
|
||||
// To avoid storing the connection string in your code,
|
||||
// you can retrieve it from a configuration file.
|
||||
return @"Data Source=.;Integrated Security=True;" +
|
||||
"Initial Catalog=AdventureWorks";
|
||||
}
|
||||
private static string GetSqlConnectionString()
|
||||
{
|
||||
// To avoid storing the connection string in your code,
|
||||
// you can retrieve it from a configuration file.
|
||||
return @"Data Source=.;User Id=<myUserID>;Password=<myPassword>;" +
|
||||
"Initial Catalog=AdventureWorks";
|
||||
}
|
||||
|
||||
private static string GetSqlConnectionStringDifferent()
|
||||
{
|
||||
// To avoid storing the connection string in your code,
|
||||
// you can retrieve it from a configuration file.
|
||||
return @"Initial Catalog=AdventureWorks;Data Source=.;" +
|
||||
"User Id=<myUserID>;Password=<myPassword>;";
|
||||
}
|
||||
}
|
||||
}
|
||||
// </Snippet1>
|
|
@ -0,0 +1,107 @@
|
|||
using System;
|
||||
using System.Data;
|
||||
using Microsoft.Data.SqlClient;
|
||||
|
||||
namespace AutoNumberTest
|
||||
{
|
||||
class Program
|
||||
{
|
||||
// <Snippet1>
|
||||
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();
|
||||
}
|
||||
}
|
||||
// </Snippet1>
|
||||
}
|
||||
}
|
|
@ -0,0 +1,226 @@
|
|||
// <Snippet1>
|
||||
using System;
|
||||
using System.Data;
|
||||
using Microsoft.Data.SqlClient;
|
||||
using System.IO;
|
||||
using System.Threading.Tasks;
|
||||
using System.Xml;
|
||||
|
||||
namespace StreamingFromServer
|
||||
{
|
||||
class Program
|
||||
{
|
||||
private const string connectionString = @"Server=localhost;Database=Demo;Integrated Security=true";
|
||||
|
||||
static void Main(string[] args)
|
||||
{
|
||||
CopyBinaryValueToFile().Wait();
|
||||
PrintTextValues().Wait();
|
||||
PrintXmlValues().Wait();
|
||||
PrintXmlValuesViaNVarChar().Wait();
|
||||
|
||||
Console.WriteLine("Done");
|
||||
}
|
||||
|
||||
// Application retrieving a large BLOB from SQL Server in .NET 4.5 using the new asynchronous capability
|
||||
private static async Task CopyBinaryValueToFile()
|
||||
{
|
||||
using (SqlConnection connection = new SqlConnection(connectionString))
|
||||
{
|
||||
await connection.OpenAsync();
|
||||
using (SqlCommand command = new SqlCommand("SELECT [bindata] FROM [Streams] WHERE [id]=@id", connection))
|
||||
{
|
||||
command.Parameters.AddWithValue("id", 1);
|
||||
|
||||
// The reader needs to be executed with the SequentialAccess behavior to enable network streaming
|
||||
// Otherwise ReadAsync will buffer the entire BLOB into memory which can cause scalability issues or even OutOfMemoryExceptions
|
||||
using (SqlDataReader reader = await command.ExecuteReaderAsync(CommandBehavior.SequentialAccess))
|
||||
{
|
||||
if (await reader.ReadAsync())
|
||||
{
|
||||
if (!(await reader.IsDBNullAsync(0)))
|
||||
{
|
||||
using (FileStream file = new FileStream("binarydata.bin", FileMode.Create, FileAccess.Write))
|
||||
{
|
||||
using (Stream data = reader.GetStream(0))
|
||||
{
|
||||
|
||||
// Asynchronously copy the stream from the server to the file we just created
|
||||
await data.CopyToAsync(file);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Application transferring a large Text File from SQL Server
|
||||
private static async Task PrintTextValues()
|
||||
{
|
||||
using (SqlConnection connection = new SqlConnection(connectionString))
|
||||
{
|
||||
await connection.OpenAsync();
|
||||
using (SqlCommand command = new SqlCommand("SELECT [id], [textdata] FROM [Streams]", connection))
|
||||
{
|
||||
|
||||
// The reader needs to be executed with the SequentialAccess behavior to enable network streaming
|
||||
// Otherwise ReadAsync will buffer the entire text document into memory which can cause scalability issues or even OutOfMemoryExceptions
|
||||
using (SqlDataReader reader = await command.ExecuteReaderAsync(CommandBehavior.SequentialAccess))
|
||||
{
|
||||
while (await reader.ReadAsync())
|
||||
{
|
||||
Console.Write("{0}: ", reader.GetInt32(0));
|
||||
|
||||
if (await reader.IsDBNullAsync(1))
|
||||
{
|
||||
Console.Write("(NULL)");
|
||||
}
|
||||
else
|
||||
{
|
||||
char[] buffer = new char[4096];
|
||||
int charsRead = 0;
|
||||
using (TextReader data = reader.GetTextReader(1))
|
||||
{
|
||||
do
|
||||
{
|
||||
// Grab each chunk of text and write it to the console
|
||||
// If you are writing to a TextWriter you should use WriteAsync or WriteLineAsync
|
||||
charsRead = await data.ReadAsync(buffer, 0, buffer.Length);
|
||||
Console.Write(buffer, 0, charsRead);
|
||||
} while (charsRead > 0);
|
||||
}
|
||||
}
|
||||
|
||||
Console.WriteLine();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Application transferring a large Xml Document from SQL Server
|
||||
private static async Task PrintXmlValues()
|
||||
{
|
||||
using (SqlConnection connection = new SqlConnection(connectionString))
|
||||
{
|
||||
await connection.OpenAsync();
|
||||
using (SqlCommand command = new SqlCommand("SELECT [id], [xmldata] FROM [Streams]", connection))
|
||||
{
|
||||
|
||||
// The reader needs to be executed with the SequentialAccess behavior to enable network streaming
|
||||
// Otherwise ReadAsync will buffer the entire Xml Document into memory which can cause scalability issues or even OutOfMemoryExceptions
|
||||
using (SqlDataReader reader = await command.ExecuteReaderAsync(CommandBehavior.SequentialAccess))
|
||||
{
|
||||
while (await reader.ReadAsync())
|
||||
{
|
||||
Console.WriteLine("{0}: ", reader.GetInt32(0));
|
||||
|
||||
if (await reader.IsDBNullAsync(1))
|
||||
{
|
||||
Console.WriteLine("\t(NULL)");
|
||||
}
|
||||
else
|
||||
{
|
||||
using (XmlReader xmlReader = reader.GetXmlReader(1))
|
||||
{
|
||||
int depth = 1;
|
||||
// NOTE: The XmlReader returned by GetXmlReader does NOT support async operations
|
||||
// See the example below (PrintXmlValuesViaNVarChar) for how to get an XmlReader with asynchronous capabilities
|
||||
while (xmlReader.Read())
|
||||
{
|
||||
switch (xmlReader.NodeType)
|
||||
{
|
||||
case XmlNodeType.Element:
|
||||
Console.WriteLine("{0}<{1}>", new string('\t', depth), xmlReader.Name);
|
||||
depth++;
|
||||
break;
|
||||
case XmlNodeType.Text:
|
||||
Console.WriteLine("{0}{1}", new string('\t', depth), xmlReader.Value);
|
||||
break;
|
||||
case XmlNodeType.EndElement:
|
||||
depth--;
|
||||
Console.WriteLine("{0}</{1}>", new string('\t', depth), xmlReader.Name);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Application transferring a large Xml Document from SQL Server
|
||||
// This goes via NVarChar and TextReader to enable asynchronous reading
|
||||
private static async Task PrintXmlValuesViaNVarChar()
|
||||
{
|
||||
XmlReaderSettings xmlSettings = new XmlReaderSettings()
|
||||
{
|
||||
// Async must be explicitly enabled in the XmlReaderSettings otherwise the XmlReader will throw exceptions when async methods are called
|
||||
Async = true,
|
||||
// Since we will immediately wrap the TextReader we are creating in an XmlReader, we will permit the XmlReader to take care of closing\disposing it
|
||||
CloseInput = true,
|
||||
// If the Xml you are reading is not a valid document (as per <https://docs.microsoft.com/previous-versions/dotnet/netframework-4.0/6bts1x50(v=vs.100)>) you will need to set the conformance level to Fragment
|
||||
ConformanceLevel = ConformanceLevel.Fragment
|
||||
};
|
||||
|
||||
using (SqlConnection connection = new SqlConnection(connectionString))
|
||||
{
|
||||
await connection.OpenAsync();
|
||||
|
||||
// Cast the XML into NVarChar to enable GetTextReader - trying to use GetTextReader on an XML type will throw an exception
|
||||
using (SqlCommand command = new SqlCommand("SELECT [id], CAST([xmldata] AS NVARCHAR(MAX)) FROM [Streams]", connection))
|
||||
{
|
||||
|
||||
// The reader needs to be executed with the SequentialAccess behavior to enable network streaming
|
||||
// Otherwise ReadAsync will buffer the entire Xml Document into memory which can cause scalability issues or even OutOfMemoryExceptions
|
||||
using (SqlDataReader reader = await command.ExecuteReaderAsync(CommandBehavior.SequentialAccess))
|
||||
{
|
||||
while (await reader.ReadAsync())
|
||||
{
|
||||
Console.WriteLine("{0}:", reader.GetInt32(0));
|
||||
|
||||
if (await reader.IsDBNullAsync(1))
|
||||
{
|
||||
Console.WriteLine("\t(NULL)");
|
||||
}
|
||||
else
|
||||
{
|
||||
// Grab the row as a TextReader, then create an XmlReader on top of it
|
||||
// We are not keeping a reference to the TextReader since the XmlReader is created with the "CloseInput" setting (so it will close the TextReader when needed)
|
||||
using (XmlReader xmlReader = XmlReader.Create(reader.GetTextReader(1), xmlSettings))
|
||||
{
|
||||
int depth = 1;
|
||||
// The XmlReader above now supports asynchronous operations, so we can use ReadAsync here
|
||||
while (await xmlReader.ReadAsync())
|
||||
{
|
||||
switch (xmlReader.NodeType)
|
||||
{
|
||||
case XmlNodeType.Element:
|
||||
Console.WriteLine("{0}<{1}>", new string('\t', depth), xmlReader.Name);
|
||||
depth++;
|
||||
break;
|
||||
case XmlNodeType.Text:
|
||||
// Depending on what your data looks like, you should either use Value or GetValueAsync
|
||||
// Value has less overhead (since it doesn't create a Task), but it may also block if additional data is required
|
||||
Console.WriteLine("{0}{1}", new string('\t', depth), await xmlReader.GetValueAsync());
|
||||
break;
|
||||
case XmlNodeType.EndElement:
|
||||
depth--;
|
||||
Console.WriteLine("{0}</{1}>", new string('\t', depth), xmlReader.Name);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// </Snippet1>
|
|
@ -0,0 +1,72 @@
|
|||
// <Snippet1>
|
||||
using System;
|
||||
using System.Data;
|
||||
using Microsoft.Data.SqlClient;
|
||||
using System.IO;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace StreamingFromServerToAnother
|
||||
{
|
||||
class Program
|
||||
{
|
||||
private const string connectionString = @"Server=localhost;Database=Demo2;Integrated Security=true";
|
||||
|
||||
static void Main(string[] args)
|
||||
{
|
||||
// For this example, we don't want to cancel
|
||||
// So we can pass in a "blank" cancellation token
|
||||
E2EStream(CancellationToken.None).Wait();
|
||||
|
||||
Console.WriteLine("Done");
|
||||
}
|
||||
|
||||
// Streaming from one SQL Server to Another One
|
||||
private static async Task E2EStream(CancellationToken cancellationToken)
|
||||
{
|
||||
using (SqlConnection readConn = new SqlConnection(connectionString))
|
||||
{
|
||||
using (SqlConnection writeConn = new SqlConnection(connectionString))
|
||||
{
|
||||
|
||||
// Note that we are using the same cancellation token for calls to both connections\commands
|
||||
// Also we can start both the connection opening asynchronously, and then wait for both to complete
|
||||
Task openReadConn = readConn.OpenAsync(cancellationToken);
|
||||
Task openWriteConn = writeConn.OpenAsync(cancellationToken);
|
||||
await Task.WhenAll(openReadConn, openWriteConn);
|
||||
|
||||
using (SqlCommand readCmd = new SqlCommand("SELECT [bindata] FROM [BinaryStreams]", readConn))
|
||||
{
|
||||
using (SqlCommand writeCmd = new SqlCommand("INSERT INTO [BinaryStreamsCopy] (bindata) VALUES (@bindata)", writeConn))
|
||||
{
|
||||
|
||||
// Add an empty parameter to the write command which will be used for the streams we are copying
|
||||
// Size is set to -1 to indicate "MAX"
|
||||
SqlParameter streamParameter = writeCmd.Parameters.Add("@bindata", SqlDbType.Binary, -1);
|
||||
|
||||
// The reader needs to be executed with the SequentialAccess behavior to enable network streaming
|
||||
// Otherwise ReadAsync will buffer the entire BLOB into memory which can cause scalability issues or even OutOfMemoryExceptions
|
||||
using (SqlDataReader reader = await readCmd.ExecuteReaderAsync(CommandBehavior.SequentialAccess, cancellationToken))
|
||||
{
|
||||
while (await reader.ReadAsync(cancellationToken))
|
||||
{
|
||||
// Grab a stream to the binary data in the source database
|
||||
using (Stream dataStream = reader.GetStream(0))
|
||||
{
|
||||
|
||||
// Set the parameter value to the stream source that was opened
|
||||
streamParameter.Value = dataStream;
|
||||
|
||||
// Asynchronously send data from one database to another
|
||||
await writeCmd.ExecuteNonQueryAsync(cancellationToken);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// </Snippet1>
|
|
@ -0,0 +1,140 @@
|
|||
// <Snippet1>
|
||||
using System;
|
||||
using System.Data;
|
||||
using Microsoft.Data.SqlClient;
|
||||
using System.IO;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace StreamingToServer
|
||||
{
|
||||
class Program
|
||||
{
|
||||
private const string connectionString = @"Server=localhost;Database=Demo2;Integrated Security=true";
|
||||
|
||||
static void Main(string[] args)
|
||||
{
|
||||
CreateDemoFiles();
|
||||
|
||||
StreamBLOBToServer().Wait();
|
||||
StreamTextToServer().Wait();
|
||||
|
||||
// Create a CancellationTokenSource that will be cancelled after 100ms
|
||||
// Typically this token source will be cancelled by a user request (e.g. a Cancel button)
|
||||
CancellationTokenSource tokenSource = new CancellationTokenSource();
|
||||
tokenSource.CancelAfter(100);
|
||||
try
|
||||
{
|
||||
CancelBLOBStream(tokenSource.Token).Wait();
|
||||
}
|
||||
catch (AggregateException ex)
|
||||
{
|
||||
// Cancelling an async operation will throw an exception
|
||||
// Since we are using the Task's Wait method, this exception will be wrapped in an AggregateException
|
||||
// If you were using the 'await' keyword, the compiler would take care of unwrapping the AggregateException
|
||||
// Depending on when the cancellation occurs, you can either get an error from SQL Server or from .Net
|
||||
if ((ex.InnerException is SqlException) || (ex.InnerException is TaskCanceledException))
|
||||
{
|
||||
// This is an expected exception
|
||||
Console.WriteLine("Got expected exception: {0}", ex.InnerException.Message);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Did not expect this exception - re-throw it
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
Console.WriteLine("Done");
|
||||
}
|
||||
|
||||
// This is used to generate the files which are used by the other sample methods
|
||||
private static void CreateDemoFiles()
|
||||
{
|
||||
Random rand = new Random();
|
||||
byte[] data = new byte[1024];
|
||||
rand.NextBytes(data);
|
||||
|
||||
using (FileStream file = File.Open("binarydata.bin", FileMode.Create))
|
||||
{
|
||||
file.Write(data, 0, data.Length);
|
||||
}
|
||||
|
||||
using (StreamWriter writer = new StreamWriter(File.Open("textdata.txt", FileMode.Create)))
|
||||
{
|
||||
writer.Write(Convert.ToBase64String(data));
|
||||
}
|
||||
}
|
||||
|
||||
// Application transferring a large BLOB to SQL Server
|
||||
private static async Task StreamBLOBToServer()
|
||||
{
|
||||
using (SqlConnection conn = new SqlConnection(connectionString))
|
||||
{
|
||||
await conn.OpenAsync();
|
||||
using (SqlCommand cmd = new SqlCommand("INSERT INTO [BinaryStreams] (bindata) VALUES (@bindata)", conn))
|
||||
{
|
||||
using (FileStream file = File.Open("binarydata.bin", FileMode.Open))
|
||||
{
|
||||
|
||||
// Add a parameter which uses the FileStream we just opened
|
||||
// Size is set to -1 to indicate "MAX"
|
||||
cmd.Parameters.Add("@bindata", SqlDbType.Binary, -1).Value = file;
|
||||
|
||||
// Send the data to the server asynchronously
|
||||
await cmd.ExecuteNonQueryAsync();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Application transferring a large Text File to SQL Server
|
||||
private static async Task StreamTextToServer()
|
||||
{
|
||||
using (SqlConnection conn = new SqlConnection(connectionString))
|
||||
{
|
||||
await conn.OpenAsync();
|
||||
using (SqlCommand cmd = new SqlCommand("INSERT INTO [TextStreams] (textdata) VALUES (@textdata)", conn))
|
||||
{
|
||||
using (StreamReader file = File.OpenText("textdata.txt"))
|
||||
{
|
||||
|
||||
// Add a parameter which uses the StreamReader we just opened
|
||||
// Size is set to -1 to indicate "MAX"
|
||||
cmd.Parameters.Add("@textdata", SqlDbType.NVarChar, -1).Value = file;
|
||||
|
||||
// Send the data to the server asynchronously
|
||||
await cmd.ExecuteNonQueryAsync();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Cancelling the transfer of a large BLOB
|
||||
private static async Task CancelBLOBStream(CancellationToken cancellationToken)
|
||||
{
|
||||
using (SqlConnection conn = new SqlConnection(connectionString))
|
||||
{
|
||||
// We can cancel not only sending the data to the server, but also opening the connection
|
||||
await conn.OpenAsync(cancellationToken);
|
||||
|
||||
// Artificially delay the command by 100ms
|
||||
using (SqlCommand cmd = new SqlCommand("WAITFOR DELAY '00:00:00:100';INSERT INTO [BinaryStreams] (bindata) VALUES (@bindata)", conn))
|
||||
{
|
||||
using (FileStream file = File.Open("binarydata.bin", FileMode.Open))
|
||||
{
|
||||
|
||||
// Add a parameter which uses the FileStream we just opened
|
||||
// Size is set to -1 to indicate "MAX"
|
||||
cmd.Parameters.Add("@bindata", SqlDbType.Binary, -1).Value = file;
|
||||
|
||||
// Send the data to the server asynchronously
|
||||
// Pass the cancellation token such that the command will be cancelled if needed
|
||||
await cmd.ExecuteNonQueryAsync(cancellationToken);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// </Snippet1>
|
|
@ -0,0 +1,27 @@
|
|||
using System;
|
||||
// <Snippet1>
|
||||
using Microsoft.Data.SqlClient;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
class A {
|
||||
public static void Main()
|
||||
{
|
||||
using (SqlConnection conn = new SqlConnection("Data Source=(local); Initial Catalog=NorthWind; Integrated Security=SSPI"))
|
||||
{
|
||||
SqlCommand command = new SqlCommand("SELECT TOP 2 * FROM dbo.Orders", conn);
|
||||
|
||||
int result = A.Method(conn, command).Result;
|
||||
|
||||
SqlDataReader reader = command.ExecuteReader();
|
||||
while (reader.Read())
|
||||
Console.WriteLine(reader[0]);
|
||||
}
|
||||
}
|
||||
|
||||
static async Task<int> Method(SqlConnection conn, SqlCommand cmd) {
|
||||
await conn.OpenAsync();
|
||||
await cmd.ExecuteNonQueryAsync();
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
// </Snippet1>
|
|
@ -0,0 +1,84 @@
|
|||
using System;
|
||||
using System.Data;
|
||||
using Microsoft.Data.SqlClient;
|
||||
|
||||
class Program
|
||||
{
|
||||
static void Main()
|
||||
{
|
||||
string cnnString = "Data Source=(local);Initial Catalog=pubs;"
|
||||
+ "Integrated Security=SSPI";
|
||||
SqlConnection connection = new SqlConnection(cnnString);
|
||||
RetrievePubLogo(connection);
|
||||
}
|
||||
|
||||
private static void RetrievePubLogo(SqlConnection connection)
|
||||
{
|
||||
// <Snippet1>
|
||||
// Assumes that connection is a valid SqlConnection object.
|
||||
SqlCommand command = new SqlCommand(
|
||||
"SELECT pub_id, logo FROM pub_info", connection);
|
||||
|
||||
// Writes the BLOB to a file (*.bmp).
|
||||
System.IO.FileStream stream;
|
||||
// Streams the BLOB to the FileStream object.
|
||||
System.IO.BinaryWriter writer;
|
||||
|
||||
// Size of the BLOB buffer.
|
||||
int bufferSize = 100;
|
||||
// The BLOB byte[] buffer to be filled by GetBytes.
|
||||
byte[] outByte = new byte[bufferSize];
|
||||
// The bytes returned from GetBytes.
|
||||
long retval;
|
||||
// The starting position in the BLOB output.
|
||||
long startIndex = 0;
|
||||
|
||||
// The publisher id to use in the file name.
|
||||
string pubID = "";
|
||||
|
||||
// Open the connection and read data into the DataReader.
|
||||
connection.Open();
|
||||
SqlDataReader reader = command.ExecuteReader(CommandBehavior.SequentialAccess);
|
||||
|
||||
while (reader.Read())
|
||||
{
|
||||
// Get the publisher id, which must occur before getting the logo.
|
||||
pubID = reader.GetString(0);
|
||||
|
||||
// Create a file to hold the output.
|
||||
stream = new System.IO.FileStream(
|
||||
"logo" + pubID + ".bmp", System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Write);
|
||||
writer = new System.IO.BinaryWriter(stream);
|
||||
|
||||
// Reset the starting byte for the new BLOB.
|
||||
startIndex = 0;
|
||||
|
||||
// Read bytes into outByte[] and retain the number of bytes returned.
|
||||
retval = reader.GetBytes(1, startIndex, outByte, 0, bufferSize);
|
||||
|
||||
// Continue while there are bytes beyond the size of the buffer.
|
||||
while (retval == bufferSize)
|
||||
{
|
||||
writer.Write(outByte);
|
||||
writer.Flush();
|
||||
|
||||
// Reposition start index to end of last buffer and fill buffer.
|
||||
startIndex += bufferSize;
|
||||
retval = reader.GetBytes(1, startIndex, outByte, 0, bufferSize);
|
||||
}
|
||||
|
||||
// Write the remaining buffer.
|
||||
writer.Write(outByte, 0, (int)retval);
|
||||
writer.Flush();
|
||||
|
||||
// Close the output file.
|
||||
writer.Close();
|
||||
stream.Close();
|
||||
}
|
||||
|
||||
// Close the reader and the connection.
|
||||
reader.Close();
|
||||
connection.Close();
|
||||
// </Snippet1>
|
||||
}
|
||||
}
|
|
@ -0,0 +1,43 @@
|
|||
using System;
|
||||
using System.Data;
|
||||
// <Snippet2>
|
||||
using Microsoft.Data.SqlClient;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
class A
|
||||
{
|
||||
static void ProductList(IAsyncResult result) { }
|
||||
|
||||
public static void Main()
|
||||
{
|
||||
// AsyncCallback productList = new AsyncCallback(ProductList);
|
||||
// SqlConnection conn = new SqlConnection("Data Source=(local); Initial Catalog=NorthWind; Integrated Security=SSPI");
|
||||
// conn.Open();
|
||||
// SqlCommand cmd = new SqlCommand("select top 2 * from orders", conn);
|
||||
// IAsyncResult ia = cmd.BeginExecuteReader(productList, cmd);
|
||||
|
||||
AsyncCallback productList = new AsyncCallback(ProductList);
|
||||
SqlConnection conn = new SqlConnection("Data Source=(local); Initial Catalog=NorthWind; Integrated Security=SSPI");
|
||||
conn.OpenAsync().ContinueWith((task) => {
|
||||
SqlCommand cmd = new SqlCommand("select top 2 * from orders", conn);
|
||||
IAsyncResult ia = cmd.BeginExecuteReader(productList, cmd);
|
||||
}, TaskContinuationOptions.OnlyOnRanToCompletion);
|
||||
}
|
||||
}
|
||||
// </Snippet2>
|
||||
|
||||
class B
|
||||
{
|
||||
static void ProductList(IAsyncResult result) { }
|
||||
|
||||
public static void Main()
|
||||
{
|
||||
// <Snippet1>
|
||||
AsyncCallback productList = new AsyncCallback(ProductList);
|
||||
SqlConnection conn = new SqlConnection("Data Source=(local); Initial Catalog=NorthWind; Integrated Security=SSPI");
|
||||
conn.Open();
|
||||
SqlCommand cmd = new SqlCommand("select top 2 * from orders", conn);
|
||||
IAsyncResult ia = cmd.BeginExecuteReader(productList, cmd);
|
||||
// </Snippet1>
|
||||
}
|
||||
}
|
|
@ -0,0 +1,97 @@
|
|||
using System;
|
||||
using System.Data;
|
||||
using Microsoft.Data.SqlClient;
|
||||
|
||||
class Program
|
||||
{
|
||||
static void Main()
|
||||
{
|
||||
string connectionString = GetConnectionString();
|
||||
MergeIdentityColumns(connectionString);
|
||||
Console.ReadLine();
|
||||
}
|
||||
|
||||
// <Snippet1>
|
||||
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]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// </Snippet1>
|
||||
|
||||
// <Snippet2>
|
||||
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;
|
||||
}
|
||||
}
|
||||
// </Snippet2>
|
||||
|
||||
static private string GetConnectionString()
|
||||
{
|
||||
// To avoid storing the connection string in your code,
|
||||
// you can retrieve it from a configuration file.
|
||||
return "Data Source=(local);Initial Catalog=Northwind;"
|
||||
+ "Integrated Security=true";
|
||||
}
|
||||
}
|
|
@ -0,0 +1,71 @@
|
|||
using System;
|
||||
using System.Data;
|
||||
using Microsoft.Data.SqlClient;
|
||||
|
||||
class Program
|
||||
{
|
||||
static void Main()
|
||||
{
|
||||
string connectionString = GetConnectionString();
|
||||
RetrieveIdentity(connectionString);
|
||||
Console.ReadLine();
|
||||
}
|
||||
|
||||
// <Snippet1>
|
||||
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]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// </Snippet1>
|
||||
|
||||
static private string GetConnectionString()
|
||||
{
|
||||
// To avoid storing the connection string in your code,
|
||||
// you can retrieve it from a configuration file.
|
||||
return "Data Source=(local);Initial Catalog=Northwind;"
|
||||
+ "Integrated Security=true";
|
||||
}
|
||||
}
|
|
@ -0,0 +1,70 @@
|
|||
// <Snippet1>
|
||||
using System;
|
||||
using System.Data;
|
||||
using Microsoft.Data.SqlClient;
|
||||
|
||||
class Program
|
||||
{
|
||||
static void Main()
|
||||
{
|
||||
string connectionString = GetConnectionString();
|
||||
ReturnIdentity(connectionString);
|
||||
// Console.ReadLine();
|
||||
}
|
||||
|
||||
private static void ReturnIdentity(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 a SqlCommand to execute the stored procedure.
|
||||
adapter.InsertCommand = new SqlCommand("InsertCategory", connection);
|
||||
adapter.InsertCommand.CommandType = CommandType.StoredProcedure;
|
||||
|
||||
// Create a parameter for the ReturnValue.
|
||||
SqlParameter parameter = adapter.InsertCommand.Parameters.Add("@RowCount", SqlDbType.Int);
|
||||
parameter.Direction = ParameterDirection.ReturnValue;
|
||||
|
||||
// Create an input parameter for the CategoryName.
|
||||
// You do not need to specify direction for input parameters.
|
||||
adapter.InsertCommand.Parameters.Add("@CategoryName", SqlDbType.NChar, 15, "CategoryName");
|
||||
|
||||
// Create an output parameter for the new identity value.
|
||||
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 categoryRow = categories.NewRow();
|
||||
categoryRow["CategoryName"] = "New Beverages";
|
||||
categories.Rows.Add(categoryRow);
|
||||
|
||||
// Update the database.
|
||||
adapter.Update(categories);
|
||||
|
||||
// Retrieve the ReturnValue.
|
||||
Int rowCount = (Int)adapter.InsertCommand.Parameters["@RowCount"].Value;
|
||||
|
||||
Console.WriteLine("ReturnValue: {0}", rowCount.ToString());
|
||||
Console.WriteLine("All Rows:");
|
||||
foreach (DataRow row in categories.Rows)
|
||||
{
|
||||
Console.WriteLine(" {0}: {1}", row[0], row[1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static private string GetConnectionString()
|
||||
{
|
||||
// To avoid storing the connection string in your code,
|
||||
// you can retrieve it from a configuration file.
|
||||
return "Data Source=(local);Initial Catalog=Northwind;Integrated Security=true";
|
||||
}
|
||||
}
|
||||
// </Snippet1>
|
Загрузка…
Ссылка в новой задаче