多个用户如何在不混合数据库数据的情况下同时将数据插入SQL数据库。

时间:2014-10-17 12:10:31

标签: c# asp.net sql-server database

我在asp和C#下开发了一个应用程序。此应用程序的想法是让多个用户登录到应用程序并同时将数据插入SQL数据库服务器2008 sp2。 用户创建主题然后插入关于此主题的描述,单个用户可以毫无问题地插入任何描述数据,但是当多个用户插入数据时,数据不会保存或数据混合在数据库上。  例如,如果用户1为Subject 1插入数据:User1 User1.1和User 2为Subject 2插入数据:User2 User2.1则用户的一个数据保存在users2的主题上。 请注意,数据库处于多用户模式.... 你能用例子帮我解决这个问题吗?先谢谢你...

        This Is My C# Code : 
  public void dataInsert()
{
    try
    {
        SqlConnection con = new System.Data.SqlClient.SqlConnection();
        con.ConnectionString = ConfigurationManager.ConnectionStrings["beta"].ConnectionString;
        // storeMulti();

        for (int i = 0; i < howManyFields(); i++)
        {

            TextBox txt = Theat.FindControl("TextBox" + (i + 1)) as TextBox;
            HtmlTableCell cell = Theat.FindControl("Td" + (i + 1)) as HtmlTableCell;
            CheckBox cb = Theat.FindControl("CheckBox" + (i + 1)) as CheckBox;

            TextBox tTitle = Theat.FindControl("tbTitle" + i) as TextBox;
            TextBox tDscr = Theat.FindControl("tbDscr" + i) as TextBox;
            DropDownList dConf = Theat.FindControl("ddConf" + i) as DropDownList;
            DropDownList dType = Theat.FindControl("ddType" + i) as DropDownList;
            HtmlInputFile inFile = Theat.FindControl("tbFile" + i) as HtmlInputFile;

            if (txt.Text.Trim().ToString() != string.Empty)
            {
                //ShowMessageBox("Updated");
                DataSet dsPres = findPresDatasetByLang(Convert.ToInt32(Application["langID"]));
                for (int z = 0; z < dsPres.Tables[0].Rows.Count; z++)
                {
                    System.Data.SqlClient.SqlCommand cmd;
                    cmd = new System.Data.SqlClient.SqlCommand();
                    cmd.Connection = con;                       
                    cmd.CommandText = "INSERT INTO [I_SUBJECT_FIELD] VALUES (@p1,@p2,@p3,@p4,@p5)";

                    cmd.Parameters.AddWithValue("@p1", Convert.ToInt32(Application["subID"].ToString()));
                    cmd.Parameters.AddWithValue("@p2", Convert.ToInt32(dsPres.Tables[0].Rows[z]["ID"].ToString()));
                    cmd.Parameters.AddWithValue("@p3", Convert.ToInt32(Application["langID"].ToString()));
                    cmd.Parameters.AddWithValue("@p4", findFieldTypeID(cell.InnerHtml));
                    cmd.Parameters.AddWithValue("@p5", txt.Text);


                    cmd.Connection.Open();
                    int rowsAffected = cmd.ExecuteNonQuery();
                    cmd.Connection.Close();
                }
            }
               txt.Text = string.Empty;
               cb.Checked = false;
        }
    }

    catch (SqlException sql)
    {
        ShowMessageBox(sql.Message);
    }
    catch (Exception exe)
    {
        ShowMessageBox(exe.Message);
    }
}

1 个答案:

答案 0 :(得分:2)

查看您获取查询参数值的位置:

cmd.Parameters.AddWithValue("@p1", Convert.ToInt32(Application["subID"].ToString()));
cmd.Parameters.AddWithValue("@p3", Convert.ToInt32(Application["langID"].ToString()));

您是从Application值集合中获取它们的。这是不是线程安全的。应用程序的所有并发用户共享相同的Application值集合。因此,当一个用户更新该集合中的值时,其他用户将使用该值。

应将插入数据库的值提供给此函数,而不是在全局Application集合中引用。所以函数签名可能看起来更像这样:

public void dataInsert(int subjectId, int languageId)
{
    // implementation
}

查询参数将来自这些值:

cmd.Parameters.AddWithValue("@p1", subjectId);
cmd.Parameters.AddWithValue("@p3", languageId);

每当用户调用此功能时,调用它的代码只会提供这些值,而不是将它们存储在全局集合中。

一般而言,避免全球价值观。 特别是在具有多个并发用户的多线程应用程序中。