C# 存储过程代码生成器






4.70/5 (66投票s)
2004年9月28日
2分钟阅读

532021

6144
此存储过程将生成调用任何存储过程的所有 C# 代码。
引言
是否厌倦了为你的存储过程创建所有参数后的代码?我确实如此。因此,我编写了这个存储过程来为我生成代码。(我喜欢编写生成代码的代码)。这适用于“Microsoft 数据应用程序块”(SQLHelper.cs),但是可以修改它以在不使用 MDAB 的情况下编写代码,甚至以 VB 编写代码。该脚本处理输入和输出参数,设置文本类型的尺寸,甚至可以用于直接访问视图或表。
使用代码
要实现,只需将代码复制到查询分析器中并运行。这将创建一个名为“tools_CS_SPROC_Builder
”的 SPROC。
要使用,只需执行 SPROC,传递你想要生成代码的 SPROC 的名称(如下所示)。注意:不要包含任何所有者前缀,例如:(dbo.
)。
EXEC tools_CS_SPROC_Builder 'mySprocsNameHere'
查询分析器中的消息窗口将输出为你的类或代码后端的全部代码。在“tools_CS_SPROC_Builder
”中有一个变量名为“@connName
”,你可以将其设置为你的连接实例的名称。默认情况下,它设置为“conn.Connection
” - 仅需修改它以符合你自己的项目命名约定。
代码
CREATE PROCEDURE tools_CS_SPROC_Builder
(
@objName nvarchar(100)
)
AS
/*
___________________________________________________________________
Name: CS SPROC Builder
Version: 1
Date: 10/09/2004
Author: Paul McKenzie
Description: Call this stored procedue passing the name of your
database object that you wish to insert/update
from .NET (C#) and the code returns code to copy
and paste into your application. This version is
for use with "Microsoft Data Application Block".
*/
SET NOCOUNT ON
DECLARE @parameterCount int
DECLARE @errMsg varchar(100)
DECLARE @parameterAt varchar(1)
DECLARE @connName varchar(100)
//Change the following variable to the name of your connection instance
SET @connName='conn.Connection'
SET @parameterAt=''
SELECT
dbo.sysobjects.name AS ObjName,
dbo.sysobjects.xtype AS ObjType,
dbo.syscolumns.name AS ColName,
dbo.syscolumns.colorder AS ColOrder,
dbo.syscolumns.length AS ColLen,
dbo.syscolumns.colstat AS ColKey,
dbo.systypes.xtype
INTO #t_obj
FROM
dbo.syscolumns INNER JOIN
dbo.sysobjects ON dbo.syscolumns.id = dbo.sysobjects.id INNER JOIN
dbo.systypes ON dbo.syscolumns.xtype = dbo.systypes.xtype
WHERE
(dbo.sysobjects.name = @objName)
AND
(dbo.systypes.status <> 1)
ORDER BY
dbo.sysobjects.name,
dbo.syscolumns.colorder
SET @parameterCount=(SELECT count(*) FROM #t_obj)
IF(@parameterCount<1) SET @errMsg='No Parameters/Fields found for ' + @objName
IF(@errMsg is null)
BEGIN
PRINT 'try'
PRINT ' {'
PRINT ' SqlParameter[] paramsToStore =
new SqlParameter[' + cast(@parameterCount as varchar) + '];'
PRINT ''
DECLARE @source_name nvarchar,@source_type varchar,
@col_name nvarchar(100),@col_order int,@col_type varchar(20),
@col_len int,@col_key int,@col_xtype int,@col_redef varchar(20)
DECLARE cur CURSOR FOR
SELECT * FROM #t_obj
OPEN cur
-- Perform the first fetch.
FETCH NEXT FROM cur
INTO @source_name,@source_type,@col_name,@col_order,
@col_len,@col_key,@col_xtype
if(@source_type=N'U') SET @parameterAt='@'
-- Check @@FETCH_STATUS to see if there are any more rows to fetch.
WHILE @@FETCH_STATUS = 0
BEGIN
SET @col_redef=(SELECT
CASE @col_xtype
WHEN 34 THEN 'Image'
WHEN 35 THEN 'Text'
WHEN 48 THEN 'TinyInt'
WHEN 52 THEN 'SmallInt'
WHEN 56 THEN 'Int'
WHEN 58 THEN 'SmallDateTime'
WHEN 59 THEN 'Real'
WHEN 60 THEN 'Money'
WHEN 61 THEN 'DateTime'
WHEN 62 THEN 'Float'
WHEN 99 THEN 'NText'
WHEN 104 THEN 'Bit'
WHEN 106 THEN 'Decimal'
WHEN 122 THEN 'SmallMoney'
WHEN 127 THEN 'BigInt'
WHEN 165 THEN 'VarBinary'
WHEN 167 THEN 'VarChar'
WHEN 173 THEN 'Binary'
WHEN 175 THEN 'Char'
WHEN 231 THEN 'NVarChar'
WHEN 239 THEN 'NChar'
ELSE '!MISSING'
END AS C)
--Write out the parameter
PRINT ' paramsToStore[' + cast(@col_order-1 as varchar)
+ '] = new SqlParameter("' + @parameterAt + @col_name
+ '", SqlDbType.' + @col_redef
+ ');'
--If the type is a string then output the size declaration
IF(@col_xtype=231)OR(@col_xtype=167)OR(@col_xtype=175)
OR(@col_xtype=99)OR(@col_xtype=35)
BEGIN
PRINT ' paramsToStore[' + cast(@col_order-1 as varchar)
+ '].Size=' + cast(@col_len as varchar) + ';'
END
PRINT ' paramsToStore['+ cast(@col_order-1 as varchar)
+ '].Value = ;'
-- This is executed as long as the previous fetch succeeds.
FETCH NEXT FROM cur
INTO @source_name,@source_type,@col_name,@col_order,
@col_len,@col_key,@col_xtype
END
PRINT ''
PRINT ' SqlHelper.ExecuteNonQuery(' + @connName +
', CommandType.StoredProcedure,"' + @objName + '", paramsToStore);'
PRINT ' }'
PRINT 'catch(Exception excp)'
PRINT ' {'
PRINT ' }'
PRINT 'finally'
PRINT ' {'
PRINT ' ' + @connName + '.Dispose();'
PRINT ' ' + @connName + '.Close();'
PRINT ' }'
CLOSE cur
DEALLOCATE cur
END
if(LEN(@errMsg)>0) PRINT @errMsg
DROP TABLE #t_obj
SET NOCOUNT ON
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
输出示例
try
{
SqlParameter[] paramsToStore = new SqlParameter[9];
paramsToStore[0] = new SqlParameter("@organisationid", SqlDbType.BigInt);
paramsToStore[0].Value = ;
paramsToStore[1] = new SqlParameter("@DisplayName", SqlDbType.NVarChar);
paramsToStore[1].Size=100;
paramsToStore[1].Value = ;
paramsToStore[2] = new SqlParameter("@DefaultCurrencyFID", SqlDbType.Int);
paramsToStore[2].Value = ;
paramsToStore[3] = new SqlParameter("@TaxCode", SqlDbType.NVarChar);
paramsToStore[3].Size=60;
paramsToStore[3].Value = ;
paramsToStore[4] = new SqlParameter("@UserFID", SqlDbType.BigInt);
paramsToStore[4].Value = ;
paramsToStore[5] = new SqlParameter("@IsClient", SqlDbType.Bit);
paramsToStore[5].Value = ;
paramsToStore[6] = new SqlParameter("@IsContractor", SqlDbType.Bit);
paramsToStore[6].Value = ;
paramsToStore[7] = new SqlParameter("@IsSupplier", SqlDbType.Bit);
paramsToStore[7].Value = ;
paramsToStore[8] = new SqlParameter("@IsDesigner", SqlDbType.Bit);
paramsToStore[8].Value = ;
SqlHelper.ExecuteNonQuery(conn.Connection,
CommandType.StoredProcedure,"usp_Insert_Organisation", paramsToStore);
}
catch(Exception excp)
{
}
finally
{
conn.Connection.Dispose();
conn.Connection.Close();
}
你现在所要做的就是复制粘贴并填写你想要传递的值并捕获任何异常……(是的,你仍然需要编写一些代码!)。
关注点
为了让我从 sysobjects 中计算出 @col_xtype
变量,我在一个包含所有数据类型变体的表中进行了大量测试。它对于所有常见数据类型都能正常工作,但我还没有机会测试 .NET 中的所有类型,所以如果你发现错误,请告诉我。祝你使用愉快!
历史
- 2006年2月20日 - 将脚本更新到版本 1.1,其中包括两个补充
UniqueIdentifier
数据类型支持。- 对
ParameterDirection.Output
的支持。