方法优化 - C#

Jam*_*ing 2 c# system.data.sqlite parameterized-query

我开发了一个方法,允许我通过参数传入表(字符串),列数组(字符串)和值数组(对象),然后我使用这些参数创建参数化查询.虽然它工作得很好,代码的长度以及多个for循环都会产生代码气味,特别是我觉得我用来在列和值之间插入逗号的方法可以用不同的更好的方式完成.

public static int Insert(string source, string[] column, object[] values)
{
    int rowsAffected = 0;
    try
    {
        using (SQLiteConnection conn = new SQLiteConnection(connectionString))
        {
            StringBuilder query = new StringBuilder();
            query.Append(" INSERT INTO ");
            query.Append(source);
            query.Append("(");

            for (int i = 0; i < column.Length; i++)
            {
                query.Append(column[i]);

                if (i < values.Length - 1)
                {
                    query.Append(",");
                }
            }

            query.Append(")");
            query.Append(" VALUES ");
            query.Append("(");

            for (int i = 0; i < values.Length; i++)
            {
                query.Append("@" + values[i].ToString());

                if (i < values.Length - 1)
                {
                    query.Append(",");
                }
            }

            query.Append(")");

            conn.Open();
            using (SQLiteCommand cmd = new SQLiteCommand(query.ToString(), conn))
            {
                for (int i = 0; i < values.Length; i++)
                {
                    cmd.Parameters.AddWithValue("@" + values[i].ToString(), values[i]);
                }
                rowsAffected = cmd.ExecuteNonQuery();
            }
        }
        return rowsAffected;
    }
    catch (Exception e)
    {
        MessageBox.Show(e.Message);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我正在使用System.Data.SQLite库与数据库进行交互.

谢谢你的任何建议!

que*_*rin 6

这是使用StringBuilder使用分隔符追加多个值的惯用方法:

string separator = ",";
for (int i = 0; i < column.Length; i++)
{
    query.Append(column[i]);
    query.Append(separator);
}
query.Length -= separator.Length;
Run Code Online (Sandbox Code Playgroud)

这假设您将至少有一个值,并且通常在我使用它的地方,如果没有至少一个值(并且看起来您的场景就是这样)将是一个错误.

您还可以将此代码全部保留为SQL注入.

你似乎试图使用参数,但我认为你没有正确地完成它.我读取代码的方式是,您使用的是参数的实际值而不是索引.我建议这个修改(这假设您的列名称来自可信来源,但您的值不是):

        for (int i = 0; i < values.Length; i++)
        {
            query.Append("@" + i.ToString()); // instead of query.Append("@" + values[i].ToString());

            if (i < values.Length - 1)
            {
                query.Append(",");
            }
        }

        query.Append(")");

        conn.Open();
        using (SQLiteCommand cmd = new SQLiteCommand(query.ToString(), conn))
        {
            for (int i = 0; i < values.Length; i++)
            {
                cmd.Parameters.AddWithValue("@" + i.ToString(), values[i]); // instead of cmd.Parameters.AddWithValue("@" + values[i].ToString(), values[i]);
            }
            rowsAffected = cmd.ExecuteNonQuery();
        }
    }
Run Code Online (Sandbox Code Playgroud)