我已经创建了一个类来简化我的应用程序中SQL服务器的使用。
public static class SqlServer
{
public static void QueryNoReturn(string ConnectionString, string Query, SqlParameter[] Parameters, bool IsStoredProcedure)
{
using (SqlConnection conn = new SqlConnection(ConnectionString))
{
// Create the command to run
SqlCommand command = new SqlCommand(Query, conn);
// If we are running a stored procedure
if (IsStoredProcedure)
command.CommandType = System.Data.CommandType.StoredProcedure;
// Add parameters if they exist
if (Parameters != null)
command.Parameters.AddRange(Parameters);
try
{
// Open the connection to the database
conn.Open();
// Execute the command and assign to the result object
command.ExecuteNonQuery();
conn.Close();
command.Parameters.Clear();
}
catch (SqlException sqlex)
{
throw new Exception(
string.Format("{0} \"{1}\"", IsStoredProcedure ? "Procedure" : "Query", Query),
sqlex);
}
}
}
}
如果我每秒多次调用这种静态方法(大约50次),那么我会看到线程安全问题吗?
我可以轻松地创建一个Factory
或其他一些特定于实例的对象,但我选择此选项不是为了简单。
答案 0 :(得分:2)
由于您没有使用该类的任何共享资源,因此这似乎是“线程安全的”。
这当然忽略了数据库本身的任何并发问题。
您也应该将SqlCommand
创建包装在using
语句中。
由于您在SqlConnection
语句中创建了using
,因此您无需在其上显式调用Close
,因为它将在处理连接时完成。< / p>
答案 1 :(得分:1)
没有。访问共享资源时可能会遇到线程安全问题,但是你不这样做(至少在这种方法中没有)。
顺便说一下,将conn.Close();
移动到finally
子句,这样就可以关闭连接,即使你遇到异常也是如此。