如何使用存储过程将数据快速插入SQL Server
本文关键字:插入 SQL Server 数据 何使用 存储过程 | 更新日期: 2023-09-27 18:18:18
我有一个c#应用程序,它从不同的客户端接收数据并将该数据插入SQL Server。我每秒钟都能得到数据,甚至更快,但是我的代码遇到了一些问题:
static SqlConnection objSqlConn = null;
static SqlCommand objSqlCmd = null;
public static void SaveClientHistory(String strMessage, String strClientIP)
{
try
{
using (objSqlConn = new SqlConnection(strConnectionString))
{
using (objSqlCmd = new SqlCommand("procInsertHistory", objSqlConn))
{
objSqlCmd.CommandTimeout = 0;
objSqlCmd.CommandType = CommandType.StoredProcedure;
objSqlCmd.Parameters.AddWithValue("@strMessage", strMessage);
objSqlCmd.Parameters.AddWithValue("@strClientIP", strClientIP);
objSqlConn.Open();
objSqlCmd.ExecuteNonQuery();
}
}
}
catch (Exception Ex)
{
throw Ex;
}
finally
{
if(objSqlConn != null && objSqlConn.State != ConnectionState.Closed)
{
objSqlConn.Close();
objSqlConn.Dispose();
}
}
}
出现不同类型的异常:
连接未关闭。连接的当前状态是正在连接。
内部连接致命错误。
ExecuteNonQuery需要一个打开的可用连接。连接的当前状态是正在连接。
如果上面的代码有任何错误,请告诉我,或者建议任何其他方法来完成这个任务。
谢谢
Edited -进一步简化了程序以更好地解决问题:删除了try/catch,因为它没有做任何有用的事情;方法不再是static
;现在所有的输入都作为参数传递进来——包括strConnectionString
;显式设置连接超时;在SqlCommand
对象实例化之前打开连接;命令超时时间为10秒。
由于性能是您关心的问题,请注意,您不应该担心试图保持连接打开以供重用。默认情况下,SQL Server连接池是打开的,因此没有必要尝试用您自己的方法缓存连接。
似乎除了试图打开连接和执行非查询之外,还有一些事情正在发生,所以我试图进一步简化您的代码。我希望它能帮助解决你的问题。
public int SaveClientHistory(String strConnectionString, String strMessage, String strClientIP)
{
// You can double-up using statements like this (for slightly better readability)
using (SqlConnection objSqlConn = new SqlConnection(strConnectionString))
{
objSqlConn.ConnectionTimeout = 10; // Creating a connection times out after ten seconds
objSqlConn.Open();
using (SqlCommand objSqlCmd = new SqlCommand("procInsertHistory", objSqlConn))
{
objSqlCmd.CommandTimeout = 10; // Creating a command times out after ten seconds
objSqlCmd.CommandType = CommandType.StoredProcedure;
objSqlCmd.Parameters.AddWithValue("@strMessage", strMessage);
objSqlCmd.Parameters.AddWithValue("@strClientIP", strClientIP);
return objSqlCmd.ExecuteNonQuery();
}
}
}
这三个错误似乎都与连接有关。在我的一个应用程序中,我像下面这样实现你的功能。我希望这对你有帮助:
public static void SaveClientHistory(String strMessage, String strClientIP)
{
SqlConnection objSqlConn = new SqlConnection(strConnectionString);
SqlCommand objSqlCmd = new SqlCommand("procInsertHistory", objSqlConn)
objSqlCmd.CommandType = CommandType.StoredProcedure;
objSqlCmd.Parameters.AddWithValue("@strMessage", strMessage);
objSqlCmd.Parameters.AddWithValue("@strClientIP", strClientIP);
try{
objSqlConn.Open();
objSqlCmd.ExecuteNonQuery();
}
catch (Exception Ex)
{
throw Ex;
}
finally
{
if(objSqlConn.State == ConnectionState.Open)
objSqlConn.Close();
}
}