您是否可以在同一命令中执行带有多个文件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();
}
}
答案 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插入。