从 Information_Schema 表构建 SQL Server 存储过程






4.67/5 (9投票s)
通过从数据库元数据创建存储过程和代码,节省数小时的时间。
引言
和你们许多人一样,我每周(甚至每天)都依赖 CodeProject 和那些才华横溢、乐于助人的社区来帮助我摆脱困境。现在,是时候我回馈大家了。
背景
手动编写与数据库表相关的存储过程、类和其他代码会浪费多少时间?在任何项目中,最繁琐、最耗时的任务之一可能是创建标准的 Insert、Update、Delete 和 Select 存储过程。
我在这里提供的应用程序允许用户选择一个数据库,从该数据库中选择一个表,并在几秒钟内自动生成所有这些标准存储过程,通常不会出现语法错误。
这里没有什么新东西。当然,市面上也有一些可以购买的应用程序,它们能以更优雅的方式完成类似的事情。但是,嘿……这个是免费的!
使用代码
您首先需要修改配置文件。appSettings
部分包含键/值对,其中键是您有权访问的 SQL Server 数据库的名称,而值包含到该数据库的连接字符串。这就是难点。暂时忽略 "Northwind" 设置。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="LoanAbstract"
value="server='SVR-A-XYZ';user id='ReaderWriter';
password='jeremiahwasa..."></add>
<add key="Northwind"
value="ZeqIxX2fZc9cKSwH8osU1LxOdbsnvvJzeVQfXqnpoq0=">
</add>
</appSettings>
</configuration>
完成此操作后,打开应用程序。最左边的下拉列表现在应该包含 appSettings
部分中的数据库名称。选择一个,然后单击 "Show Tables"(显示表)按钮。这将使用该数据库中的所有表填充右侧的下拉列表(假设连接字符串正确)。选择一个表。
现在,从单选按钮中选择一个(例如 SQL Insert),然后点击 "Build Code"(生成代码)按钮。您现在应该在下方的文本框中看到所选表的语法正确的 Insert 存储过程。其他单选按钮也应该如此。每个按钮代表应用程序中的一个单独类。
点击 "Copy to Clipboard"(复制到剪贴板)按钮,然后将结果粘贴到 Query Analyzer 中,进行任何必要的更改,您就完成了。或者,通过点击左下角的 "Select Output Folder"(选择输出文件夹)按钮选择一个文件夹,并将代码写入文件。(写入的文件名称以表名开头,后跟文本框中的代码类型,再后跟一个时间戳。因此,如果表是 "Address",代码类型是 "SQL Insert",则文件名将类似于:"Address_SqlInsert_20060404_161216.txt"。)
在某些时候,您将需要进入各个类,进行更改,或者创建新类以根据您的需求生成代码。您可能想做的第一件事之一就是将我的姓名和用户 ID 替换为您自己的。如果我写存储过程的独特风格(是的,我就是这样手动编写它们的!)惹恼了您,请进去更改它们。
每个类都有三个方法来生成代码。第一个方法 BuildCodeStartOfLoop
用于生成代码的表级部分。类似地,要在过程结束时提供任何代码,则使用 BuildCodeEndOfLoop
方法。在两者之间,为表的每个列生成代码的是 BuildCodeEachColumn
方法。
我希望您觉得这个应用程序很有用,能为您节省时间去做更有趣的事情。
致谢
如果您和我一样,您可能不想让您的连接字符串明文显示在配置文件中。我总是加密连接字符串(参见上面代码中的 Northwind 示例;您当时一定在想吧?),并在应用程序提取它时对其进行解密。请参阅 frmBuildCode.cs 中 GetConnectionString
方法中注释掉的代码。加密类的代码已包含在内,最初由 Frank Fang 开发,并在 CodeProject 的一篇帖子[^] 中与我们分享。包含的 Encrypter
类包含了该文章其他读者推荐的所有改进。我已成功使用了它相当长一段时间,没有任何错误迹象。
同样,此应用程序中包含的 DataProvider
类也深受 David Veeneman 写的 一篇有趣的文章[^](实际上是一系列文章)的影响。如果一个方法需要 SqlParameters
,我会在调用方法中构建它们(参见 SQL Parms 代码类型),将它们加载到 ArrayList
中,然后将它们传递给适当的 DataProvider
方法。使用 FillDataSet
方法以 DataSet
对象形式拉回的数据,然后会重新加载到基于表的类的实例中(参见 C# 类代码类型)。Table
、TableDAO
和 DataProvider
类演示了 Veeneman 文章中的一些概念。
结论
我真心希望这个应用程序能为您减少生活中的一些繁重工作。并且,对于所有为 CodeProject 做出任何贡献的人,我致以最诚挚的感谢!