1

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 にブレークポイントを設定すると、データベースから削除されます。そうしないと、何も削除されません。

4

2 に答える 2

1

これを使えばcmd.BeginExecuteNonQuery()使えますEndExecuteNonquery()

そうしないと、ファイルが削除されず、メモリ リークの問題が発生する可能性があります。

最良の方法は使用することですcmd.ExecuteNonQuery();

于 2013-06-17T10:35:11.537 に答える
0

これは、Connection.Close を削除したときにも発生しますか? 非同期を削除しているため、ブレークポイントがあり、コードの実行が待機している場合とは異なり、操作が完了する前に接続が閉じられている可能性があります。

また、SqlConnection を使用する代わりに、次のように使用することもできます。

using (sqlConnection con = new SqlConnection()) 
{
// your code
 }

このようにして、接続が範囲外になったとき、または何か問題が発生したときに、接続が自動的に閉じられます。

cmd.ExecuteNonQuery() があなたの人生を楽にするだろうというMahaSwethaに同意します。また、cmd.ExecuteNonQuery() は、変更された行数を示す int を返します。重宝することもあります。

于 2013-06-17T10:36:56.743 に答える