C#开发学习笔记:C#通过存储过程创建数据表

1.编写存储过程

建表存储过程编写:由于不能给存储过程传入数据集参数,所以如果要动态创建数据,必须把要创建的数据表结构单条传入,因此C#调用存储过程时

会通过循环给存储过程传参(相当于每一条记录都执行一次存储过程),所以利用循环次数和要传入的总记录条数来控制建表sql

语句的拼接,同时还需要对要创建的数据列的数据类型进行判断,然后使用不同的拼接方式

--存储过程

USE WW
GO

--判断数据库中是否已存在该存储过程,存在则删除(需要单独执行)
if exists
	(SELECT * FROM sysobjects WHERE NAME='CREATE_TABLE_P' AND TYPE='P')
DROP PROCEDURE CREATE_TABLE_P

--==================创建存储过程==================

CREATE PROCEDURE CREATE_TABLE_P
@TABLE_NAME VARCHAR(15),                      --输入参数,要创建的表名
@COLUMN_NAME VARCHAR(20),                     --输入参数,列名
@COLUMN_DATA_TYPE VARCHAR(20),                --输入参数,列的数据类型
@COLUMN_LENGTH VARCHAR(20),                   --输入参数,列的长度
@COLUMN_IFNULL VARCHAR(20),                   --输入参数,是否为空
@COUNT INT,                                   --输入参数,当前列
@COUNT_TOTAL INT,                             --输入参数,总列数
@CREATE_TABLE_SQL_TEMP VARCHAR(MAX) OUT,      --输出参数
@RETURN_MESSAGE VARCHAR(MAX)
AS

DECLARE @CREATE_TABLE_SQL NVARCHAR(MAX)       --声明一个变量用于存储建表sql语句
DECLARE @DROP_TABLE_SQL NVARCHAR(MAX)         --声明一个变量用于存储删表sql语句
--判断@COLUMN_IFNULL的值,如果为Y代表字段允许为空,为N则不能为空
IF(@COLUMN_IFNULL='Y')
BEGIN
 SET @COLUMN_IFNULL='null'
END
ELSE
BEGIN
SET @COLUMN_IFNULL='is not null'
END
IF(@COUNT=1)--判断当前列是否为第一列
BEGIN
	SET @CREATE_TABLE_SQL='CREATE TABLE '
	+@TABLE_NAME+'('
		--列名
		+@COLUMN_NAME+' '
		--列数据类型
		+@COLUMN_DATA_TYPE
		--列数据类型
		+'('+@COLUMN_LENGTH+') '
		--列是否允许空
		+@COLUMN_IFNULL
		+','
	SET @CREATE_TABLE_SQL_TEMP=@CREATE_TABLE_SQL
END
ELSE
BEGIN
	IF(@COUNT<>@COUNT_TOTAL)--判断当前列是否为最后一列
	BEGIN
		SET @CREATE_TABLE_SQL=@RETURN_MESSAGE
		--列名
		+@COLUMN_NAME+' '
		--列数据类型
		+@COLUMN_DATA_TYPE
		--列数据类型
		+'('+@COLUMN_LENGTH+') '
		--列是否允许空
		+@COLUMN_IFNULL
		+','
		SET @CREATE_TABLE_SQL_TEMP=@CREATE_TABLE_SQL
	END
	ELSE
	BEGIN
		SET @CREATE_TABLE_SQL=@RETURN_MESSAGE
		--列名
		+@COLUMN_NAME+' '
		--列数据类型
		+@COLUMN_DATA_TYPE
		--列数据类型
		+'('+@COLUMN_LENGTH+') '
		--列是否允许空
		+@COLUMN_IFNULL
		+')'
		SET @CREATE_TABLE_SQL_TEMP=@CREATE_TABLE_SQL
		if exists
				(SELECT * FROM sysobjects WHERE NAME=@TABLE_NAME AND TYPE='U')--判断表是否存在
				BEGIN
				 SET @DROP_TABLE_SQL='DROP TABLE '+ @TABLE_NAME
				 EXEC(@DROP_TABLE_SQL)
				 EXEC(@CREATE_TABLE_SQL_TEMP)
				END
		ELSE
			BEGIN
				EXEC(@CREATE_TABLE_SQL_TEMP)
				--RETURN (select @RETURN_MESSAGE as 建表Sql)
			END		
	END
END


2.C#调用存储过程

<span style="white-space:pre">			</span>SqlCommand comm1 = new SqlCommand("CREATE_TABLE_P", Tools.DBConnection.conn);

                        //设置命令的类型为存储过程
                        comm1.CommandType = CommandType.StoredProcedure;

                        //设置参数(输入参数只需要设置类型,输出参数则还需要设置长度,否则默认为0)
                        comm1.Parameters.Add("@TABLE_NAME", SqlDbType.VarChar);
                        comm1.Parameters.Add("@COLUMN_NAME", SqlDbType.VarChar);
                        comm1.Parameters.Add("@COLUMN_DATA_TYPE", SqlDbType.VarChar);
                        comm1.Parameters.Add("@COLUMN_LENGTH", SqlDbType.VarChar);
                        comm1.Parameters.Add("@COLUMN_IFNULL", SqlDbType.VarChar);
                        comm1.Parameters.Add("@COUNT", SqlDbType.Int);
                        comm1.Parameters.Add("@COUNT_TOTAL", SqlDbType.Int);

                        comm1.Parameters.Add("@CREATE_TABLE_SQL_TEMP", SqlDbType.VarChar, Int32.MaxValue);
                        comm1.Parameters.Add("@RETURN_MESSAGE", SqlDbType.VarChar,Int32.MaxValue);

                        //设置参数类型(输入还是输出,默认都为输入,所以只需要设置输出类型)
                        comm1.Parameters["@CREATE_TABLE_SQL_TEMP"].Direction = ParameterDirection.Output;

                        //为参数(输入参数)赋值
                        comm1.Parameters["@TABLE_NAME"].Value = dr["TABLE_NAME"].ToString();//表名
                        comm1.Parameters["@COLUMN_NAME"].Value = dr["COLUMN_CODE"].ToString();//列名
                        comm1.Parameters["@COLUMN_DATA_TYPE"].Value = dr["COLUMN_DATA_TYPE"].ToString();//列数据类型
                        comm1.Parameters["@COLUMN_LENGTH"].Value = dr["COLUMN_LENGTH"].ToString();//列长度
                        string aaa = dr["COLUMN_IFNULL"].ToString();
                        comm1.Parameters["@COLUMN_IFNULL"].Value = dr["COLUMN_IFNULL"].ToString();//是否为空
                        comm1.Parameters["@COUNT"].Value = COUNT;//当前列数
                        comm1.Parameters["@COUNT_TOTAL"].Value = COUNT_TOTAL;//总列数
                        comm1.Parameters["@RETURN_MESSAGE"].Value = sql_temp;//将存储过程拼接的建表sql又传入到存储过程
                        COUNT++;
                        int count = comm1.ExecuteNonQuery();
                        sql_temp = comm1.Parameters["@CREATE_TABLE_SQL_TEMP"].Value.ToString();//获取存储过程返回的建表的sql语句


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值