在ASP.Net中添加具有相同主键数据的数据

Son*_*nül 1 .net c# sql asp.net gridview

我有一个表名AVUKAT和它的列(AVUKAT,HESAP(主键),MUSTERI)

所有MUSTERI都有一个唯一HESAP(int).

简单我有这样的页面.

在此输入图像描述

第一个下拉选择MUSTERI,第二个是AVUKAT

我用这段代码自动计算HESAP(intPrimary KEY).(在背景上.)

protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
    {
        string strConnectionString = ConfigurationManager.ConnectionStrings["SqlServerCstr"].ConnectionString;

        SqlConnection myConnection = new SqlConnection(strConnectionString);
        myConnection.Open();
        string hesapNo = DropDownList1.SelectedItem.Value;

        string query = "select A.HESAP_NO from YAZ..MARDATA.S_TEKLIF A where A.MUS_K_ISIM = '" + hesapNo + "'";

        SqlCommand cmd = new SqlCommand(query, myConnection);


        if (DropDownList1.SelectedValue != "0" && DropDownList2.SelectedValue != "0")
        {
            Add.Enabled = true;
            Label1.Text = cmd.ExecuteScalar().ToString();
        }
        else
        {
            Add.Enabled = false;

        }
        Label1.Visible = false;
        myConnection.Close();
    }
Run Code Online (Sandbox Code Playgroud)

我只是HESAP用这段代码计算.

我的ADD按钮点击功能是;

protected void Add_Click(object sender, EventArgs e)
    {


        try
        {
            string strConnectionString = ConfigurationManager.ConnectionStrings["SqlServerCstr"].ConnectionString;

            SqlConnection myConnection = new SqlConnection(strConnectionString);
            myConnection.Open();


            string hesap = Label1.Text;
            string musteriadi = DropDownList1.SelectedItem.Value;
            string avukat = DropDownList2.SelectedItem.Value;

            SqlCommand cmd = new SqlCommand("INSERT INTO AVUKAT VALUES (@MUSTERI, @AVUKAT, @HESAP)", myConnection);

            cmd.Parameters.AddWithValue("@HESAP", hesap);
            cmd.Parameters.AddWithValue("@MUSTERI", musteriadi);
            cmd.Parameters.AddWithValue("@AVUKAT", avukat);
            cmd.Connection = myConnection;



            SqlDataReader dr = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
            Response.Redirect(Request.Url.ToString());
            myConnection.Close();
        }
        catch (Exception)
        { 
            ScriptManager.RegisterClientScriptBlock(this, this.GetType(), " ", "alert('Bu Mü?teri Zaten Mevcut!')", true);

        }
    }
Run Code Online (Sandbox Code Playgroud)

使用的原因try catch,如果有人尝试添加与MUSTERI相同的HESAP(int)值,我想显示一条错误消息,不要添加表.

但是当我尝试添加相同的MUSTERI(也是相同的HESAP)时,添加相同的MUSTERI和HESAP = 0值.

在此输入图像描述

我该如何防止这种情况?我选择HESAP列是主键,但仍然添加相同的MUSTERI.

Ale*_*gas 5

这里没有什么太明显可以解释你所看到的行为.最可能的问题Label1.Text0在执行插入之前的值是,可能在ASP.NET页面生命周期的其他地方设置.确保在hesap初始化之后添加一行代码Add_Click...

Response.Write("<strong>hesap == " + hesap + "</strong>");
Run Code Online (Sandbox Code Playgroud)

...并注释掉Response.Redirect所以你可以看到输出.

您还可以对代码进行一些改进,以减少问题发生的可能性.

清理输入以避免SQL注入非常重要.希望您已在其他地方执行此操作,但未在您的代码段中显示.如果你不知道这是什么,那么关于它大量问题就在这里.

此外,您不是为了检索任何行而进行查询,因此请使用ExecuteNonQuery.所以我也要换掉这条线......

SqlDataReader dr = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
Run Code Online (Sandbox Code Playgroud)

...与...

int numberOfRows = cmd.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)

然后检查ExecuteNonQuery确保numberOfRows== 1 的值,以便了解实际发生的事情.

您还应该使用语句包装您的SqlConnectionSqlCommand初始化者.这意味着即使出现问题,它们也会自动处理.这将防止内存问题和连接保持打开的问题.using

最后,让异常值通过catch将该行更改为语句流入语句catch (Exception ex).输出异常使用ex.ToString()以查看其所有详细信息.现在,如果发生异常,您不知道可能出现的问题.