如何使用存储过程将数据快速插入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需要一个打开的可用连接。连接的当前状态是正在连接。

如果上面的代码有任何错误,请告诉我,或者建议任何其他方法来完成这个任务。

谢谢

如何使用存储过程将数据快速插入SQL Server

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();
    }
}