Передача DataTable в хранимую процедуру.Есть ли способ лучше? - PullRequest
3 голосов
/ 07 мая 2010

Можно ли каким-либо образом передать данные в SQL Server 2005 или 2008?

Мне известен стандартный способ передачи XML SP. И для этого можно легко преобразовать данные в XML.

А как насчет передачи объекта .NET в SP? Это возможно?

Я помню, как слышал о совместной работе SQL и CLR в 2008 году, но я так и не понял ... Может быть, это означает, что вы можете ссылаться на объекты .NET внутри хранимой процедуры?

Ответы [ 2 ]

8 голосов
/ 07 мая 2010

Вы можете создать пользовательский тип таблицы в SQL.Затем в хранимой процедуре примите параметр типа (ваш определяемый пользователем тип таблицы) и передайте в качестве значения хранимой процедуры набор данных.

Вот несколько примеров из http://msdn.microsoft.com/en-us/library/bb675163.aspx:

В SQL:

CREATE TYPE dbo.CategoryTableType AS TABLE
    ( CategoryID int, CategoryName nvarchar(50) )

Тогда:

// Assumes connection is an open SqlConnection object.
using (connection)
{
// Create a DataTable with the modified rows.
DataTable addedCategories =
  CategoriesDataTable.GetChanges(DataRowState.Added);

// Configure the SqlCommand and SqlParameter.
SqlCommand insertCommand = new SqlCommand(
    "usp_InsertCategories", connection);
insertCommand.CommandType = CommandType.StoredProcedure;

SqlParameter tvpParam = insertCommand.Parameters.AddWithValue(
    "@tvpNewCategories", addedCategories);
tvpParam.SqlDbType = SqlDbType.Structured;

// Execute the command.
insertCommand.ExecuteNonQuery();
}
0 голосов
/ 01 апреля 2014

В противном случае вы можете выбрать SQl Bulk Insert.

Я попробовал, самый лучший способ.

enter code here

  Using dbConn As New SqlConnection(connectionStr)
                dbConn.Open()
                countStart = System.Convert.ToInt32(commandRowCount.ExecuteScalar())



                Using bulkcopy As SqlBulkCopy = New SqlBulkCopy(dbConn)
                    bulkcopy.DestinationTableName = "[dbo].[DocumentScan]"
                    Try
                        ' Write from the source to the destination.
                        bulkcopy.WriteToServer(newDataTable)

                    Catch ex As Exception
                        Console.WriteLine(ex.Message)
                    End Try
                    Dim countEnd As Long = _
                  System.Convert.ToInt32(commandRowCount.ExecuteScalar())


                End Using
...