c#将多个blob插入到同一个表中

时间:2018-04-27 11:23:33

标签: c# sql odbc blob

您是否可以在同一命令中执行带有多个文件blob读取的insert语句?

在下面的代码中,inputfile包含以下内容:

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 :(得分:2)

首先,你甚至使用2/3存储blob的策略吗?下面是两个常见和SQL Server特殊方法的一个很好的列表,试图将它们组合起来:https://www.simple-talk.com/sql/learn-sql-server/an-introduction-to-sql-server-filestream/

其次,通过字符串conaction构建查询只会让您接触到SQL注入。你真的应该使用SQL参数语法。除了being safer之外,它们甚至可能更快,因为SQL服务器不需要暗示类型。您可以明确地告诉它类型和正确的映射。

第三,我假设你在某种形式的多任务处理中调用了一个类似于insert_blob_file的函数。 SQL操作是网络操作,这些操作可能需要很长时间,不管怎样。

至于实际问题:在插入或更新大量数据时,批处理非常重要。你想立刻做足够的事情以避免开销。但不是那么多,你最终会锁定表格,从而可能在整个数据库中锁定很长时间。特别是如果与客户端的网络连接不是最快的。我总是建议在DBMS端进行批量插入,以避免这种情况,但似乎不太可能在这里做到这一点。

对于blob,每个插入都应该是一个单独的工作。甚至不要尝试进行批量blob插入。

相关问题