1

クラス People_val があります。このクラスのリストを別のクラスで作成します。次に、このリストに対して foreach を実行し、項目ごとにその ToSQL() 関数を呼び出して、挿入クエリを取得します。リスト数は 50,000 レコードを超えています。9774 番目のクエリは完全には形成されていません。 9771 INSERT INTO CONVERSION_PEOPLE_VALIDATION VALUES (16413,'Jnto','Johnson',このため、コマンドは実行されず、トランザクションはロールバックされます。foreach で完全な文字列を取得するにはどうすればよいですか。

public class People_Val
{
    public int MEMBERS_ID;
    public string PFirstName;
    public string PLastName;

    public DateTime? BIRTH_DATE;
    public string RELATIONSHP;

    public string ToSQL()
    {            
        return string.Format("INSERT INTO CONVERSION_PEOPLE_VALIDATION VALUES ({0},'{1}','{2}','{3}', TO_CHAR('{4}', 'DD-MON-YYYY'))",
                             MEMBERS_ID, PFirstName.Replace("'","\""), PLastName.Replace("'","\""), RELATIONSHP, BIRTH_DATE);
    }
}

public void insertPeopleValTrans(List<People_Val> _lstPeoplevals)
{
    int count=0;
    TextWriter tw = new StreamWriter(@"C:\PeopleVal.txt");
    using (OracleConnection conn = new OracleConnection(connectionStr)) {
        conn.Open();
        OracleTransaction trans;
        trans = conn.BeginTransaction();
        try {
            foreach (People_Val peopleVal in _lstPeoplevals) {
                OracleCommand cmd = new OracleCommand(peopleVal.ToSQL(), conn, trans);
                cmd.ExecuteNonQuery();
                count++;
                if (count % 500 == 0) {
                    Console.WriteLine("saving " + count.ToString() + " Records");
                }
                tw.WriteLine(count.ToString()+" "+ peopleVal.ToSQL());
            }
            trans.Commit();
            tw.Close();
        } catch (Exception ex) {
            Console.WriteLine(ex.Message);
            trans.Rollback();
        }
        conn.Close();
    }          
}
4

2 に答える 2

3

おそらく、一部のデータにアポストロフィが含まれているため、クエリが失敗する可能性があります。

入力をパラメーター化してみてください... RELATIONSHIP フィールドが生データのように見え、そこに問題がある可能性があります。http://www.devart.com/dotconnect/oracle/articles/parameters.htmlをご覧ください。これで問題が解決すると確信しています。

行 9771 に貼り付けてみましょう...

于 2012-09-28T22:56:53.410 に答える
0

50000 件のレコードすべてが同時に成功または失敗することが本当に必要なのでしょうか? それ以外の場合は、トランザクションをスキップするか、少なくとももう少し頻繁にコミットしてください。

if (count % 500 == 0)
{
    trans.Commit();
    Console.WriteLine("saving " + count.ToString() + " Records");
    trans = conn.BeginTransaction();
}

そして、前のコメントに同意します。これは、Entity Framework Code First を使用した最小限の作業です。

于 2012-09-28T22:39:34.560 に答える