我正在从包含BLOB的数据库中读取行。我将这些blob中的每一个都保存为我的磁盘文件。之后我想删除刚读过的行。现在的问题是:当我调试时,所有的工作就像一个魅力。当我没有调试断点运行时,它不会删除任何东西!它没有出现错误。
我使用C#和MS-SQL服务器。
这是我的代码:
class Program
{
static void Main(string[] args)
{
if (args[0] == "/?" || args.Length != 1)
{
Console.WriteLine("BlobReader");
Console.WriteLine("Will read blob from database and write is as a file to destination specified in database.");
Console.WriteLine();
Console.WriteLine("BlobReader <AppName>");
Console.WriteLine();
Console.WriteLine("<AppName>: Application name which identifies which files to extract and save.");
EndProgram();
}
string now = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss.fff");
Console.WriteLine("writing files to disk");
bool success = SqlBlob2File(args[0], now);
if (success)
{
Console.WriteLine("Deleting db");
DeleteRows(args[0], now);
Console.WriteLine("Db deleted");
}
EndProgram();
}
static void EndProgram()
{
Console.WriteLine();
Console.WriteLine("Press any key to end.");
Console.ReadLine();
}
static private void DeleteRows(string app, string now)
{
try
{
string connectionString = ConfigurationManager.ConnectionStrings["dbConn"].ToString();
SqlConnection connection = new SqlConnection(connectionString);
string sql = string.Format("DELETE FROM Blobs WHERE Application = '{0}' AND CreatedDate < '{1}'", app,
now);
SqlCommand cmd = new SqlCommand(sql, connection);
connection.Open();
cmd.BeginExecuteNonQuery();
connection.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
static private bool SqlBlob2File(string app, string now)
{
bool success;
string connectionString = ConfigurationManager.ConnectionStrings["dbConn"].ToString();
SqlConnection connection = new SqlConnection(connectionString);
try
{
int blobCol = 0; // the column # of the BLOB field
string sql =
string.Format(
"SELECT Blob, Drive, Folder, FileName FROM Blobs WHERE Application='{0}' AND CreatedDate < '{1}'",
app, now);
SqlCommand cmd = new SqlCommand(sql, connection);
connection.Open();
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
string destFilePath = string.Format("{0}{1}{2}", dr["Drive"], dr["Folder"], dr["FileName"]);
Byte[] b = new Byte[(dr.GetBytes(blobCol, 0, null, 0, int.MaxValue))];
dr.GetBytes(blobCol, 0, b, 0, b.Length);
System.IO.FileStream fs = new System.IO.FileStream(destFilePath, System.IO.FileMode.Create,
System.IO.FileAccess.Write);
fs.Write(b, 0, b.Length);
fs.Close();
Console.WriteLine("Blob written to file successfully");
}
dr.Close();
success = true;
}
catch (SqlException ex)
{
success = false;
Console.WriteLine(ex.Message);
}
finally
{
connection.Close();
}
return success;
}
}
如果我在方法DeleteRows中设置断点,它会从数据库中删除。如果不这样做,则不会删除任何内容。
答案 0 :(得分:1)
如果您使用此cmd.BeginExecuteNonQuery()
,则使用EndExecuteNonquery()
。
否则,它不会被删除,并且可能会造成内存泄漏问题。
最好的方法是使用cmd.ExecuteNonQuery();
答案 1 :(得分:0)
删除Connection.Close时是否也会发生这种情况?可能是因为您正在删除异步,在操作完成之前关闭连接不像您有断点并且代码执行等待。
您也可以使用:
而不是像您一样使用SqlConnectionusing (sqlConnection con = new SqlConnection())
{
// your code
}
这样,当连接超出范围或出现问题时,连接会自动关闭。
我同意MahaSwetha的观点,即cmd.ExecuteNonQuery()会让您的生活更轻松。此外,cmd.ExecuteNonQuery()返回一个int,告诉您已更改了多少行。有时会派上用场。