一种通用类型的字典

时间:2019-03-11 23:30:45

标签: c# performance object collections boxing

我正在编写一个程序,该程序读取一些3D虚拟模型,然后将一些信息(不同类型,例如int,float,datetime等)写入SQL db。 数据库中有很多表,它们的结构都不同(不同类型的列数不同),所以我想编写一种插入数据库的方法,这种方法足够通用,而不必为它编写特定的方法。每张桌子。 为此,我使用StringBuilder使用Dictionary构建SQL命令,以从调用插入方法的方法中提供正确的参数:

    public static object WriteDbTable(string tableName, Dictionary<string, object> valuesToWrite)
    {
        try
        {
            using (SqlConnection connection =
                new SqlConnection(ConnectToDB().ConnectionString))
            {
                // Open connection to db
                connection.Open();

                // Create SQL command object
                SqlCommand command = connection.CreateCommand();

                // Build string with list of columns where to input values in db
                // To be plugged into command creation
                StringBuilder columnsString = new StringBuilder();
                for (int i = 0; i < valuesToWrite.Keys.Count; i++)
                {
                    if (i < valuesToWrite.Keys.Count - 1)
                    {
                        columnsString.Append('[' + valuesToWrite.Keys.ElementAt(i) + "], ");
                    }
                    else
                    {
                        columnsString.Append('[' + valuesToWrite.Keys.ElementAt(i) + "]");
                    }
                }

                // Build string with list of values to input in db
                // To be plugged into command creation
                StringBuilder valuesString = new StringBuilder();
                for (int i = 0; i < valuesToWrite.Keys.Count; i++)
                {
                    if (i < valuesToWrite.Keys.Count - 1)
                    {
                        valuesString.Append('@' + valuesToWrite.Keys.ElementAt(i) + ", ");
                    }
                    else
                    {
                        valuesString.Append('@' + valuesToWrite.Keys.ElementAt(i));
                    }
                }

                // Build the SQL instruction
                command.CommandText = string.Format(
                    "insert into {0} ({1}) values ({2});",
                    tableName,
                    columnsString,
                    valuesString
                    );

                // build command values
                foreach (KeyValuePair<string, object> pair in valuesToWrite)
                {
                    command.Parameters.AddWithValue($"@{pair.Key}", pair.Value);
                }

                // Execute command getting back the identity (/primary key) of the insertion
                return command.ExecuteNonQuery();
            }
        }

因此,以这种方式,在主要方法中,我可以这样称呼:

    private void WriteTimestamp()
    {
        // What time is the audit starting?
        DateTime timestamp = DateTime.Now;
        // Write file information to the AUDITS table
        Dictionary<string, object> stamp = new Dictionary<string, object>()
        {
            { "auditDate", timestamp }
        };
    }

在不编写特定方法的情况下可以调用此函数的时间:

    private void WriteGenericFileInfo(int auditId, string filePath)
    {
        // Write file information to the FILES table
        Dictionary<string, object> fileInfo = new Dictionary<string, object>()
        {
            { "auditId", auditId },
            { "projectId", 2 },
            { "disciplineId", 1 },
            { "filePath", filePath },
            { "fileSize", Utilities.BytesToMB(new FileInfo(filePath).Length) }
        };
    }

现在,这非常有用,因为我只需要管理一种方法即可在表中具有不同类型的不同列数的表中写入数据库中任何类型的数据。
但是,问题是,我每次都必须隐式地字典的值,并且在某个时候,我必须在一次运行中写几千个条目。程序,因此恐怕会严重影响(而不是数据库的)性能。

当然,使用 dynamic 类型也不是解决方案,因为它仍然会将值装箱到对象上。

在这种情况下我应该怎么做才能避免装箱,从而获得更好的性能?

感谢任何提示!

0 个答案:

没有答案