2012-08-01 51 views
1

我经常使用下面的模式为单线程应用程序创建SqlCommands。为Webservice准备的SqlCommand

我现在正在创建一个web服务,我担心这种模式不能同时处理来自多个客户端的请求。

有没有一种方法可以为多个客户端使用单个“准备好的”SqlCommand,而不是简单地将函数锁定为只允许单个客户端同时运行?

private static SqlCommand cmdInsertRecord; 

    public static void InsertRecord(String parameter1, String parameter2, SqlConnection connection, SqlTransaction transaction) 
    { 
     if (cmdInsertRecord == null) 
     { 
      //Create command 
      cmdInsertRecord = connection.CreateCommand(); 
      cmdInsertRecord.CommandText = @"SQL QUERY"; 

      //Add parameters to command 
      cmdInsertRecord.Parameters.Add("@Parameter1", SqlDbType.Int); 
      cmdInsertRecord.Parameters.Add("@Parameter2", SqlDbType.DateTime); 

      //Prepare the command for use 
      cmdInsertRecord.Prepare(); 
     } 

     cmdInsertRecord.Transaction = transaction; 

     //Note SetParameter is an extension that handles null -> DBNull. 
     cmdInsertRecord.SetParameter("@Parameter1", parameter1); 
     cmdInsertRecord.SetParameter("@Parameter2", parameter2); 

     cmdInsertRecord.ExecuteNonQuery(); 
    } 

回答

2

是否有使用单一的“准备”为多个客户不是简单的功能锁定只允许一个单一的客户端同时运行其他的SqlCommand的方法吗?

你不应该 - 你为什么要想要

您应该每次创建一个新的SqlConnection,并使用新的SqlCommand。让连接池和(可能)语句池句柄使其高效。

有一个静态的SqlConnectionSqlCommand只是要求麻烦,国际海事组织。

+0

我想做这样的事情,因为这些命令被多次调用不同的值 - 这正是应该创建一个准备好的命令的情况。 – jzacharuk 2012-08-01 18:32:59

+0

@jzacharuk - 我仍然没有看到全局sqlcommand对象中的任何好处,为什么不能在需要时在本地声明它并在完成使用时将其处置掉? – JonH 2012-08-01 18:36:47