1

私はテーブルを持っています

ProjectID
ProjectName
Project description

プロジェクト名は一意である必要があります。一意のロジックを実装するために、プロジェクト名の名前を次のようにストアドプロシージャに送信しています。

Create proc CheckName
@Project Name
as
begin
select count(ProjectName)
where ProjectName=@Project Name

CSページにカウントを返し、if(count> 0){//追加}のようにチェックします

このコードは、追加すると正常に機能します。プロジェクトの説明フィールドを更新する場合、プロジェクト名のチェックが再度実行され、カウント1(明らかです)が返され、プロジェクト名が既に存在し、テーブルの他のフィールドを更新できません。

テーブル内の一意のフィールドを維持するために実装できる他のロジック。助けてくれてありがとう。

4

2 に答える 2

2

ProjectName列に一意の制約を追加してみませんか?ProjectIDを主キーとして作成し、IDシードを配置して、自動的にインクリメントされるようにします。これにより、クラスター化インデックスがProjectID列に自動的に追加されます。また、データベースの照合をLATIN1_GENERAL_CI_AIに設定して、ProjectName列の値がデータベースで大文字と小文字を区別せずに比較されるようにします。大文字と小文字を区別する比較が必要な場合は、照合をLATIN1_GENERAL_CI_ASに設定できます。ProjectName列に一意キー制約を追加するには、次のようにします。

ALTER TABLE PROJECT ADD CONSTRAINT
            UX_PROJECT_NAME UNIQUE NONCLUSTERED
    (
                PROJECTNAME
    )

その後、更新または挿入するだけで、重複するプロジェクト名が挿入/更新されると、例外がスローされ、キャッチして処理できます。

于 2013-01-30T17:35:36.663 に答える
0

特定のフィールドを一意にしたい場合に、レコードの更新を実装する例

 string connectionstring = WebConfigurationManager.ConnectionStrings[""].ConnectionString;
            SqlConnection con = new SqlConnection(connectionstring);
            SqlCommand cmd = new SqlCommand("InsertEmployee", con);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add("@Id", SqlDbType.Int, 4);
            cmd.Parameters["@Id"].Value = Convert.ToInt32(TextBox1.Text);
            cmd.Parameters.Add("@EmpName", SqlDbType.NVarChar, 50);
            cmd.Parameters["@EmpName"].Value = Convert.ToString(TextBox2.Text);
            cmd.Parameters.Add("@Salary", SqlDbType.Decimal);
            cmd.Parameters["@Salary"].Value = Convert.ToDouble(TextBox3.Text);
            try
            {
                con.Open();
                cmd.ExecuteScalar();
                con.Close();
            }
            catch (Exception ex )
            {
                if (ex.Message.Contains("UNIQUE KEY constraint"))
                Lblmessage.Text = "Field already exist";
            }
于 2013-02-04T06:52:31.263 に答える