c # вставить несколько BLOB-объектов в одну таблицу - PullRequest
0 голосов
/ 27 апреля 2018

Можете ли вы выполнить оператор вставки с несколькими чтениями файловых BLOB-объектов в одной команде?

В приведенном ниже коде входной файл содержит следующее:

string[] inputfile = {"C:\\test_blob\\blob1.pdf","C:\\test_blob\\blob2.jpg"};

Я не уверен, можно ли сделать cmd.Parameters до cmd.CommandText или я могу сделать более одного File.ReadAllBytes() as a cmd.Parameter.

public static void insert_blob_file(string dbname, string uid, string pwd, string[] inputfile)
{
    using (var conn = new OdbcConnection("DSN=" + dbname + ";UID=" + uid + ";pwd=" + pwd))
    {
        conn.Open();
        using (var cmd = conn.CreateCommand())
        {
            for (int i = 0; i < inputfile.Count();i++)
            {
                var inputStream = new FileStream[i];
                using (inputStream[i] = File.OpenRead(inputfile[i]))
                {
                    cmd.Parameters.AddWithValue("blob" + i.ToString(), File.ReadAllBytes(inputfile[i]));
                }
                cmd.CommandText = "INSERT INTO MyTable (Id, MyBlobColumn,String1,MyBlobColum1,String2,String3) VALUES (1,@blob0,SomeString,@blob1,SomeString,SomeString)";
            }
                cmd.ExecuteNonQuery();
        }
        conn.Close();
    }
}

1 Ответ

0 голосов
/ 27 апреля 2018

Во-первых, какую из 2/3 стратегий для хранения капель вы вообще используете? Вот хороший список двух общих подходов и специального подхода к SQL Server, чтобы попытаться объединить их: /

Во-вторых, построение запросов с помощью строковой конформации просто представит вас SQL-инъекциям. Вы действительно должны вместо этого использовать синтаксис параметров SQL. Помимо того, что безопаснее , они могут быть даже быстрее, поскольку серверам SQL не требуется указывать типы. Вы можете явно указать ему типы и правильное отображение.

В-третьих, я полагаю, что вы вызываете функцию типа insert_blob_file в какой-то форме многозадачности. Операции SQL - это сетевые операции, которые могут занимать очень много времени, так или иначе.

Что касается актуальной проблемы: при вставке или обновлении больших объемов данных пакетирование очень важно. Вы хотите сделать достаточно сразу, чтобы избежать накладных расходов. Но не так много, вы в конечном итоге блокируете таблицу и, следовательно, всю БД на очень долгое время. Особенно, если сетевое подключение к клиенту не самое быстрое. Я всегда советую делать массовые вставки на стороне СУБД, чтобы избежать этого, но вряд ли вы можете сделать это здесь.

С каплями каждая вставка должна быть отдельной работой. Даже не пытайтесь делать массовые вставки BLOB-объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...