Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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# WCF数据库连接:仅一个数据库连接_C#_Sql Server_Wcf - Fatal编程技术网

C# WCF数据库连接:仅一个数据库连接

C# WCF数据库连接:仅一个数据库连接,c#,sql-server,wcf,C#,Sql Server,Wcf,我需要将WCF Web服务连接到SQL Server数据库。我只需要使用SQL来访问数据,没有LINQ或实体框架 我尝试遵循本教程: . SqlConnection类似乎是我需要使用的,但当我看到此服务方法时: public string InsertUserDetails(UserDetails userInfo) { // ... SqlConnection con = new SqlConnection("Data Source=.;Initial

我需要将WCF Web服务连接到SQL Server数据库。我只需要使用SQL来访问数据,没有LINQ或实体框架

我尝试遵循本教程: . SqlConnection类似乎是我需要使用的,但当我看到此服务方法时:

public string InsertUserDetails(UserDetails userInfo)
    {
        // ...
        SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=Rajesh;User ID=sa;Password=wintellect");
        con.Open();
        SqlCommand cmd = new SqlCommand("insert into RegistrationTable(UserName,Password,Country,Email) values(@UserName,@Password,@Country,@Email)", con);
        cmd.Parameters.AddWithValue("@UserName", userInfo.UserName);
        cmd.Parameters.AddWithValue("@Password", userInfo.Password);
        cmd.Parameters.AddWithValue("@Country", userInfo.Country);
        cmd.Parameters.AddWithValue("@Email", userInfo.Email);
        int result = cmd.ExecuteNonQuery();
        // ...
    }
我很担心,因为很明显,每个请求都会创建一个数据库连接

下面是我想要的代码结构示例:

public class Service : IService
{       
    public Company GetCompany(int key)
    {
        // Get existing database connection
        // SELECT * from companies where c_key=key
        // Return Company instance
    }
}
我应该使用什么结构来使用SQL访问数据,而不是在每个请求上创建数据库连接?我可以将SqlConnection实例设置为静态吗?我不明白WCF如何处理这个问题,会创建多少服务实例等等。。
谢谢你的帮助

只要确保每次都能打开和关闭它

public class Service : IService
{       
    private static SQLConnection con;
    public Company GetCompany(int key)
    {
        // Get existing database connection
        // SELECT * from companies where c_key=key
        // Return Company instance
    }
}

每次都要确保打开和关闭它

public class Service : IService
{       
    private static SQLConnection con;
    public Company GetCompany(int key)
    {
        // Get existing database connection
        // SELECT * from companies where c_key=key
        // Return Company instance
    }
}

通常最好的做法是只在需要时保持连接打开

您可以通过高效地管理资源来提高性能。ADO.NET数据提供程序对象实现了
IDisposable
,允许您使用它来确保这些对象及其非托管资源(如数据库连接)得到正确和可预测的释放

只要在
SqlConnection
对象上调用
Dispose()
(这反过来调用
Close()
),它就会将连接释放回连接池

现代的关系数据库管理系统可以同时处理成千上万的连接。作为一名开发人员,您的职责是确保只在需要时保持连接打开。因此,打开连接,运行SQL,获取结果,关闭连接

遵循与此类似的操作:

using (var conn = new SqlConnection(ConnectionString))
{
     conn.Open();
     using (SqlCommand cmd = conn.CreateCommand())
     {
          cmd.CommandText = "SELECT * FROM SomeTable";
          using (SqlDataReader reader = cmd.ExecuteReader())
          {
               while (reader.Read())
               {
                   // DO SOME WORK
               }
          }
     }
}

通常最好的做法是只在需要时保持连接打开

您可以通过高效地管理资源来提高性能。ADO.NET数据提供程序对象实现了
IDisposable
,允许您使用它来确保这些对象及其非托管资源(如数据库连接)得到正确和可预测的释放

只要在
SqlConnection
对象上调用
Dispose()
(这反过来调用
Close()
),它就会将连接释放回连接池

现代的关系数据库管理系统可以同时处理成千上万的连接。作为一名开发人员,您的职责是确保只在需要时保持连接打开。因此,打开连接,运行SQL,获取结果,关闭连接

遵循与此类似的操作:

using (var conn = new SqlConnection(ConnectionString))
{
     conn.Open();
     using (SqlCommand cmd = conn.CreateCommand())
     {
          cmd.CommandText = "SELECT * FROM SomeTable";
          using (SqlDataReader reader = cmd.ExecuteReader())
          {
               while (reader.Read())
               {
                   // DO SOME WORK
               }
          }
     }
}

您的连接代码和命令代码应该使用using语句来确保正确地清理这些内容。当您创建初始连接时,池将启动。当连接被释放时,它将被释放到池中,以便再次使用。您可以使用连接字符串来控制池的大小。

您的连接代码和命令代码应该使用using语句来确保正确清理池中的内容。当您创建初始连接时,池将启动。当连接被释放时,它将被释放到池中,以便再次使用。您可以使用连接字符串控制池的大小。

您可以创建静态:请参阅下面的答案每次连接都有什么问题?池化处理开销。我认为理想情况下,只要服务还活着,db连接就应该保持打开状态,因为如果x个客户端同时连接到web服务,就会创建x个数据库连接。我说得对吗?什么是联营@大卫,我想这样做,我只是想确保这种方法是正确的!是的,如果10个客户端同时连接到该服务,您可能会得到10个数据库连接——这通常是您想要的,因为您想要同时为10个客户端提供服务。您可以将WCF配置为将客户端的最大数量限制在您的服务器可以处理的范围内——典型的SQL server可以毫无问题地处理数百到数千个连接;这取决于这些连接在做什么。简单的插入是没有问题的。如果客户端一个接一个地连接,那么最终只会有一个到数据库的物理连接(SqlConnection只是一个包装器)。实际上,您很可能正在为每个客户端会话创建一个全新的服务实例(WCF服务的默认实例模式)。我发现您发布的代码片段唯一的错误是缺少对
SqlCommand
SqlConnection
使用
语句?池化处理开销。我认为理想情况下,只要服务还活着,db连接就应该保持打开状态,因为如果x个客户端同时连接到web服务,就会创建x个数据库连接。我说得对吗?什么是联营@大卫,我想这样做,我只是想确保这种方法是正确的!是的,如果10个客户端同时连接到该服务,您可能会得到10个数据库连接——这通常是您想要的,因为您想要同时为10个客户端提供服务。您可以将WCF配置为将客户端的最大数量限制在您的服务器可以处理的范围内——典型的SQL server可以毫无问题地处理数百到数千个连接;这取决于这些连接在做什么。简单的插入是没有问题的。如果客户端一个接一个地连接,那么最终只会有一个到数据库的物理连接(SqlConnection
只是一个包装器)。实际上,您很可能正在为每个客户端会话创建一个全新的服务实例(WCF服务的默认实例模式)。我所看到的您发布的代码片段的唯一错误是缺少对
SqlCo使用
语句的