C# 将Datatable作为参数,传入存储过程

//创建一个静态方法 public static DataSet fnInsertSingleUser(DataTable v_dt, params string[] param)
        {
            try
            {
                SqlConnection cn = new SqlConnection(connectionString);//connertionString链接数据库字符串
                SqlCommand cmd = cn.CreateCommand();
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.CommandText = @"" + param[0];
                SqlParameter p = cmd.Parameters.AddWithValue("@User", v_dt);          //参数可以随意增加
                SqlParameter pCode = cmd.Parameters.AddWithValue("@pCode", param[1]);
                SqlParameter gsdm = cmd.Parameters.AddWithValue("@gsdm", param[2]);
                SqlParameter khdm = cmd.Parameters.AddWithValue("@khdm", param[3]);
                SqlParameter qy = cmd.Parameters.AddWithValue("@qy", param[4]);

                DataSet ds = new DataSet();
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                da.Fill(ds);
                return ds;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

SQL

IF EXISTS ( SELECT  A = 1
            FROM    sys.objects
            WHERE   name = ‘PRCreate ‘
                    AND type = ‘P‘ )
    DROP PROCEDURE dbo.PRCreate

go

IF EXISTS ( SELECT  A = 1
            FROM    sys.table_types
            WHERE   name = ‘tempPR ‘
                    AND is_user_defined = 1 )
    DROP TYPE dbo.tempPR

go

CREATE TYPE dbo.tempPR AS TABLE
(
PT_PCURR  decimal(15, 2), --这2个字段必须与传入的C# datatable中 字段的先后顺序一致
MATNR   varchar(18)--
)

go

CREATE PROCEDURE dbo.PRCreate
    (
      @User AS dbo.tempPR READONLY, --C# datatable参数
      @pCode varchar(50),
      @gsdm varchar(50),
      @khdm varchar(50),
      @qy varchar(50)
    )
AS
    BEGIN  SELECT * FROM @User   END

调用

            DataSet ds = new DataSet();
            ds = SqlHelper.fnInsertSingleUser(dt, "PRCreate", param[0], param[2], param[3], param[4]);//在存储过程中处理,返回结果集

调用时注意传入的参数必须与存储过程中 @User @pCode @gsdm @khdm @qy 的参数一致(见第一段代码)

重点:

1、就是传入存储过程的Datatable参数的字段先后顺序,必须与在存储过程中创建的表字段的先后顺序一致

2、调试:用一句select语句,返回一个DataSet到C#中看看,传入datatable是否正确


				
时间: 2024-08-07 16:46:24

C# 将Datatable作为参数,传入存储过程的相关文章

将list<对象>转换成DataTable,把DataTable转换成参数传入存储过程实现批量插入数据

领导让在存储过程中批量添加数据,找出效率最高的,我看到后台代码后,发现可以将list<对象>转换成DataTable,把DataTable转换成参数传入存储过程实现批量插入数据,知道还有其他的方法,不过这个方法已经实现,就写一下了: 1.创建表. CREATE TABLE [dbo].[person]( [ID] [int] IDENTITY(1,1) NOT NULL, [Name] [nvarchar](50) NULL, [Pwd] [nvarchar](50) NULL, [Age]

c#调用Mysql带参数的存储过程

1.首先创建一个带参数的存储过程 ①存储过程名称=proc_bookinfo  ②存储过程2个参数 一个in 一个out in参数名称=ispay out参数名称=unPaycount ③ 这个存储过程 根据传入的未支付字段名称 输出未支付的商品数量 DELIMITER $$ USE `bookshop`$$ DROP PROCEDURE IF EXISTS `proc_bookinfo`$$ CREATE DEFINER=``@`` PROCEDURE `proc_bookinfo`(IN i

创建有输出参数的存储过程并在c#中实现DataGridView分页功能

不足之处,欢迎指正! 创建有输出参数的存储过程 if exists(select * from sysobjects where name='usp_getPage1') drop procedure usp_getPage1 go create procedure usp_getPage1--存储过程名称 @count int output,--输出参数 @countIndex int=1,--参数带默认值 @countPage int=5--参数带默认值 as --一个sql语句.ROW_N

【Mybatis】MyBatis调用带有返回结果、output参数的存储过程上与ibatis的区别

用过mybatis的应该都知道它是ibatis被Google收购后重新命名的一个工程,因此也做了大量升级.本文就来介绍下两者在调用存储过程上的一点区别,ibatis有一个专门的标签<procedure>,在mybatis里面已经没有这标签了,而是通过一个参数statementType="CALLABLE"来区分. 存储过程: ALTER PROCEDURE [dbo].[Pro_Create_Number] @ChannelNo VARCHAR(10) ,--渠道号 @Nu

c# 调用带有参数的存储过程方法--oracle【转载】

1     由于交叉表的八个报表写在sql中了,每个报表对应sql语句有300行之多,不能定义视图,因为必须传递个参数,所以利用了存储过程实现. 首先,定义包,然后定义包体,在用.net调用生成数据集即可 .net调用oracle带参数的存储过程,返回数据集 Oracle这个复杂一些,步骤如下: 在pl/sql中首先写包的定义文件 CREATE OR REPLACE PACKAGE ZHBB AS    TYPE t_cursor IS REF CURSOR ;Procedure ZH11 (r

带参数的存储过程

创建带参数的sql存储过程:创建带参数的存储过程首先要在存储过程中声明该参数,每个存储过程参数都必须用惟一的名称进行定义.与标准的Transact-SQL变量相同,参数名必须以@为前缀,创建带参数的存储过程创建带参数的存储过程首先要在存储过程中声明该参数,每个存储过程参数都必须用惟一的名称进行定义.与标准的Transact-SQL变量相同,参数名必须以@为前缀,并且遵从对象标识符规则.当用户不提供该参数的值时可以使用一个默认值来代替.在执行带参数的存储过程时,既可以通过显式指定参数名称并赋予适当

把一个函数作为参数传入到函数中

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> <body> <script> function f1(func){ //func函数作为参数传入f1函数 console.log('1'); //首先进入f1函数 setTimeout(function(){ console.log('2'); //继续进入setTimeout方法

mybatis从dao传入多个参数到sqlmap时dao中要使用map或实例对象(如:user)作为参数传入, 否则报错找不到属性getter方法

23:37 2015-07-02 注意1. 使用mybaits的resultMap查询时, 如果想传入多个参数(比如where 1=1动态多条件查询时)sqlmap文件中对应的方法中, selectList中一定要传实例对象(如person作为obj而不能用String等等只能一个参数的类)或map封装多参数传入map作为obj注意2. sqlmap中的方法的parameterType和jdbcType可以不用写

JdbcTemplate执行带输入参数和输出参数的存储过程

直接上代码: /** * 执行返回一个输出参数,若干输入参数的存储过程 * 方法第一个参数为存储过程名称,第二个参数为存放输入参数的数组(按顺序存放),方法返回值为存储过程输出参数 */ public String execProcedureWithOutParam(final String procName,final String[] inParams){ String returnVal=(String)getJdbcTemplate().execute(new CallableState