从C#传递数据表到SQL Server 2008 [英] Passing datatable from C# to SQL Server 2008

查看:111
本文介绍了从C#传递数据表到SQL Server 2008的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我如何能够通过从C#的DataTable到SQL Server 2008



例外




表类型参数@CurrentTableInitial必须有一个有效的类型
名称。




表结构为:

  CREATE TABLE [DBO] [RegisterChoiceUserInitial($ b。 $ b [RegisterChoiceUserInitialID] [INT] IDENTITY(1,1)NOT NULL,
[用户ID] [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,
约束[PK_RegisterChoiceUserInitial] PRIMARY KEY CLUSTERED

[RegisterChoiceUserInitialID] ASC

用户定义类型:

  CREATE TYPE [DBO]。[TableTypeInitial]如表(
[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

存储过程:

  CREATE PROCEDURE [DBO] [FinishRegisterChoiceUserInitial] 
(@UserId唯一标识符,
@TableVariable TableTypeInitial只读)
AS
BEGIN

INSERT INTO [选举] [DBO]。 [RegisterChoiceUserInitial]
([用户ID]
,[RegisterChoiceUserInitialJob]
,[RegisterChoiceUserInitialOrganization]
,[RegisterChoiceUserInitialUnit]
,[RegisterChoiceUserInitialMembershipType]
,[RegisterChoiceUserInitialStart ]
,[RegisterChoiceUserInitialEnd])
选择
@UserId AS用户ID
,InitialJob
,InitialOrganization
,InitialUnit
,InitialMembershipType
,InitialMembershipStart
,InitialMembershipEnd
起价
@TableVariable

数据表:

  DataTableInitial.Columns.Add(新的DataColumn(ID,的typeof(INT))); 
DataTableInitial.Columns.Add(新的DataColumn(InitialJob,typeof运算(字符串)));
DataTableInitial.Columns.Add(新的DataColumn(InitialOrganization,typeof运算(字符串)));
DataTableInitial.Columns.Add(新的DataColumn(InitialUnit,typeof运算(字符串)));
DataTableInitial.Columns.Add(新的DataColumn(InitialMembershipType,typeof运算(字符串)));
DataTableInitial.Columns.Add(新的DataColumn(InitialMembershipStart,typeof运算(字符串)));
DataTableInitial.Columns.Add(新的DataColumn(InitialMembershipEnd,typeof运算(字符串)));

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

的DataTable TableInitial =(数据表)的ViewState [CurrentTableInitial];
的SqlParameter一个= cmd.Parameters.AddWithValue(@ CurrentTableInitial,TableInitial);
a.SqlDbType = SqlDbType.Structured;

cmd.ExecuteNonQuery();


解决方案

您失踪a.TypeName =dbo.TableTypeInitial
将这个语句之前a.SqlDbType = SqlDbType.Structured;



使用



  cmd.CommandText =EXEC FinishRegisterChoiceUserInitial @UserId,@TableTypeInitial 



而不是

  cmd.CommandText =EXEC FinishRegisterChoiceUserInitial @UserId,@CurrentTableInitial 



SQL Server脚本:



  CREATE TABLE [目标] 

[ID] [INT] NOT NULL PRIMARY KEY的身份,
[名字] [VARCHAR] (100)NOT NULL,
[姓氏] [VARCHAR(100)NOT NULL,
[邮件] [VARCHAR(200)NOT NULL

CREATE TYPE [TargetUDT ]如表

[名字] [VARCHAR(100)NOT NULL,
[姓氏] [VARCHAR(100)NOT NULL,
[邮件] [VARCHAR] (200)NOT NULL

CREATE PROCEDURE AddToTarget(@TargetUDT TargetUDT只读)
AS
BEGIN
INSERT INTO [目标]
SELECT * FROM @ TargetUDT

示例代码:

 公共静态无效StartProcess()
{
//创建一个本地数据表来保存客户记录
数据表dtCustomers =新的DataTable(客户);
的DataColumn dcFirstName =新的DataColumn(名字,typeof运算(字符串));
的DataColumn dcLastName =新的DataColumn(姓氏,typeof运算(字符串));
的DataColumn dcEmail =新的DataColumn(电子邮件,typeof运算(字符串));
dtCustomers.Columns.Add(dcFirstName);
dtCustomers.Columns.Add(dcLastName);
dtCustomers.Columns.Add(dcEmail);
//添加客户1
的DataRow drCustomer = dtCustomers.NewRow();
drCustomer [名字] =AAA;
drCustomer [姓氏] =XYZ;
drCustomer [电子邮件] =aaa@test.com;
dtCustomers.Rows.Add(drCustomer);
//添加客户2
drCustomer = dtCustomers.NewRow();
drCustomer [名字] =BBB;
drCustomer [姓氏] =XYZ;
drCustomer [电子邮件] =bbb@test.com;
dtCustomers.Rows.Add(drCustomer);
//添加客户3
drCustomer = dtCustomers.NewRow();
drCustomer [名字] =CCC;
drCustomer [姓氏] =XYZ;
drCustomer [电子邮件] =ccc@test.com;
dtCustomers.Rows.Add(drCustomer);
//创建连接对象连接到服务器/数据库
SqlConnection的康恩=新的SqlConnection(构造);
conn.Open();
//创建一个调用存储过程
的SqlCommand cmdCustomer =新的SqlCommand(AddToTarget,conn)的命令对象;
cmdCustomer.CommandType = CommandType.StoredProcedure;
//使用新的SQL数据库类型即一个参数。结构传递的表值参数
的SqlParameter paramCustomer = cmdCustomer.Parameters.Add(@ TargetUDT,SqlDbType.Structured);
paramCustomer.Value = dtCustomers;
//执行查询
cmdCustomer.ExecuteNonQuery();
}


How can I pass a DataTable from C# to SQL Server 2008?

Exception:

The table type parameter '@CurrentTableInitial' must have a valid type name.

Table structure:

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
)

User-defined type:

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
)

Stored procedure:

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();

解决方案

You were missing a.TypeName = "dbo.TableTypeInitial"; Put this statement before "a.SqlDbType = SqlDbType.Structured;"

Use

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

instead of

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

Sql Server Scripts :

         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

Sample Code :

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"] = "aaa@test.com";
            dtCustomers.Rows.Add(drCustomer);
            //Add customer 2
            drCustomer = dtCustomers.NewRow();
            drCustomer["FirstName"] = "BBB";
            drCustomer["LastName"] = "XYZ";
            drCustomer["Email"] = "bbb@test.com";
            dtCustomers.Rows.Add(drCustomer);
            //Add customer 3
            drCustomer = dtCustomers.NewRow();
            drCustomer["FirstName"] = "CCC";
            drCustomer["LastName"] = "XYZ";
            drCustomer["Email"] = "ccc@test.com";
            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();        
        }

这篇关于从C#传递数据表到SQL Server 2008的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆