c#
  • mysql
  • visual-studio
  • 2017-01-29 15 views 1 likes 
    1

    外部キーである列を更新しようとしていますが、NULL値に設定しようとしていますが、エラー "ERROR 1452:子行:外部キー制約が失敗した」UPDATEクエリを使用して外部キーを更新します。

    try 
    { 
        con.Open(); 
        MySqlCommand cmd = new MySqlCommand(
           "UPDATE tblcdsummary 
            set PersonalInfoID = '" + DBNull.Value.ToString() + 
            "' WHERE CDID = '" + looplabel2.Text + "'", con); 
    
    
        cmd.ExecuteNonQuery(); 
        con.Close(); 
    } 
    catch (Exception x) 
    { 
        MessageBox.Show(x.Message); 
    } 
    
    +1

    **警告**:生の文字列をクエリに挿入しないでください。 **常に**適切にエスケープする(http://bobby-tables.com/csharp)すべてのユーザーデータを作成するか、恐ろしい[SQLインジェクションバグ](http://bobby-tables.com/)を作成します。 。 – tadman

    答えて

    2

    はあなたが結果が何であるかを知っています(つまり、表は、このキーを使用してreffered。) DBNull.Value.ToString()の?
    空の文字列です。つまり、これらの2つのテーブルの間に関係がある場合は、空の文字列に基づいて更新されたレコードを2番目のテーブルのレコードに関連付けようとしています。
    もちろん、関連テーブルのプライマリキーが空の文字列に設定されたレコードがない場合、更新は失敗します。もちろん

    明示的に(何の引用符を)それを書くんその後、NULLにそのフィールドを設定したい場合は

    MySqlCommand cmd = new MySqlCommand(
          @"UPDATE tblcdsummary 
           set PersonalInfoID = NULL 
           WHERE CDID = @id", con); 
    cmd.Parameters.Add("@id", MySqlDbType.VarChar).Value = looplabel2.Text; 
    

    これはあなたがPersonalInfoID列

    PSに格納するNULL許可している場合にのみ機能します。パラメータ化されたクエリを使用するようにコードを変更しました。これは、SQLコマンド・テキストを作成する唯一の正しい方法です。
    文字列を連結しないでください。それは本当に大きなエラーです(Sql Injectionを検索してください)

    +1

    これは実際に助けてくれてありがとう、小さなレッスンをありがとう。注意してください:) – Ekko

    2

    あなたがその実際のテーブルでは、このキーの最初の更新値に必要

    +0

    あなたは、それが参照されている場所にプライマリキーを更新する必要があるという意味ですか? – Ekko

    +0

    はいRefferedテーブル のプライマリキーを更新する必要があります。外部キーに与える値は、refferedテーブルのプライマリキーに存在することがチェックされますか? – Yuva

    関連する問題