Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 调用存储过程_C#_.net_Sql_Stored Procedures - Fatal编程技术网

C# 调用存储过程

C# 调用存储过程,c#,.net,sql,stored-procedures,C#,.net,Sql,Stored Procedures,我有一个c#应用程序,它只通过存储过程与数据库接口。我尝试了各种调用存储过程的技术。根目录下是SqlCommand类,但我想实现以下几点: 使c#和sql之间的接口更平滑,使过程调用看起来更像c#函数调用 有一种简单的方法来确定给定的存储过程是否在代码中的任何位置被调用 使过程调用的创建快速而简单 我探索了各种途径。在一个例子中,我有一个项目,它的名称空间结构反映了存储过程的名称结构,这样我就可以从类的名称生成存储过程的名称,并且我可以通过在名称空间树中对给定的存储过程进行定义来判断它是否正

我有一个c#应用程序,它只通过存储过程与数据库接口。我尝试了各种调用存储过程的技术。根目录下是SqlCommand类,但我想实现以下几点:

  • 使c#和sql之间的接口更平滑,使过程调用看起来更像c#函数调用
  • 有一种简单的方法来确定给定的存储过程是否在代码中的任何位置被调用
  • 使过程调用的创建快速而简单

我探索了各种途径。在一个例子中,我有一个项目,它的名称空间结构反映了存储过程的名称结构,这样我就可以从类的名称生成存储过程的名称,并且我可以通过在名称空间树中对给定的存储过程进行定义来判断它是否正在使用。还有其他一些经验吗?

你应该试试。

你应该试试。

当存储过程是数据库的接口时,我倾向于将它们封装在反映问题域的类中,这样大多数应用程序代码都在使用这些对象,而不是调用存储过程,甚至不知道存储过程或数据库连接。应用程序对象通常在它们之间播放

我认为在应用程序中镜像SP是错误的,因为通常情况下,关系模型与应用程序域对象模型不是1-1

例如,通常我没有表示链接表或数据库设计和规范化的其他工件的应用程序对象。这些是包含在其他对象中或由其他对象返回的对象的集合


阻抗不匹配的原因很多,但我认为这是课程的重点——让数据库做它们擅长的事情,OO模型做它们擅长的事情。

当存储过程是数据库的接口时,我倾向于将它们封装在反映问题域的类中,因此,大多数应用程序代码都在使用这些对象,而不是调用存储过程,甚至不知道存储过程或数据库连接。应用程序对象通常在它们之间播放

我认为在应用程序中镜像SP是错误的,因为通常情况下,关系模型与应用程序域对象模型不是1-1

例如,通常我没有表示链接表或数据库设计和规范化的其他工件的应用程序对象。这些是包含在其他对象中或由其他对象返回的对象的集合


阻抗失配有很多原因,但我认为这是一门必修课——让数据库做他们擅长的事情,让OO模型做他们擅长的事情。

你有没有考虑过使用阻抗失配?它允许您轻松调用存储过程。我通常为每个数据库设置一个类,该类仅用于调用这些存储的过程。然后,您可以使用类似的内容(抱歉,它是vb.net而不是c#):

其中,db定义为:

Dim db As Microsoft.Practices.EnterpriseLibrary.Data.Database = DatabaseFactory.CreateDatabase()

然后有一个函数用于调用存储过程。然后,您可以在代码中搜索此函数。

您研究过如何使用该函数吗?它允许您轻松调用存储过程。我通常为每个数据库设置一个类,该类仅用于调用这些存储的过程。然后,您可以使用类似的内容(抱歉,它是vb.net而不是c#):

其中,db定义为:

Dim db As Microsoft.Practices.EnterpriseLibrary.Data.Database = DatabaseFactory.CreateDatabase()

然后有一个函数用于调用存储过程。然后,您可以在代码中搜索这一函数。

您想要的最简单解决方案[我并不是说它比其他解决方案更好或更差]是创建一个数据集,并将存储过程从服务器资源管理器拖到数据集设计器表面。这将在适配器中创建方法,您可以调用并检查引用。

最简单的解决方案[我并不是说它比其他解决方案更好或更差]是创建一个数据集,并将存储过程从服务器资源管理器拖到数据集设计器表面。这将在适配器中创建方法,您可以调用并检查引用。

在构建当前产品时,我非常想实现的工具之一是一个数据库类(比如DatabaseFactory,只是我不喜欢这个),它将简化我的开发并删除该类中的一些“陷阱”,我希望能够使用如下函数到存储过程映射,将存储过程作为真正的C#函数调用:

public int Call_MySproc(int paramOne、bool paramtow2、ref int outputParam)

{

…此处的参数处理和存储过程调用

}

然而,在尝试这样做时,您面临的最大问题在于创建实现存储过程调用的C#函数所需的工作。幸运的是,在T-SQL中创建代码生成器很容易。我从保罗·麦肯齐(Paul McKenzie)最初创建的代码开始,然后以各种方式对其进行修改,以生成我想要的C代码


你可以在谷歌上搜索Paul McKenzie的原始代码生成器,或者,如果你想在mark-at-BSDIWeb.com上写信给我,我会把我的SQL类库和相关的存储过程代码生成器的源代码捆绑起来,放在我们的网站上。如果我收到一两个请求,我会发布它,然后回来编辑此响应,以便将其他人指向源代码。

在构建我当前的产品时,我非常想实现的工具之一是数据库类(如DatabaseFactory-只是我不喜欢那个)这将简化我的开发并消除一些“陷阱”。在该类中,我希望能够使用函数到存储过程的映射(如下所示)将存储过程作为真正的C#函数调用:

public int Call_MySproc(int paramOne、bool paramtow2、ref int outputParam)

{