CSTrüter HomeArticlesDownloadsAbout meContact me
How to enable the filestream feature in SQL 2008 - Alternative way to store blobs(files) via SQL 2010-08-21 19:31:56
How to create a Singleton Pattern in C# 2010-08-10 22:52:52
How to prevent that threads access shared resources concurrently via Monitor. 2010-08-06 15:31:15
A quick review of the book PHP 6 and MySQL 5 for Dynamic Web Sites: Visual QuickPro Guide written by Larry Ullman 2010-08-04 21:48:58
How to prevent that threads access shared resources concurrently via Mutex. 2010-08-03 14:42:36
How to stop propagation of javascript events 2010-07-25 21:59:29
Post about how Pete the web developer fixed his sitemap 2010-07-17 15:12:02
How to setup an out of process session service 2010-07-08 17:51:46
How to display/add images from/to a SQL Database 2010-07-04 23:15:15
How to register a custom URL protocol handler 2010-06-28 20:34:01
Creating a WYSIWYG textbox for your website is actually quite simple. 2007-02-01 12:00:00
Move items between two listboxes in ASP.net(C#, VB.NET) and PHP 2008-06-12 17:07:43
Firefox word wrapping issues 2008-06-09 09:51:21
Populate a TreeView control in a windows application. 2009-08-27 16:01:03
2007-02-22 12:00:00
SQL 2008 introduced a nifty feature called Table-Valued Parameters (TVP) into its codebase. TVPs allow developers to pass sets of data to a stored procedure (i.e. passing a table to a stored procedure parameter). The first thing we need to do, is define a table type, like this: CREATE TYPE [dbo].[MyFriends] AS TABLE( [firstname] [varchar](50) NOT NULL, [lastname] [varchar](50) NOT NULL ) Create a little table for our testing purposes: CREATE TABLE [dbo].[friends]( [friendID] [int] IDENTITY(1,1) NOT NULL, [firstname] [varchar](50) NOT NULL, [lastname] [varchar](50) NOT NULL, CONSTRAINT [PK_friends] PRIMARY KEY CLUSTERED ( [friendID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] Next we create a stored procedure using our newly created table type. Note a TVP must be passed as READONLY - which means you can't modify(insert/update/delete rows) it within the body of the routine you're passing it to. CREATE PROCEDURE [dbo].[addFriends] @friends MyFriends READONLY AS BEGIN INSERT INTO friends(firstname, lastname) SELECT firstname, lastname FROM @friends END In our C# snippet we create a DataTable, add some rows to it, and pass it to our stored procedure: using (SqlConnection connection = new SqlConnection(@"Some connectionString")) { using (SqlCommand command = new SqlCommand("addFriends", connection) { CommandType = CommandType.StoredProcedure }) { DataTable dt = new DataTable(); // Add columns dt.Columns.Add("firstname", typeof(String)).MaxLength = 50; dt.Columns.Add("lastname", typeof(String)).MaxLength = 50; ; // Add some rows dt.Rows.Add(new Object[] { "Eugene", "Stander" }); dt.Rows.Add(new Object[] { "Roland", "Cooper" }); dt.Rows.Add(new Object[] { "Jacques", "Brits" }); connection.Open(); command.Parameters.Add("@friends", SqlDbType.Structured).Value = dt; command.ExecuteNonQuery(); } } How does all of this affect performance though? A few clues can be found at http://technet.microsoft.com/en-us/library/bb510489.aspx Summarized in the case of bulk inserts vs TVPs; a formatted data file on the server will perform better using a bulk insert, unless it is a complex operation with less than 1000 rows. Using a remote client process TVPs will usually perform better, unless its a direct insert with more than 1000 rows.
CREATE TYPE [dbo].[MyFriends] AS TABLE( [firstname] [varchar](50) NOT NULL, [lastname] [varchar](50) NOT NULL )
CREATE TABLE [dbo].[friends]( [friendID] [int] IDENTITY(1,1) NOT NULL, [firstname] [varchar](50) NOT NULL, [lastname] [varchar](50) NOT NULL, CONSTRAINT [PK_friends] PRIMARY KEY CLUSTERED ( [friendID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]
CREATE PROCEDURE [dbo].[addFriends] @friends MyFriends READONLY AS BEGIN INSERT INTO friends(firstname, lastname) SELECT firstname, lastname FROM @friends END
using (SqlConnection connection = new SqlConnection(@"Some connectionString")) { using (SqlCommand command = new SqlCommand("addFriends", connection) { CommandType = CommandType.StoredProcedure }) { DataTable dt = new DataTable(); // Add columns dt.Columns.Add("firstname", typeof(String)).MaxLength = 50; dt.Columns.Add("lastname", typeof(String)).MaxLength = 50; ; // Add some rows dt.Rows.Add(new Object[] { "Eugene", "Stander" }); dt.Rows.Add(new Object[] { "Roland", "Cooper" }); dt.Rows.Add(new Object[] { "Jacques", "Brits" }); connection.Open(); command.Parameters.Add("@friends", SqlDbType.Structured).Value = dt; command.ExecuteNonQuery(); } }
The company I am currently working for as software developer.
Collection of C# snippets 2010-05-22 01:06:19
Collection of MS SQL snippets 2010-05-22 00:55:15
Collection of JavaScript snippets 2010-05-22 00:37:57
Collection of ASP.net snippets 2010-05-22 00:29:56
Collection of PHP snippets 2010-05-22 00:06:45
a Parallel reference of programming languages 2009-09-10 12:48:23
a tutorial explaining how to develop a simple login using PHP and MySQL 2009-09-05 18:26:47
An article looking at adding some kind of event driven model to PHP 5 2008-07-28 12:48:09
It is very simple creating your own rss reader, the following article looks at a few methods of doing this. 2008-06-23 13:18:25
A quick reference about working with dropdown boxes (select element) in javascript. 2007-02-17 16:36:41
Collection of funny programming articles 2006-10-08 14:23:43