0

データベースに接続し、選択を結合してから、ネットワーク内のサーバーにレコードを挿入する C# アプリケーションを作成しています。

しかし、約 40,000 のレコードがあり、私のプログラムは 1 秒のように 1 つのレコードを処理します。

パフォーマンスを向上させる方法がわかりません。これが私のSQLゲッターとインサーターです。助言がありますか?

    public bool insert_and_ConfirmSQL(String Query, String comments)
    {
        bool success = false;
        NpgsqlCommand cmd = new NpgsqlCommand();
        NpgsqlConnection mycon = new NpgsqlConnection();
        string connstring = String.Format("Server={0};Port={1}; User Id={2};Password={3};Database={4};", tbHost, tbPort, tbUser, tbPass, tbDataBaseName);
        mycon.ConnectionString = connstring;
        cmd = mycon.CreateCommand();
        cmd.CommandText = Query;
        mycon.Open();

        int temp = 0;
        try
        {
            temp = cmd.ExecuteNonQuery();
            success = true;
        }
        catch
        {
            success = false;
        }
        finally
        {
            if (mycon.State.ToString() == "Open")
            {
                mycon.Close();
            }
        }
        return success;
    }


    public String getString(String sql, NpgsqlConnection conn)
    {
        using (DataSet ds = new DataSet())
        {
            using (NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, conn))
            {
                da.Fill(ds);
                if (ds.Tables.Count > 0)
                {
                    DataTable dt = ds.Tables[0];
                    //  check count of Rows 
                    if (dt.Rows.Count > 0)
                    {
                        object o = dt.Rows[0][0];
                        if (o != DBNull.Value && o != null)
                        {
                            return o.ToString();
                        }
                    }
                }
            }
        }
        // Return default value 
        return "";
    }
4

2 に答える 2

3

私たちはそれらを知らないので、あなたのSQLステートメントであなたを助ける機会はありません.

唯一の (推測する) 目に見える問題は、毎回新しい接続を使用して 40K レコードをループしようとしていることです (その方法はご存じのとおりです)。コードとして提供される両方のルーチンは、まさにこれを行います。では、insert_and_ConfirmSQL に 40K の呼び出し、および/または getString ルーチンにさらに 40K の呼び出しが必要ですか?

本当にループする場合は、コードを更新して、接続を閉じずに 1 つの接続のみを使用するようにします。データセットでも同じことができます (使用する前にデータをクリアする必要があります: ds.Clear())。

言うまでもなく、クエリが (データに関して) 巨大である場合、および/またはインデックスがクエリをカバーしていない場合、遅延が予想されます。

このアプローチを試して、お知らせください。

于 2012-06-22T16:36:31.263 に答える