【发布时间】:2016-01-18 14:01:36
【问题描述】:
流被写入 var-binary 字段,如下所示:
string connectionString = "connection String";
using (SqlConnection conn = new SqlConnection(connectionString)) {
conn.Open();
using (SqlCommand cmd = new SqlCommand("update TableX set Data=@data where id = @id")) {
cmd.Parameters.AddWithValue("@Id", ParameterDirection.Input);
cmd.Parameters.AddWithValue("@Data", streamToStore);
cmd.Connection = conn;
try {
int rows = cmd.ExecuteNonQuery();
} catch (Exception ex) {
// store the so far written data anyway!
}
}
}
当异常发生时,到目前为止所有写入的数据都没有了。所以在发生异常的情况下似乎有某种回滚。有什么方法可以存储到目前为止写入的数据吗?稍后会继续,所以我不在乎它现在是否不完整。
快速示例: 我正在使用的流是网络流。数据在写入数据库时被提取。 假设流的大小为 1000 字节。如果已经接收到 900 个字节(并且以某种方式自动在数据库中某处缓冲)然后发生连接问题(IOException),则所有数据都将丢失。不会将任何内容存储到数据库中。但我想将这 900 个字节存储到 var-binary 字段中(稍后将恢复其余部分)。
【问题讨论】:
-
您必须在关闭连接之前调用 Commit ...否则您的更改将被隐式回滚...
-
确实如此,稍后会完成提交。但这不是问题。问题是,流可以表示写入数据库的巨大 blob。如果在该操作期间发生异常,则数据库中根本没有数据,尽管它已经运行了很长时间。
-
稍后但仍在 using (SqlConnection ... block?
-
@PrfctByDsgn
SqlConneciton没有Commit。 -
单个更新语句总是完全执行或根本不执行...
标签: c# sql-server varbinary