C#使用switch case将值插入数据库
我试图使用开关盒将值插入数据库。在某些情况下,可能需要为特定情况插入多个值。我无法插入与案例对应的两个值C#使用switch case将值插入数据库,c#,C#,我试图使用开关盒将值插入数据库。在某些情况下,可能需要为特定情况插入多个值。我无法插入与案例对应的两个值 foreach (int thisColor in allColors) { List<Subject> subjectsForThisColor = subjects.Where(x => x.Color == thisColor).ToList(); foreach (Subject s in subjectsForThisColor) {
foreach (int thisColor in allColors)
{
List<Subject> subjectsForThisColor = subjects.Where(x => x.Color == thisColor).ToList();
foreach (Subject s in subjectsForThisColor)
{
test += s.SubjectName + " -" + s.Color + "\n";
switch (s.Color)
{
case 1:
con.Open();
SqlCommand cmd = new SqlCommand("INSERT INTO Monday (first) values (@first)",con);
cmd.Parameters.AddWithValue("first",s.SubjectName);
cmd.ExecuteNonQuery();
con.Close();
break;
case 2:
con.Open();
SqlCommand cmd1 = new SqlCommand("UPDATE Monday set [second] = @second", con);
cmd1.Parameters.AddWithValue("second", s.SubjectName);
cmd1.ExecuteNonQuery();
con.Close();
break;
case 6:
con.Open();
SqlCommand cmd6 = new SqlCommand("UPDATE Monday set [sixth] = @sixth", con);
cmd6.Parameters.AddWithValue("sixth", s.SubjectName);
cmd6.ExecuteNonQuery();
con.Close();
break;
}
}
}
因此,当我遇到案例6时,我需要插入值
optional-2
和optional-5
。现在我只能插入可选-5。我将使用带有可选参数的存储过程。让我们先清理一下代码,使其更易于重用:
foreach (int thisColor in allColors)
{
List<Subject> subjectsForThisColor = subjects.Where(x => x.Color == thisColor).ToList();
foreach (Subject s in subjectsForThisColor)
{
test += s.SubjectName + " -" + s.Color + "\n";
switch (s.Color)
{
case 1:
updateOneRow("Monday", "first", s.SubjectName, null);
break;
case 2:
updateOneRow("Monday", "second", s.SubjectName, null);
break;
case 6:
updateOneRow("Monday", "sixth", s.SubjectName, null);
break;
}
}
}
这将有助于清理您的代码,至于您为什么会获得optional-5
,这是因为您在案例6中使用了UPDATE
SQL语句,而不是INSERT
。Update将覆盖表中以前的值,并替换与where子句匹配的所有当前值,而您没有where子句。因此,表中的所有值都将被覆盖。我认为你应该写INSERT
,而不是UPDATE
[编辑]
我不喜欢它,但更新了代码以满足您的期望。您可能需要对其进行调试,但应该给出想法。它检查行是否已经存在,如果不存在,则执行插入。如果存在,则检查列中是否有值,如果存在,则将其添加到要插入的新值中。然后它进行更新
希望有帮助
最终警告
这段代码远不是完美的,但我希望它将引导您朝着正确的方向进行一些稍微更好的编码实践。祝你好运
此外,这并不是数据库的最佳设计,您应该以不同的方式进行设计
[OP的代码]
case 6:
con.Open();
string query = "SELECT count ( sixth ) FROM Monday ";
SqlCommand cmd3 = new SqlCommand(query, con);
Int32 count = (Int32)cmd3.ExecuteScalar();
if (count == 0)
{
cmd = new SqlCommand("INSERT INTO Monday (sixth) values (@value)", con);
}
else
{
query = "SELECT top 1 sixth FROM Monday";
cmd = new SqlCommand(query, con);
string dbValue = (string)cmd.ExecuteScalar();
if (dbValue != null && dbValue != string.Empty)
{
value += ";" + dbValue;
//value += s.SubjectName;
//cmd = new SqlCommand("UPDATE Monday set [sixth] = @value", con); <-This is in the wrong place
}
cmd = new SqlCommand("UPDATE Monday set [sixth] = @value", con);//Should be here
}
cmd.Parameters.AddWithValue("value",value);
cmd.ExecuteNonQuery();
con.Close();
break;
你应该从在代码中使用方法开始,而不是制作大量重复的代码。我不理解这个问题,但这段代码很糟糕。你为什么需要这些重复的代码?当然。这种情况发生在您身上,因为在案例6中,您没有插入,而是在更新。因此,如果首先用
optional-2
更新值,然后用optional-5
@ZoharPeled更新值,我知道存在重复代码。我不知道如何用有效的逻辑来解决我的问题。我的问题是:我需要在表中插入一组值。这些值基于颜色值。假设我遇到的颜色为1,我需要插入与之对应的主题,即C#。类似地,当我遇到颜色6时,我需要使用optional-2和optional-5插入/更新表。希望我解释得更好。好的,最后一次尝试。在案例1中,您插入一条记录,其中主题名为C
,然后在案例2中,您将该值更改为SSM
。然后你会发现2个案例6。在第一个示例中,您将该值更改为optional-2
,在第二个示例中更改为optional-6
,请您举例说明,因为我没有使用存储过程?作为注释比answer@Thorarins,有没有办法用当前的逻辑来实现这一点?@Hexadron,您可以提供一些代码示例,并解释为什么存储过程有助于解决问题。注意到您在一种情况下使用insert语句,在另一种情况下使用update,UPDATING我不想使用第二条insert语句,因为在开始时,值为null,我只想更新null值。我也不想使用多个语句,因为对于未来的操作,我只需要表中的一行数据。我基本上想知道,如果一个案例中遇到多个SubjectName,如何插入SubjectName(如案例6和案例8所示)那么您希望表中只有一行,但希望特定值多次出现?我觉得你在用一种有点糟糕的方式制作表格,如果你有3个值需要插入,你会怎么做?无法通过编程增加列数,是否希望在同一单元格中用逗号分隔?为什么这张表中只需要一行?在第一条语句中,如果多次重新运行此代码,将得到多行
public void updateOneRow(string tableName, string columnName, string value){
con.Open();
query = "SELECT count ("+columnName+") FROM "+tableName;
SqlCommand cmd = New SqlCommand(query, con);
Int32 count = (Int32)cmd.ExecuteScalar();
if(count == 0){
cmd = new SqlCommand("INSERT INTO " + tableName + "("+columnName+") values (@value)"),con);
}
else{
query = "SELECT top 1 "+columnName+" FROM "+tableName;
cmd = New SqlCommand(query, con);
string dbValue = (string)cmd.ExecuteScalar();
if (dbValue != null && dbValue != string.Empty)
value += ";"+dbValue;
cmd = new SqlCommand("UPDATE " + tableName + " set ["+columnName+"] = @value", con);
}
cmd.Parameters.AddWithValue("value",value);
cmd.ExecuteNonQuery();
con.Close();
}
case 6:
con.Open();
string query = "SELECT count ( sixth ) FROM Monday ";
SqlCommand cmd3 = new SqlCommand(query, con);
Int32 count = (Int32)cmd3.ExecuteScalar();
if (count == 0)
{
cmd = new SqlCommand("INSERT INTO Monday (sixth) values (@value)", con);
}
else
{
query = "SELECT top 1 sixth FROM Monday";
cmd = new SqlCommand(query, con);
string dbValue = (string)cmd.ExecuteScalar();
if (dbValue != null && dbValue != string.Empty)
{
value += ";" + dbValue;
//value += s.SubjectName;
//cmd = new SqlCommand("UPDATE Monday set [sixth] = @value", con); <-This is in the wrong place
}
cmd = new SqlCommand("UPDATE Monday set [sixth] = @value", con);//Should be here
}
cmd.Parameters.AddWithValue("value",value);
cmd.ExecuteNonQuery();
con.Close();
break;
The parameterized query '(@value nvarchar(4000))INSERT INTO Monday (sixth) values (@value' expects the parameter '@value', which was not supplied.