我在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);
}
}
答案 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);
每当用户调用此功能时,调用它的代码只会提供这些值,而不是将它们存储在全局集合中。
一般而言,避免全球价值观。 特别是在具有多个并发用户的多线程应用程序中。