2012-05-02 18 views
5

Bir DataTable'ı C# 'dan SQL Server 2008'e nasıl geçirebilirim?Veritabanından SQL Server 2008'e geçiş

İstisna:

masa tipi parametresi '@CurrentTableInitial' geçerli bir tür adı olmalıdır.

Tablo yapısı:

CREATE TABLE [dbo].[RegisterChoiceUserInitial](
    [RegisterChoiceUserInitialID] [int] IDENTITY(1,1) NOT NULL, 
    [UserId] [uniqueidentifier] NOT NULL, 
    [RegisterChoiceUserInitialJob] [nvarchar](50) NULL, 
    [RegisterChoiceUserInitialOrganization] [nvarchar](50) NULL, 
    [RegisterChoiceUserInitialUnit] [nvarchar](50) NULL, 
    [RegisterChoiceUserInitialMembershipType] [nvarchar](50) NULL, 
    [RegisterChoiceUserInitialStart] [nvarchar](10) NULL, 
    [RegisterChoiceUserInitialEnd] [nvarchar](10) NULL, 
CONSTRAINT [PK_RegisterChoiceUserInitial] PRIMARY KEY CLUSTERED 
(
    [RegisterChoiceUserInitialID] ASC 
) 

kullanıcı tanımlı türü:

CREATE TYPE [dbo].[TableTypeInitial] AS TABLE(
    [ID] [int] NULL, 
    [InitialJob] [nvarchar](50) NULL, 
    [InitialOrganization] [nvarchar](50) NULL, 
    [InitialUnit] [nvarchar](50) NULL, 
    [InitialMembershipType] [nvarchar](50) NULL, 
    [InitialMembershipStart] [nvarchar](10) NULL, 
    [InitialMembershipEnd] [nvarchar](10) NULL 
) 

saklı prosedürü:

create PROCEDURE [dbo].[FinishRegisterChoiceUserInitial] 
     (@UserId       uniqueidentifier, 
     @TableVariable TableTypeInitial READONLY) 
AS 
BEGIN 

INSERT INTO [Election].[dbo].[RegisterChoiceUserInitial] 
      ([UserId] 
      ,[RegisterChoiceUserInitialJob] 
      ,[RegisterChoiceUserInitialOrganization] 
      ,[RegisterChoiceUserInitialUnit] 
      ,[RegisterChoiceUserInitialMembershipType] 
      ,[RegisterChoiceUserInitialStart] 
      ,[RegisterChoiceUserInitialEnd]) 
     SELECT 
      @UserId AS UserId 
      ,InitialJob 
      ,InitialOrganization 
      ,InitialUnit 
      ,InitialMembershipType 
      ,InitialMembershipStart 
      ,InitialMembershipEnd 
     FROM 
      @TableVariable 
END 

DataTable:

DataTableInitial.Columns.Add(new DataColumn("ID", typeof(int))); 
DataTableInitial.Columns.Add(new DataColumn("InitialJob", typeof(String))); 
DataTableInitial.Columns.Add(new DataColumn("InitialOrganization", typeof(String))); 
DataTableInitial.Columns.Add(new DataColumn("InitialUnit", typeof(String))); 
DataTableInitial.Columns.Add(new DataColumn("InitialMembershipType", typeof(String))); 
DataTableInitial.Columns.Add(new DataColumn("InitialMembershipStart", typeof(String))); 
DataTableInitial.Columns.Add(new DataColumn("InitialMembershipEnd", typeof(String))); 

cmd.CommandText = "EXEC FinishRegisterChoiceUserInitial @UserId, @CurrentTableInitial "; 
cmd.Parameters.AddWithValue("@UserId",user.ProviderUserKey); 

DataTable TableInitial=(DataTable)ViewState["CurrentTableInitial"]; 
SqlParameter a = cmd.Parameters.AddWithValue("@CurrentTableInitial", TableInitial); 
a.SqlDbType = SqlDbType.Structured; 

cmd.ExecuteNonQuery(); 
+2

Neden parametre # içinde '@ TableVariable' parametresi ve C# kodunda '@ CurrentTableInitial' olarak adlandırılır? –

+0

Aynı olmalı? –

cevap

7

Sen a.TypeName = "dbo.TableTypeInitial" eksik; Bu ifadeyi "a.SqlDbType = SqlDbType.Structured;" önce koy

Kullanım

cmd.CommandText = "EXEC FinishRegisterChoiceUserInitial @UserId, @TableTypeInitial "; 

yerine

cmd.CommandText = "EXEC FinishRegisterChoiceUserInitial @UserId, @CurrentTableInitial "; 

SQL Server komut dosyaları:

  CREATE TABLE [Target] 
     (
     [ID] [int] NOT NULL PRIMARY KEY IDENTITY, 
     [FirstName] [varchar](100)NOT NULL, 
     [LastName] [varchar](100)NOT NULL, 
     [Email] [varchar](200) NOT NULL 
     ) 
     CREATE TYPE [TargetUDT] AS TABLE 
     (
     [FirstName] [varchar](100)NOT NULL, 
     [LastName] [varchar](100)NOT NULL, 
     [Email] [varchar](200) NOT NULL 
     ) 
     CREATE PROCEDURE AddToTarget(@TargetUDT TargetUDT READONLY) 
     AS 
     BEGIN 
       INSERT INTO [Target] 
       SELECT * FROM @TargetUDT 
     END 

Örnek Kod:

public static void StartProcess() 
     { 
      //Create a local data table to hold customer records 
      DataTable dtCustomers = new DataTable("Customers"); 
      DataColumn dcFirstName = new DataColumn("FirstName", typeof(string)); 
      DataColumn dcLastName = new DataColumn("LastName", typeof(string)); 
      DataColumn dcEmail = new DataColumn("Email", typeof(string)); 
      dtCustomers.Columns.Add(dcFirstName); 
      dtCustomers.Columns.Add(dcLastName); 
      dtCustomers.Columns.Add(dcEmail); 
      //Add customer 1 
      DataRow drCustomer = dtCustomers.NewRow(); 
      drCustomer["FirstName"] = "AAA"; 
      drCustomer["LastName"] = "XYZ"; 
      drCustomer["Email"] = "[email protected]"; 
      dtCustomers.Rows.Add(drCustomer); 
      //Add customer 2 
      drCustomer = dtCustomers.NewRow(); 
      drCustomer["FirstName"] = "BBB"; 
      drCustomer["LastName"] = "XYZ"; 
      drCustomer["Email"] = "[email protected]"; 
      dtCustomers.Rows.Add(drCustomer); 
      //Add customer 3 
      drCustomer = dtCustomers.NewRow(); 
      drCustomer["FirstName"] = "CCC"; 
      drCustomer["LastName"] = "XYZ"; 
      drCustomer["Email"] = "[email protected]"; 
      dtCustomers.Rows.Add(drCustomer); 
      //Create Connection object to connect to server/database 
      SqlConnection conn = new SqlConnection(ConStr); 
      conn.Open(); 
      //Create a command object that calls the stored procedure 
      SqlCommand cmdCustomer = new SqlCommand("AddToTarget", conn); 
      cmdCustomer.CommandType = CommandType.StoredProcedure; 
      //Create a parameter using the new SQL DB type viz. Structured to pass as table value parameter 
      SqlParameter paramCustomer = cmdCustomer.Parameters.Add("@TargetUDT", SqlDbType.Structured); 
      paramCustomer.Value = dtCustomers; 
      //Execute the query 
      cmdCustomer.ExecuteNonQuery();   
     } 
+0

İstisna nedir ????? –

+0

a.TypeName = "dbo.TableTypeInitial" ifadesini kaçırdınız; –

+0

Doğru cmd.CommandText deyimini ve CurrentTableInitial yerine TableTypeInitial yazın. –