【问题标题】:c# insert multiple blobs into same tablec#将多个blob插入同一个表
【发布时间】:2018-10-08 05:42:44
【问题描述】:

您可以在同一命令中执行包含多个文件 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();
    }
}

【问题讨论】:

    标签: c# sql odbc blob


    【解决方案1】:

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

    第二次通过字符串连接构建查询只会让您接触到 SQL 注入。您确实应该改用 SQL 参数语法。除了being safer,它们甚至可能更快,因为 SQL 服务器不需要隐含类型。您可以明确地告诉它类型和正确的映射。

    第三,我假设您正在以某种形式的多任务处理调用像 insert_blob_file 这样的函数。 SQL 操作是网络操作,它们可能需要很长时间,无论哪种方式。

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

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

    【讨论】:

    • 感谢您的建议,但是如果您有一个包含多个 blob 的表,当该行已经存在时如何插入剩余的 blob?
    • @user3308131:如果您有一个包含多个 blob 列的表?您只需使用 SQL 参数和更新。但总的来说,这是您可能想要避免的事情。正确解决 1:N 关系是您应该在这种情况下做的事情。大容量数据和长行不利于网络传输和整体 SQL 性能。如果每个元素都需要一堆 blob,请正确解决 1:N 甚至 N:M 关系。
    • 在这件事上我真的别无选择,我正在做的是从几个 oracle 数据库创建一个新数据库到一个 SQL 服务器数据库。我同意你的观点,BLOB 很糟糕,你应该只存储指向数据的链接而不是将它们存储在数据库本身中,但是,正如你可能已经知道的那样,有些事情没有争议。
    • @user3308131 Blobbs 本身也不错。他们是一种本质。你如何处理它们,这可能是好是坏。如果您正在创建一个新的 SQL Server 数据库,您不妨走文件流路线。至少问问你是否可以使用它。如果您创建一个新数据库,则正确解决未正确解决的 1:N 关系(一个表中的多个列而不是单独的表)。如果您需要旧代码的旧结构?这就是视图的用途。如果有任何东西可以在一次插入或更新中操作多个 blob 列,那么它必须是 SQLParameters。他们绕过了查询长度的限制。
    猜你喜欢
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    • 2018-04-29
    • 1970-01-01
    • 2016-02-15
    • 1970-01-01
    相关资源
    最近更新 更多