【发布时间】:2016-07-23 16:10:27
【问题描述】:
这有点难以解释,所以请多多包涵。
我通过控制台 c# 使用 sql 表。
我正处于最终用户需要能够做到的地步修改主键值,例如教室名称
当用户尝试编辑已经存在的主键值时,第一次循环 sql / c# catches 并给出 Exception 并且程序继续为正常将其循环回用户输入重复主键值的部分。
但是,当您再次尝试添加数据并碰巧添加一个已经作为主键值存在的值时,它不会t catch 第二轮。
这是一个时间表。
- 进入新组菜单
- 更新组名称的详细信息,但该组名称已经
存在,因此它告诉最终用户再试一次并将它们循环回
要求添加新组的部分
- 最终用户添加正确的详细信息并继续使用
节目
- 稍后最终用户尝试更新组的详细信息并添加一个已经存在的名称,但是这一次它不会引发
Exception,而是在不应该的时候继续工作。
这是上面提到的循环背后的代码。
更新:添加所有模块以回答下面的一些 cmets。
static void editTable()
{
int j = 0;
top:
SQLCONN.Open();
var TIME = DateTime.Now;
SqlCommand cmd0 = new SqlCommand("SELECT * FROM dbo."+selectedDayTableToEdit+"Table", SQLCONN);
SqlDataReader reader = cmd0.ExecuteReader();
while (reader.Read())
{
int n = 1;
int p = 1;
Console.WriteLine("------------------------------------------------------------");
Console.WriteLine(" [" + reader.GetValue(n).ToString() + " TIMES] [TEACHER / CLASSROOM] {0} " + TIME.ToString("HH:mm:ss"), selectedDayTitle);
Console.WriteLine("------------------------------------------------------------");
for (int i = 2; i < reader.FieldCount; i++)
{
Console.WriteLine(p +" - " + reader.GetName(i) + " " + reader.GetValue(i));
p++;
}
}
SQLCONN.Close();
repeat:
Console.WriteLine();
Console.WriteLine("Which group would you like to edit?");
string Group = Console.ReadLine().ToUpper();
Console.WriteLine("Enter {0}'s new group name if any", Group);
string newGroup = Console.ReadLine().ToUpper();
if (string.IsNullOrEmpty(newGroup))
{
check = true;
newGroup = string.Format("{0}", Group);
}
else
{
check = false;
}
SQLCONN.Open();
//update Group Name (SAT)
try
{
if(check == false)
{
using (SqlCommand cmd = new SqlCommand("UPDATE " + selectedDayTableToEdit + "Table SET CLASSNAME=@CLASSNAME where CLASSNAME=@" + Group, SQLCONN))//2nd @ what its looking for.
{
cmd.Parameters.AddWithValue("@CLASSNAME", newGroup);
cmd.Parameters.AddWithValue("@" + Group, Group);
cmd.ExecuteNonQuery();
Console.WriteLine("Database Updated...");
}
}
}
catch (Exception)
{
Console.WriteLine();
Console.WriteLine("That group already exists");
Console.ReadKey();
SQLCONN.Close();
goto repeat;
}
SQLCONN.Close();
Console.WriteLine();
Console.WriteLine("Which time would you like to edit for group {0}?", newGroup);
string RESULT = Console.ReadLine();
string ClassTime = "";
switch (RESULT)
{
case "1":
ClassTime = "09:00-09:40";
break;
case "2":
ClassTime = "10:10-10:50";
break;
case "3":
ClassTime = "11:00-11:40";
break;
case "4":
ClassTime = "11:50-12:30";
break;
case "5":
ClassTime = "12:40-13:20";
break;
case "6":
ClassTime = "13:30-14:10";
break;
case "7":
ClassTime = "14:20-15:00";
break;
case "8":
ClassTime = "15:10-15:50";
break;
case "9":
ClassTime = "16:00-16:40";
break;
case "10":
ClassTime = "16:50-17:30";
break;
case "11":
ClassTime = "17:40-18:20";
break;
case "12":
ClassTime = "18:30-19:10";
break;
case "13":
ClassTime = "19:20-20:00";
break;
default:
Console.WriteLine("A time was not selected...");
Console.WriteLine("Returning to main menu");
Console.ReadKey();
menu();
break;
}
//Console.WriteLine("Enter the current teacher and classroom for {0}", newGroup); // DONT NEED THIS ANYMORE??
//string teacherandclassroom = Console.ReadLine().ToUpper();
Console.WriteLine(string.Format("Enter the new teacher and classroom number for group {0} at {1} ", newGroup, ClassTime));
string newTeacherClassRoom = Console.ReadLine().ToUpper();
SQLCONN.Open();
try
{
using (SqlCommand cmd1 = new SqlCommand("UPDATE "+selectedDayTableToEdit+"Table SET [" + ClassTime + "] = @newValue WHERE [CLASSNAME] =@" + newGroup, SQLCONN)) //or WHERE newGroup?
{
cmd1.Parameters.AddWithValue("@newValue", newTeacherClassRoom); //@ can be whatever as long as its the same as the queries
cmd1.Parameters.AddWithValue("@" + newGroup, newGroup);
cmd1.ExecuteNonQuery();
Console.WriteLine("Database Updated...");
}
SQLCONN.Close();
Console.ReadKey();
menu();
}
catch (SqlException)
{
SQLCONN.Close();
Console.Clear();
Console.WriteLine("ERROR UPDATING RECORDS....");
Console.ReadKey();
Console.Clear();
if (j == 1)
{
menu();
}
else
{
j++;
goto top;
}
}
}
更新
此后,我使用整数添加了 ID 主键并删除了 GC
感谢大家的评论和对我应该做什么的建议,非常感谢!
问题与check 布尔值,感谢所有指出这一点的人。
【问题讨论】:
-
您应该尽量避免使用您足够关心并希望在未来的数据库设计中更改它的主键值。在进行更新时会产生各种令人头疼的问题。
-
我会记住这一点@LasseV.Karlsen :) 对于这个数据库,用户不会在日常基础上更改主键值,这只是为了他们的机会做。
-
@Werdna 。 . .您应该将标识列作为主键,并将名称作为属性。您可以在名称上创建唯一约束以确保没有重复。
-
上面的代码不应该出现上述问题。这里有一些不同的东西。 (但是,使用您计划能够修改的字段作为 PrimaryKey 确实是一种不好的做法,而且很少有道理)
-
再次尝试
check的价值是多少?我看到您只有在遇到异常时才跳转到repeat。如果你没有得到一个怎么办?check的初始值是多少?